2017-01-01 125 views
0

我無法找到解決此問題的解決方案。 我想繪製一個用Java填充的三角形,每個角落都有不同的顏色。事情是這樣的:用Java中的3色漸變填充三角形

enter image description here

我發現了一些網上的帖子,但我無法弄清楚如何做梯度的Java。問題是,在Java中,只能從一種顏色到另一種顏色執行GradientPaint,這不適合填充三角形。

到目前爲止,我想出了這個代碼不按預期方式工作:

triangle.p1().getValue(); 
Color color1 = calculateColor(triangle.p1().getValue()); 
Color color2 = calculateColor(triangle.p2().getValue()); 
Color color3 = calculateColor(triangle.p3().getValue()); 
Color transparent = new Color(0, 0, 0, 0); 
Polygon polygon = new Polygon(
     new int[]{(int) triangle.p1().x(), (int) triangle.p2().x(), (int) triangle.p3().x()}, 
     new int[]{(int) triangle.p1().y(), (int) triangle.p2().y(), (int) triangle.p3().y()}, 
     3); 
GradientPaint gradient1 = new GradientPaint(
     (float) triangle.p1().x(), (float) triangle.p1().y(), color1, 
     (float) triangle.p2().x(), (float) triangle.p2().y(), transparent); 
GradientPaint gradient2 = new GradientPaint(
     (float) triangle.p2().x(), (float) triangle.p2().y(), color2, 
     (float) triangle.p3().x(), (float) triangle.p3().y(), transparent); 
GradientPaint gradient3 = new GradientPaint(
     (float) triangle.p3().x(), (float) triangle.p3().y(), color3, 
     (float) triangle.p1().x(), (float) triangle.p1().y(), transparent); 
graphics2d.setPaint(gradient1); 
graphics2d.fill(polygon); 
graphics2d.setPaint(gradient2); 
graphics2d.fill(polygon); 
graphics2d.setPaint(gradient3); 
graphics2d.fill(polygon); 

這是我得到的結果是:points A and B have the same color but the triangles adjacent to AB have different color

提及類似的事情,某些線程: Triangle Gradient With Core GraphicsJava 3 Color Gradient

+0

你有什麼問題?你有一個很好的解釋,即使是一些示例代碼。有沒有錯誤?是你的代碼(請張貼一些)不工作?或者你陷入了一個特定的細節?請更具體一點。 – n247s

+0

我更新了問題描述並添加了一些代碼。 – matomato

+0

你用這段代碼得到了什麼結果,你可以添加一個當前結果的屏幕截圖嗎? (我的葡萄牙人會在三角形的中間插入白色的?) – n247s

回答

1

這是基於這樣的想法,如果你選擇三角形內的任何顏色,它將從三角形的三個點中創建三個區域。因此,我們延伸了線性插值原理

color=(distance to p1)/(distance p1, p2)*c1+(distance to p2)/distance(p1, p2)*c2; 

到2-D平面。因此,加權係數將是區域:

public int areaTriangle(int x1, int y1, int x2, int y2, int x3, int y3) { 
    return (int)(0.5*Math.abs((x1-x3)*(y2-y1)-(x1-x2)*(y3-y1))); 
} 

BufferedImage b=new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB); 
Polygon pl=new Polygon(); 
pl.addPoint(100, 100); pl.addPoint(200, 150); pl.addPoint(150, 200); 
Rectangle r=pl.getBounds(); 
int a=areaTriangle(pl.xpoints[0], pl.ypoints[0], pl.xpoints[1], pl.ypoints[1], pl.xpoints[2], pl.ypoints[2]); 
int[] c1={255, 0, 0}, c2={0, 255, 0}, c3={0, 0, 255}; 
for(i=0; i<r.width; i++) 
for(j=0; j<r.height; j++) 
    if(pl.contains(r.x+i, r.y+j)) { 
    int ix=r.x+i, jy=r.y+j; 
    int a1=areaTriangle(ix, jy, pl.xpoints[0], pl.ypoints[0], pl.xpoints[1], pl.ypoints[1]); 
    int a2=areaTriangle(ix, jy, pl.xpoints[0], pl.ypoints[0], pl.xpoints[2], pl.ypoints[2]); 
    int a3=areaTriangle(ix, jy, pl.xpoints[1], pl.ypoints[1], pl.xpoints[2], pl.ypoints[2]); 

    int[] c=new int[3]; 
//  for(l=0; l<3; l++) c[l]=(int)((1-1.0*a1/a)*c1[l]+(1-1.0*a2/a)*c2[l]+(1-1.0*a3/a)*c3[l]); 
    for(l=0; l<3; l++) c[l]=(int)((1.0*a1/a)*c3[l]+(1.0*a2/a)*c2[l]+(1.0*a3/a)*c1[l]); 
    b.setRGB(ix, jy, 0xff000000|(c[0]<<16)|(c[1]<<8)|c[2]); 
    } 

如果您嘗試註釋行,您將得到三個補充色。