2015-02-08 23 views
6

Ben java yeniyim ve bir program yapmaya karar verdi: click sol penceresinde bir noktayı belirler. Ve sonra tekrar tıkladığınızda başka bir nokta. Ve daha neler ... Sonra bir çizginin bir tarafında kaç puan bağlı çizgileri ile tüm noktaları katılır ve hattın bir tarafını gölgelendirir (bu şekilde) enter image description hereŞeffaflık - Java JFrame

SORU BURADA BAŞLIYOR:.

Şimdi bir başka özelliğe ihtiyacım var. Sağ tıkladığımda, faredeki pikselin saydamlığının görünmesini istiyorum. Bu yüzden ortada tıklandığında, ışık alanlarına sağ tıkladığımdan daha şeffaf (veya daha karanlık) olduğunu göstereceğim.

Bazı googling ama lazım answer.The yakın bulamadık robotla bir ekran görüntüsü oluşturmak ve bufferimage olarak ve daha sonra bu şekilde pikselleri analiz kullanan oldu yaptı. Ancak, sağ tıklamaya çalıştığım yerden beri çalışmıyorum, ARGB için 255,255,255,255 aldım. Ve bazen AGBA için 255,234,236,245 gibi garip şeyler.

Ne yapmaya çalışıyorum takip edebilirsiniz Umut.

İşte benim kod. programı yıldızlar

My Ana sınıfı penceresi oluşturur ve fare arabirimi yapar: gölgeleme ve çizgi çizimi vb ile ilgilenen

import javax.swing.*; 

import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 

