2017-01-01 4 views
0

Мне не удалось найти решение этой проблемы. Я хотел бы нарисовать заполненный треугольник в Java с градиентом, где каждый угол имеет другой цвет. Что-то вроде этого:Заполнить треугольник с 3 градиентом цвета в 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 Graphics и Java 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-мерный самолет. Таким образом, весовые коэффициенты будут направления:

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

Если вы попытаетесь комментируемая строкой, вы получите три дополнительных цвет.

Смежные вопросы