2017-01-01 155 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]); 
    } 

如果您尝试注释行,您将得到三个补充色。