public class mouse { 
static DataTransfer data = new DataTransfer(); 
private static int x,y ; 
private static draw object = new draw(); 
public static int numPoints = 0; 
public static final int maxPoints = 4; 

public static void main(String[] args) throws Exception { 

     JFrame frame = new JFrame(); 
     Robot robot = new Robot(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setTitle("Drawing"); 
     frame.setSize(500, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.add(object); 

     data.getRobot(robot,frame.getSize()); 
     object.addMouseListener(new AL()); 
} 


public static class AL extends MouseAdapter { 


    public void mouseClicked(MouseEvent e){ 


     if (e.getButton() == MouseEvent.BUTTON1) 
     { 
      if (numPoints < maxPoints){ 
      x = e.getX(); 
      y = e.getY(); 
      object.drawing(x,y,numPoints); 
      System.out.println("NUMBRER"+numPoints); 
      numPoints++; 
      } 
     } 
     if (e.getButton() == MouseEvent.BUTTON3) 
     { 
      x = e.getX(); 
      y = e.getY(); 

      int pixel = data.getScreen().getRGB(x, y); 

      int alpha = (pixel >> 24) & 0xff; 
      int red = (pixel >> 16) & 0xff; 
      int green = (pixel >> 8) & 0xff; 
      int blue = (pixel) & 0xff; 
      System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue); 


     } 



    } 

} 
// Here I tried to access the Robot in the mouse class, but I couldn't so I had to create this transition class in hope of it working 
public static class DataTransfer{ 

    BufferedImage screen ; 
    public void getRobot(Robot robot,Dimension size) 
    { 
     screen = robot.createScreenCapture(new Rectangle(size)); 
    } 
    public BufferedImage getScreen(){ 
     return screen; 
    } 

} 
} 

Ve Graphics sınıfı ... (bunun çoğu için tekerrür o çizilmiş olan bir kez birine sahip olmadığı için gölgeleme her durumda, bu nedenle, bir pikselin şeffaflık anlatmak oldukça zordur)

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 


@SuppressWarnings("serial") 
public class draw extends JPanel { 
    int[] polX = new int[5]; 
    int[] polY = new int[5]; 
    int[] aX = new int[mouse.maxPoints]; 
    int[] aY = new int[mouse.maxPoints]; 
    float m, c; 
    int corners; 
    //float triAng = 30; 
    float triAng = 255/(((mouse.maxPoints)*(mouse.maxPoints + 1))/2); 
    public void drawing(int xx, int yy, int Number) { 
     aX[Number] = xx; 
     aY[Number] = yy; 
     repaint(); 

    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(new Color(0,255,0,255)); 

     g.setColor(new Color(255,0,0,(int)triAng)); 


     for(int i=0; i<mouse.numPoints;i++){ 

      for(int j = i+1; j < mouse.numPoints; j++) 
      { 

       // Shading the area 
       //1) finding the equation of the line 

       if(aX[i] != aX[j]){ 

        if(aY[i] != aY[j]){ 

         //Work out the Gradient 
         m = (float)(aY[j] - aY[i]) /(aX[j] - aX[i]); 
         c = ((float)aY[i]-(((float)aX[i])*m)); 
         for(int k=0;k<mouse.numPoints;k++){ 
         if(m<0){ 
          //Gradient is negative 
           if(k!= i && k!=j){ 

            //Below 
            if(aX[k]*m+c < aY[k]){ 
             //Clockwise from origin 
             // Left Right 
             // N - no additional corner 
             // Y- Additional Corner 

             // N N 
             if((c >= 400) && (500*m+c) >= 0) { 
              polX[1] = (int)((400-c)/m); 
              polY[1] = 400; 
              polX[2] = 500; 
              polY[2] = (int)(500*m+c); 
              corners = 3; 

             } 

             // N Y 
             else if(c >= 400 && (500*m+c) < 0) { 
              polX[1] = (int)((400-c)/m); 
              polY[1] = 400; 
              polX[2] = (int)((0-c)/m); 
              polY[2] = 0; 
              polX[3] = 500; 
              polY[3] = 0; 
              corners = 4; 
             } 
             // Y N 
             else if(c < 400 && (500*m+c) >= 0) { 
              polX[1] = 0; 
              polY[1] = 400; 
              polX[2] = 0; 
              polY[2] = (int)c; 
              polX[3] = 500; 
              polY[3] = (int)(500*m+c); 
              corners = 4; 
             } 
             // YY 
             else if(c < 400 && (500*m+c) < 0){ 
              polX[1] = 0; 
              polY[1] = 400; 
              polX[2] = 0; 
              polY[2] = (int)c; 
              polX[3] = (int)((0-c)/m); 
              polY[3] = 0; 
              polX[4] = 500; 
              polY[4] = 0; 
              corners = 5; 
             } 
             //Origin corners 
             polX[0] = 500; 
             polY[0] = 400; 


             g.fillPolygon(polX, polY, corners); 
            } 
            //I am here 
            ///////////////Above 
            if(aX[k]*m+c > aY[k]){ 
             //Clockwise from origin 
             // Left Right 
             // N - no additional corner 
             // Y- Additional Corner 

             // N N 
             if((c <= 400) && (500*m+c) <= 0) { 
              polX[1] = (int)((0-c)/m); 
              polY[1] = 0; 
              polX[2] = 0; 
              polY[2] = (int)(c); 
              corners = 3; 

             } 

             // N Y 
             else if(c <= 400 && (500*m+c) > 0) { 
              polX[1] = 500; 
              polY[1] = 0; 
              polX[2] = 500; 
              polY[2] = (int)(500*m+c); 
              polX[3] = 0; 
              polY[3] = (int)c; 
              corners = 4; 
             } 
             // Y N 
             else if(c > 400 && (500*m+c) <= 0) { 
              polX[1] = (int)((0-c)/m); 
              polY[1] = 0; 
              polX[2] = (int)((400-c)/m); 
              polY[2] = 400; 
              polX[3] = 0; 
              polY[3] = 400; 
              corners = 4; 
             } 
             // Y Y 
             else if(c > 400 && (500*m+c) > 0){ 
              polX[1] = 500; 
              polY[1] = 0; 
              polX[2] = 500; 
              polY[2] = (int)(500*m+c); 
              polX[3] = (int)((400-c)/m); 
              polY[3] = 400; 
              polX[4] = 0; 
              polY[4] = 400; 
              corners = 5; 
             } 
             //Origin corners 
             polX[0] = 0; 
             polY[0] = 0; 


             g.fillPolygon(polX, polY, corners); 
            } 
           } 
          } 

/////////////////////////////////////////////////////////////////////////////////////////////// 
         if(m>0){ 
          //Gradient is Positive 
           if(k!= i && k!=j){ 

            //Below 
            if(aX[k]*m+c < aY[k]){ 
             //Clockwise from origin 
             // Left Right 
             // N - no additional corner 
             // Y- Additional Corner 

             // N N 
             if((c >= 0) && (500*m+c) >= 400) { 
              polX[1] = 0; 
              polY[1] = (int)c; 
              polX[2] = (int)((400-c)/m); 
              polY[2] = 400; 
              corners = 3; 

             } 

             // N Y 
             else if(c >= 0 && (500*m+c) < 400) { 
              polX[1] = 0; 
              polY[1] = (int)c; 
              polX[2] = 500; 
              polY[2] = (int)(500*m+c); 
              polX[3] = 500; 
              polY[3] = 400; 
              corners = 4; 
             } 
             // Y N 
             else if(c < 0 && (500*m+c) >= 400) { 
              polX[1] = 0; 
              polY[1] = 0; 
              polX[2] = (int)((0-c)/m); 
              polY[2] = 0; 
              polX[3] = (int)((400-c)/m); 
              polY[3] = 400; 
              corners = 4; 
             } 
             // Y Y 
             else if(c < 0 && (500*m+c) < 400){ 
              polX[1] = 0; 
              polY[1] = 0; 
              polX[2] = (int)((0-c)/m); 
              polY[2] = 0; 
              polX[3] = 500; 
              polY[3] = (int)(500*m+c); 
              polX[4] = 500; 
              polY[4] = 400; 
              corners = 5; 
             } 
             //Origin corners 
             polX[0] = 0; 
             polY[0] = 400; 


             g.fillPolygon(polX, polY, corners); 
            } 
            ///////////////Above 
            if(aX[k]*m+c > aY[k]){ 
             //Clockwise from origin 
             // Left Right 
             // N - no additional corner 
             // Y- Additional Corner 

             // N N 
             if((c <= 0) && (500*m+c) <= 400) { 
              polX[1] = 500; 
              polY[1] = (int)(500*m+c); 
              polX[2] = (int)((0-c)/m); 
              polY[2] = 0; 
              corners = 3; 

             } 

             // N Y 
             else if(c <= 0 && (500*m+c) > 400) { 
              polX[1] = 500; 
              polY[1] = 400; 
              polX[2] = (int)((400-c)/m); 
              polY[2] = 400; 
              polX[3] = (int)((0-c)/m); 
              polY[3] = 0; 
              corners = 4; 
             } 
             // Y N 
             else if(c > 0 && (500*m+c) <= 400) { 
              polX[1] = 500; 
              polY[1] = (int)(500*m+c); 
              polX[2] = 0; 
              polY[2] = (int)c; 
              polX[3] = 0; 
              polY[3] = 0; 
              corners = 4; 
             } 
             // Y Y 
             else if(c > 0 && (500*m+c) > 40){ 
              polX[1] = 500; 
              polY[1] = 400; 
              polX[2] = (int)((400-c)/m); 
              polY[2] = 400; 
              polX[3] = 0; 
              polY[3] = (int)c; 
              polX[4] = 0; 
              polY[4] = 0; 
              corners = 5; 
             } 
             //Origin corners 
             polX[0] = 500; 
             polY[0] = 0; 


             g.fillPolygon(polX, polY, corners); 
            } 
           } 
          } 
         } 

        } 

        else{ 
         //code for horizontal line 
        } 


       } 

       else{ 
        //Vertical 

       } 




      } 
      } 

     g.setColor(new Color(0,255,0,255)); 
     for(int i=0; i<mouse.numPoints; i++){ 
      g.fillOval(aX[i] - 10,aY[i]-10,20,20); 
     } 


     // Drawing The Line ////// 
     for(int i=0; i<mouse.numPoints;i++){ 

      for(int j = i+1; j < mouse.numPoints; j++){ 
       g.setColor(new Color(0,255,0,255)); 
       g.drawLine(aX[i], aY[i], aX[j], aY[j]); 
       g.setColor(new Color(255,0,0,(int)triAng)); 

      } 
     } 
    } 
    } 

cevap

1

şeyi okumak gerekmez ...

Belirli bir arka plan üzerinde belli bir alfa belli bir renk çizmek:

şeffaflık sadece bir pikseli çizerken, çalışır.

kolayca bir pikselden rgb değerler elde edebilirsiniz
  • (zaten içinde bu kod var: Sonuç, piksel kendisi

    ne varsa ... artık çizilmiş edildikten sonra hiç alfa vardır kodunuzda) ....
  • Ayrıca, tipik olarak (Color.RED gibi) kullandığınız çizim rengini de alabilirsiniz ....
  • Ayrıca, arka zemin rengi kullanımı da elde edebilirsiniz (Color.WHITE gibi) Eğer 012 yapman gerekeni) ....
  • Eğer hesapla alfa değeri zorunda yukarıdaki verileri kullanılarak! örneğin

: kırmızı piksel (orijinal 0xFF0000) beyaz üzerine 0x7F0000 olan (0xFFFFFF) arkaplan mutlaka ... Eğer

ama burada benim bilgi yoksun 0x7F (% 50) bir şeffaflık var demektir şeffaflık için kendi hesaplamaları kadar yapabilir, gerçekten bu kadar ^^

umut