Java 用三种颜色给三角形着色

Java 用三种颜色给三角形着色,java,graphics,colors,Java,Graphics,Colors,请帮助我如何用这三种颜色给三角形上色。我觉得这是学校的问题, 使用Java编程语言 您好,这是代码: 我试图用这三种颜色填充三角形,但很难混合颜色来获得它。请如果你要解决它(近似),尽可能多地发送给我,我有它作为家庭作业和5-6天的最后期限 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.awt.geom.*; public clas

请帮助我如何用这三种颜色给三角形上色。我觉得这是学校的问题, 使用Java编程语言

您好,这是代码: 我试图用这三种颜色填充三角形,但很难混合颜色来获得它。请如果你要解决它(近似),尽可能多地发送给我,我有它作为家庭作业和5-6天的最后期限

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.geom.*;
public class NotFullVersion2 extends JApplet {

public static void main(String s[]) {

  JFrame frame = new JFrame();
  frame.setTitle("Colors");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JApplet applet = new NotFullVersion2();
  applet.init();
  applet.addMouseListener(
     new MouseAdapter(){  
        public void mousePressed(MouseEvent e) { 
           System.out.println(e.getX() + " " + e.getY());
        }});

  frame.getContentPane().add(applet);
  frame.pack();
  frame.setVisible(true);
}

ColorPanel panel;

public void init() {

  panel = new ColorPanel();
  Container cp = getContentPane();
  cp.setLayout(new BorderLayout());
  cp.add(panel, BorderLayout.CENTER);
  JPanel p = new JPanel();
  cp.add(p,BorderLayout.EAST);  
}


}

class ColorPanel extends JPanel  {

//int red = 100,green = 100, blue = 100;

public ColorPanel() {

  setPreferredSize(new Dimension(500, 500));
  setBackground(Color.black);
}

public void paintComponent(Graphics g) {

  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D)g;


  for(int i = 0; i < 256; i++) {

     int start = 399; 

     g2.setColor(new Color(0,i,255-i));   

     for(int j = 0; j < 200; j ++) {

        Rectangle rec = new Rectangle(150+j,start - i,1,1);
        g2.fill(rec);

     }

  }


  for(int j = 0; j < 100; j++) {

     int start = 100;

     for(int i = 0; i < 300; i++) {

        if(i < 22) {

           g2.setColor(new Color(255,0,0));
           Rectangle rec = new Rectangle(100 + i,start + j,1,1);
           g2.fill(rec);

        } else if(i > 21 && i < 278) {

           g2.setColor(new Color(255-(i-22),(i-22),0));
           Rectangle rec = new Rectangle(100 + i,start + j,1,1);
           g2.fill(rec);

        } else if(i < 300) {

           g2.setColor(new Color(0,255,0));
           Rectangle rec = new Rectangle(100 + i,start + j,1,1);
           g2.fill(rec);

        }
     }

  }

  GeneralPath closePath1a = new GeneralPath();

  g2.setColor(new Color(0,0,0));

  closePath1a.moveTo(100,100);
  closePath1a.lineTo(100,400);
  closePath1a.lineTo(250,400);
  closePath1a.closePath();

  g2.fill(closePath1a);


  GeneralPath closePath2a = new GeneralPath();

  g2.setColor(new Color(0,0,0));

  closePath2a.moveTo(400,100);
  closePath2a.lineTo(400,400);
  closePath2a.lineTo(250,400);
  closePath2a.closePath();

  g2.fill(closePath2a);


  GeneralPath closePath3a = new GeneralPath();

  g2.setColor(new Color(0,0,0));

  closePath3a.moveTo(100,100);
  closePath3a.lineTo(100,50);
  closePath3a.lineTo(400,50);
  closePath3a.lineTo(400,100);
  closePath3a.closePath();

