Java 用三种颜色给三角形着色
请帮助我如何用这三种颜色给三角形上色。我觉得这是学校的问题, 使用Java编程语言 您好,这是代码: 我试图用这三种颜色填充三角形,但很难混合颜色来获得它。请如果你要解决它(近似),尽可能多地发送给我,我有它作为家庭作业和5-6天的最后期限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
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不,我不知道,这不适用于这个问题。