2014-02-05 62 views
0

我目前正在製作繪畫應用程序,目前正在實施橡膠工具。由於我使用的canvas(JPanel)具有透明背景(打算),所以我不能只調用g2d.fillOval(x,y,x,y),因爲它會畫一個透明的圓,之前會留在那裏。因此,我決定使用WritableRaster,它的setPixel方法用於形成像素繪製成圓形的整體「形狀」的兩個for循環(每個切線上的r相同)。但是,我在調用setPixel方法時遇到問題,因爲它沒有繪製任何東西。我甚至將顏色設置爲黑色來測試它,而不是任何東西。我一直在篡改它並插入打印狀態,並將其縮小到塊的最內層,因爲打印方法不會輸出到控制檯。光柵停止處理無出錯

這裏是我的代碼

WritableRaster raster = (WritableRaster) bi.getData(); 
Integer[] arrayw = al.get(i); 

Point p1 = new Point(arrayw[0], arrayw[1]); 
Point p2 = new Point(arrayw[2], arrayw[3]); 
int[] black = new int[]{0, 0, 0}; 
int r = tl.get(i); 

for (int y = p1.y - r; y < r; y++) { 
    int bound = (int) (Math.sqrt(r * r - y * y) + 0.5); 
    for (int x = p1.x - bound; x < bound; x++) { 
     raster.setPixel(x, y, black); 
     gc.drawLine(x, y, x, y); 
     System.out.println(y + "\t" + x + "\t" + tl.get(i)); 

    } 
} 
for (int y = p2.y - r; y < r; y++) { 
    int bound = (int) (Math.sqrt(r * r - y * y) + 0.5); 
    System.out.print("test"); 

    for (int x = p2.x - bound; x < bound; x++) { 
     raster.setPixel(x, y, black); 
     gc.drawLine(x, y, x, y); 
     System.out.println(y + "\t" + x + "\t" + tl.get(i)); 
    } 
} 


System.out.print("raster"); 
bi.setData(raster); 

正如我前面所說的,代碼打印光柵,但內內不打印塊。我不知道我做錯了什麼。感謝您的幫助!

+1

您是否驗證過內部塊的條件是否滿足?例如,如果'x'總是大於或等於'p1.x - bound',那麼是否有'x 2 * bound',你的內部循環永遠不會被調用。 –

+0

@NathanielJones謝謝你,你是對的。我得到了它的工作。 – gedr

回答

1

您是否驗證過內部塊的條件是否滿足?

例如,x < bound如果x始終大於或等於p1.x - bound是否爲真?如果p1.x > 2 * bound,你的內部循環永遠不會被調用。