2013-05-29 67 views
0

好親愛的夥計,我有這個問題,我真的不知道解決它的某種方法。 我在做像Java中的「繪圖應用程序」,我知道一切都準備好了,但我需要用計算機圖形算法繪製形狀。如何處理用像對象一樣的算法繪製的形狀?

所以,事情是,一旦形狀被繪製在容器中,我怎麼能把它轉換成一種「對象」,以便能夠選擇形狀並移動它(我必須用另一種算法來移動它)我只想知道我怎麼知道點擊屏幕上的一些隨機點屬於一個對象,知道我可以用算法填充它。

我在想,有一個點類,形狀類,如果我在屏幕上點擊,得到的座標和所有的形狀和自己的觀點審視內心,但是這可能不是非常有效。 任何想法傢伙? 感謝您的幫助。 下面是我的一些代碼:

public class Windows extends JFrame{ 

private JPanel panel; 
private JLabel etiqueta,etiqueta2; 
public Windows() { 
    initcomp(); 
} 
public void initcomp() 
{ 
    panel = new JPanel(); 
    panel.setBounds(50, 50, 300, 300); 
    etiqueta = new JLabel("Circulo Trigonometrico"); 
    etiqueta.setBounds(20, 40, 200, 30); 
    etiqueta2 = new JLabel("Circulo Bresenham"); 
    etiqueta2.setBounds(150, 110, 200, 30); 

    panel.setLayout(null); 
    panel.add(etiqueta); 
    panel.add(etiqueta2); 
    panel.setBackground(Color.gray); 
this.add(panel); 
    this.setLayout(null); 
    this.setVisible(true); 
    this.setSize(400,400); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 
public void paint(Graphics g){ 
    super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.red); 
     g2d.setStroke(new BasicStroke(2)); 

     dibujarCirculo_bresenham(g2d, 50, 260, 260); 
     dibujarCirculo_trigonometrico(g2d, 50, 130, 200); 
} 
/*This functions paints a Circle*/ 
public void dibujarCirculo_trigonometrico(Graphics g,int R,int xc,int yc) 
{ 

     int x,y; 
     for (int i = 0; i < 180; i++) { 
     double angulo = Math.toRadians(i); 
     x = (int) (Math.cos(angulo)*R); 
     y = (int) (Math.sin(angulo)*R); 
     g.drawLine(x+xc, y+yc, x+xc, y+yc); 
     g.drawLine((-x+xc), (-y+yc), (-x+xc), (-y+yc)); 
    } 
} 
+1

寫每個CG算法到它的自己的對象,具有位置和大小等屬性,然後可以根據需要進行控制。這些可以從'JPanel'或自包含到您的「繪圖」容器,它知道如何與它們交互 – MadProgrammer

+0

我試過這個並得到這個錯誤: 線程「main」異常java.lang.NullPointerException \t at java.awt.Container.addImpl(未知來源) \t在java.awt.Container.add(未知來源) \t在Lienzo.initcomp(Lienzo.java:30) \t在Lienzo。 (Lienzo.java:14) \t在Lienzo.main(Lienzo。java:42) – user2430929

+0

沒有源代碼,它不可能提出可能的解決方案 – MadProgrammer

回答

0

我認爲任何圖像是有效的(不限制於一組特定的形狀)。要獲得具有類似屬性的連續區域,請嘗試使用flood fill

enter image description here

顏色或左右移動特定的形狀,可以用顏色填充,以確定該組像素,並相應地操縱集。你可以爲相似的色調等設置一個容差,以便它不像Paint那樣嚴格,並且變得更像Photoshop中的魔術選擇工具。

0

有一對夫婦的方法取決於正是你想要的東西拿在這裏。

1)是有目的,一個用於在屏幕上繪製的每個事,與像圓和矩形和多邊形等類。他們會定義像paint這樣的方法(如何在屏幕上繪製它們),isCLickInsideOf(這個形狀包含的屏幕上的點擊點,給定的大小/位置等等)等等。然後,重畫屏幕繪製每個對象,並測試一個對象是否被點擊以詢問每個對象的想法。

2),如果對象在顏色是均勻的財產,你可以抓住組成的形狀,當用戶通過使用floodfill算法點擊像素之一的所有像素。然後,您可以將它們加載到某種數據結構中,並在用戶移動鼠標時將它們移動,等等。另外,如果每個對象都保證具有唯一的顏色,那麼您可以通過僅查找來測試哪個對象正在被點擊在顏色。 (如OpenGL庫使用了一招這樣有時來確定對象,你點擊了什麼 - 繪製每個對象爲隱藏幀在平坦的顏色和鼠標指針下測試什麼像素色彩)

+0

感謝您的幫助,我嘗試了第一個選項,創建一個名爲Figure(從jpanel擴展而來)的普通類,以及其他名爲Circle的類,但是我不能將這個對象添加到我的JPanel中,我得到這個錯誤。 異常在線程 「主」 顯示java.lang.NullPointerException \t在java.awt.Container.addImpl(未知來源) \t在java.awt.Container.add(未知來源) \t在Lienzo.initcomp(Lienzo.java :30) \t at Lienzo。 (Lienzo.java:14) \t at Lienzo.main(Lienzo.java:42) 那麼,如何將我的對象添加到我的JPanel? – user2430929

+0

@ user2430929檢查代碼中的空值(默認情況下,所有變量均爲空,並且所有數組條目默認爲空) – Patashu