【发布时间】:2019-05-19 08:22:05
【问题描述】:
我正在尝试使用水平线填充三角形,但我无法弄清楚我当前的方法有什么问题。在有人说只使用 fillPolygon 之前,我不能使用它。我需要使用线条填充它。 在某些情况下似乎可以正常工作,而在其他情况下则完全中断。
它应该是这样的。但后来我尝试将我的方法应用于旋转的 3D 立方体,然后......
我不知道出了什么问题。此外,红色边框也是我的三角形方法之一。这些工作完美,填充三角形和轮廓三角形输入了相同的顶点。
public void filledTri(int x1,int y1,int x2,int y2,int x3,int y3){
int[] xs = {x1,x2,x3};
int[] ys = {y1,y2,y3};
//Sort vertices in vertical order so A/1 is highest and C/3 is lowest
int I,tempx,tempy;
for(int i=1;i<3;i++){
I = i-1;
tempx = xs[i];
tempy = ys[i];
while(I>=0&&tempy<ys[I]){
xs[I+1] = xs[I];
ys[I+1] = ys[I];
I--;
}
xs[I+1] = tempx;
ys[I+1] = tempy;
}
//Set left and right edges
linepts ab = new linepts(xs[0],ys[0],xs[1],ys[1]),
ac = new linepts(xs[0],ys[0],xs[2],ys[2]);
linepts[] lines = {ab.getEndX() < ac.getEndX() ? ab : ac,
ab.getEndX() > ac.getEndX() ? ab : ac,
new linepts(xs[1],ys[1],xs[2],ys[2])};
//Fill triangle
int startY = ys[0],endY = ys[2];
for(int y=startY;y<=endY;y++){
if(y>ys[1])
horizontalLine((int)Math.round(lines[2].getX(y)),
y,
(int)Math.round(lines[1].getX(y)));
else
horizontalLine((int)Math.round(lines[0].getX(y)),
y,
(int)Math.round(lines[1].getX(y)));
}
getX(int y) 获取直线通过 y 值的 x 坐标。如果它是一条水平线,它只返回线的开始 x
A点是屏幕上的最高点和最低点,B点是中间点,C点是屏幕上的最低点和最高点
如果有帮助,我会在 jframe 上使用缓冲图像来绘制它。
【问题讨论】:
-
我在第一个“工作”图像中看到的只是纯白色或接近白色的填充。应该出现在那里的线条是否平行?考虑将它们绘制到图像上,然后使用
TexturePaint填充Shape(本例中为三角形)。 -
“我不知道出了什么问题。” 嗯.. 现在我更仔细地查看图像,我意识到我不知道你想要达到什么目的。第一个三角形中的水平线在哪里? 一般提示:如需尽快获得更好的帮助,请edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。
-
你能展示
getX和horizontalLine的实现吗?如果不仔细审查,问题可能出在他们身上。 -
public double getX(int y){ double m = ((double)(y1-y2))/((double)(x1-x2)); if(m==0) return x1; else return (double)(y-y1)/m+x1; } -
public void horizontalLine(int x1,int y,int x2){ //Only one of these will run, the second one only runs //if x2 < x1 for(int x=x1;x<=x2;x++) pixel(x,y); for(int x=x1;x>=x2;x--) pixel(x,y); }
标签: java swing awt computational-geometry java-2d