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

标签 java graphics gradient

我无法找到此问题的解决方案。 我想在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/

相关文章:

java - 如何在 Java 中实现成员明智比较?

java - 在 Eclipse 中编写 Java 类时,是否可以插入指向网页的 URL 超链接?

linux - Linux 桌面应用程序可以用作 Linux 桌面吗?

具有多个类的 CSS 多背景

Java 构建相互依赖的事件链

c++ - 使用什么 Qt 小部件来绘制类似 "game-of-life"的应用程序?

android - 如何在 Android 中以编程方式为图像添加阴影?

r - 每个类别的渐变颜色以使用 R 中的 ggplot 生成热图表

ios - 带有渐变背景的白边 IOS

java - 实体类和记录锁定