  g2.fill(closePath3a);



 }  


 }
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.event.*;
导入java.awt.geom.*;
公共类NotFullVersion2扩展了JApplet{
公共静态void main(字符串s[]{
JFrame=新JFrame();
帧。设置标题(“颜色”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet=newnotfullversion2();
applet.init();
applet.addMouseListener(
新的MouseAdapter(){
公共无效鼠标按下(MouseEvent e){
System.out.println(e.getX()+“”+e.getY());
}});
frame.getContentPane().add(小程序);
frame.pack();
frame.setVisible(true);
}
彩色面板;
公共void init(){
panel=新的ColorPanel();
容器cp=getContentPane();
cp.setLayout(新的BorderLayout());
cp.add(面板、边框布局、中心);
JPanel p=新的JPanel();
cp.add(p,边界布局图,东部);
}
}
类ColorPanel扩展了JPanel{
//int红色=100,绿色=100,蓝色=100;
公共色彩小组(){
setPreferredSize(新尺寸(500500));
挫折背景(颜色:黑色);
}
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
对于(int i=0;i<256;i++){
int start=399;
g2.设置颜色(新颜色(0,i,255-i));
对于(int j=0;j<200;j++){
矩形rec=新矩形(150+j,开始-i,1,1);
g2.填充(rec);
}
}
对于(int j=0;j<100;j++){
int start=100;
对于(int i=0;i<300;i++){
如果(i<22){
g2.setColor(新颜色(255,0,0));
矩形rec=新矩形(100+i,开始+j,1,1);
g2.填充(rec);
}否则如果(i>21&&i<278){
g2.setColor(新颜色(255-(i-22),(i-22),0));
矩形rec=新矩形(100+i,开始+j,1,1);
g2.填充(rec);
}否则如果(i<300){
g2.setColor(新颜色(0255,0));
矩形rec=新矩形(100+i,开始+j,1,1);
g2.填充(rec);
}
}
}
GeneralPath closePath1a=新的GeneralPath();
g2.setColor(新颜色(0,0,0));
closePath1a.移动到(100100);
closePath1a.lineTo(100400);
closePath1a.lineTo(250400);
closePath 1a.closePath();
g2.填充(闭合路径1A);
GeneralPath closePath2a=新的GeneralPath();
g2.setColor(新颜色(0,0,0));
closePath2a.移动到(400100);
closePath2a.lineTo(400400);
closePath2a.lineTo(250400);
closePath 2a.closePath();
g2.填充(闭合路径2a);
GeneralPath closePath3a=新的GeneralPath();
g2.setColor(新颜色(0,0,0));
closePath3a.移动到(100100);
closePath3a.lineTo(100,50);
closePath3a.lineTo(400,50);
closePath3a.lineTo(400100);
closePath 3a.closePath();
g2.填充(闭合路径3a);
}  
}

对这样的三角形着色相当于计算三角形内每个像素的重心坐标。以下未测试的代码计算三角形ABC内每个像素的重心坐标,然后使用它为该像素着色:

private float area(float Ax, float Ay, float Bx, float By, float Cx, float Cy) {
    return  0.5*((Ax - Cx)*(By - Ay) - (Ax - Bx)*(Cy - Ay));
}

private void paintTriangle(Graphics g, float Ax, float Ay, float Bx, float By, float Cx, float Cy) {
    // calculate the bounding box of the triangle:
    int minX = Math.round(Math.min(Ax, Math.min(Bx, Cx)));
    int minY = Math.round(Math.min(Ay, Math.min(By, Cy)));
    int maxX = Math.round(Math.max(Ax, Math.max(Bx, Cx)));
    int maxY = Math.round(Math.max(Ay, Math.max(By, Cy)));

    // loop for each pixel in the bounding box of the triangle
    for(int y = minY; y < maxY; ++y) {
        for(int x = minX; x < maxX; ++x) {
            // center of the pixel (x,y)
            float Px = x + 0.5, Py = y + 0.5;

            // barycentric coordinates of P
            float denom = area(Ax, Ay, Bx, By, Cx, Cy);
            float b0 = area(Px, Py, Bx, By, Cx, Cy)/denom;
            float b1 = area(Ax, Ay, Px, Py, Cx, Cy)/denom;
            float b2 = area(Ax, Ay, Bx, By, Px, Py)/denom;

            // discard pixels outside the triangle
            if(b0 < 0 || b1 < 0 || b2 < 0)
                continue;

            // paint a pixel of color (b0,b1,b2) at (x,y)
            g.setColor(new Color(b0,b1,b2));
            g.fillRect(x,y,1,1));
        }
    }
}
专用浮点区域(浮点Ax、浮点Ay、浮点Bx、浮点By、浮点Cx、浮点Cy){
返回0.5*((Ax-Cx)*(By-Ay)-(Ax-Bx)*(Cy-Ay));
}
私有虚空绘制三角形(图形g、浮点Ax、浮点Ay、浮点Bx、浮点Bx、浮点Cx、浮点Cy){
//计算三角形的边界框:
int minX=Math.round(Math.min(Ax,Math.min(Bx,Cx));
int minY=Math.round(Math.min(Ay,Math.min(By,Cy));
int maxX=Math.round(Math.max(Ax,Math.max(Bx,Cx));
int maxY=Math.round(Math.max(Ay,Math.max(By,Cy));
//循环三角形边界框中的每个像素
对于(int y=minY;y
我将留给您测试和集成此代码


你可以在上阅读更多关于重心坐标的信息

你能展示一下你用来实现左边的代码吗?1分钟让我找到如何向你发送代码你可以回答问题。对不起,我不知道如何发布代码,我是Stackoverflow的新手,我会尽快发布。嗨,我编辑了问题并发布了代码,很抱歉迟到,我是新来的。非常感谢。很抱歉打扰您,您有代码吗?如何使用Bresenham线条绘制algorithm@MrJab不,我不知道,这不适用于这个问题。