我正在尝试绘制(/填充)一个三角形,它可以工作..有时,当点的 2 个具有非常接近彼此的 y 坐标时,我遇到了问题。dx/dy 变得非常大(甚至可以无限增长..)
这是我用来查找扫描线开头和结尾的代码
//sortedArray包含所有3个点,[0]是y坐标最高的点
double dxDivDy1 = (sortedArray[1].x-sortedArray[0].x)/(sortedArray[1].y-sortedArray[0].y);//[0]-[1]
double dxDivDy2 = (sortedArray[2].x-sortedArray[0].x)/(sortedArray[2].y-sortedArray[0].y);//[0]-[2]
ArrayList<Double> startXes = new ArrayList<Double>();
ArrayList<Double> endXes = new ArrayList<Double>();
startXes.add(new Double(sortedArray[0].x));
endXes.add(new Double(sortedArray[0].x));
double startX1 = transformedTriangle.vertices[0].location.x;//[1]
double startX2 = transformedTriangle.vertices[0].location.x;//[2]
if(sortedArray[1].x > sortedArray[2].x)//[1] > [2]
{
for(int y = bY; y < eY; y++)
{
if(startX1 > sortedArray[1].x){
dxDivDy1 = (sortedArray[2].x-sortedArray[1].x)/(sortedArray[2].y-sortedArray[1].y);
}
if(startX2 < sortedArray[2].x){
dxDivDy2 = (sortedArray[1].x-sortedArray[2].x)/(sortedArray[1].y-sortedArray[2].y);
}
startX1 += dxDivDy1;
startX2 += dxDivDy2;
startXes.add(startX2);//[2]
endXes.add(startX1);//[1]
}
}
else//[2] > [1]
{
for(int y = bY; y < eY; y++)
{
if(startX1 < sortedArray[1].x){
dxDivDy1 = (sortedArray[1].x-sortedArray[2].x)/(sortedArray[1].y-sortedArray[2].y);
}
if(startX2 > sortedArray[2].x){
dxDivDy2 = (sortedArray[2].x-sortedArray[1].x)/(sortedArray[2].y-sortedArray[1].y);
}
startX1 += dxDivDy1;
startX2 += dxDivDy2;
startXes.add(startX1);
endXes.add(startX2);
}
}
那么,有没有解决这个问题的好方法,还是我应该得到一个不同的算法?
问候。
编辑:所以基本上,我只是遍历这条线并继续添加 dx/dy
edit2:是的,这是java代码。
编辑3:任何人都知道不同的算法,因为这似乎有很多特殊情况。