gpt4 book ai didi

java - 在Java中用3种颜色渐变填充三角形

转载 作者:行者123 更新时间:2023-11-30 02:41:58 26 4
gpt4 key购买 nike

我无法找到此问题的解决方案。我想在Java中用渐变绘制一个填充三角形,其中每个角都有不同的颜色。像这样的事情:

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

最佳答案

这是基于这样的想法:如果您在三角形内选择任何颜色,它将从三角形的三个点创建三个区域。因此我们扩展了线性插值的原理

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

到二维平面。因此,加权系数将是面积:

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

如果您尝试注释行,您将获得三种互补颜色。

关于java - 在Java中用3种颜色渐变填充三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com