Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 三角形绘图(光栅化)_Java_Algorithm_Geometry_Fill_Rasterizing - Fatal编程技术网

Java 三角形绘图(光栅化)

Java 三角形绘图(光栅化),java,algorithm,geometry,fill,rasterizing,Java,Algorithm,Geometry,Fill,Rasterizing,我正试着画一个三角形,它很有效。。有时,当两个点的y坐标非常接近时,我会遇到一个问题。dx/dy变得非常大(甚至可能无限大) 下面是我用来查找扫描线开始和结束的代码 //SorterDarray包含所有3个点,[0]是y坐标最高的点 double dxDivDy1 = (sortedArray[1].x-sortedArray[0].x)/(sortedArray[1].y-sortedArray[0].y);//[0]-[1] double dxDivDy2 = (sortedArray[2

我正试着画一个三角形,它很有效。。有时,当两个点的y坐标非常接近时,我会遇到一个问题。dx/dy变得非常大(甚至可能无限大)

下面是我用来查找扫描线开始和结束的代码

//SorterDarray包含所有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);                                                                    
    }
}
double dxDivDy1=(sortedArray[1].x-sortedArray[0].x)/(sortedArray[1].y-sortedArray[0].y)//[0]-[1] 
双dxDivDy2=(sortedArray[2]。x-sortedArray[0]。x)/(sortedArray[2]。y-sortedArray[0]。y)//[0]-[2] 
ArrayList startXes=新的ArrayList();
ArrayList endXes=新的ArrayList();
添加(新的双精度(sortedArray[0].x));
add(新的双精度(sortedArray[0].x));
double startX1=transformedTriangle.顶点[0]。位置.x//[1]                                   
double startX2=transformedTriangle.顶点[0]。位置.x//[2]                                  
如果(sortedArray[1].x>sortedArray[2].x)/[1]>[2]
{
for(int y=bY;ysortedArray[1].x){
dxDivDy1=(sortedArray[2]。x-sortedArray[1]。x)/(sortedArray[2]。y-sortedArray[1]。y);
}
if(startX2[1]
{
for(int y=bY;ysortedArray[2].x){
dxDivDy2=(sortedArray[2].x-sortedArray[1].x)/(sortedArray[2].y-sortedArray[1].y);
}
startX1+=dxDivDy1;
startX2+=dxDivDy2;
startXes.add(startX1);
endx.add(startX2);
}
}
那么,有没有一个很好的方法来解决这个问题,或者我应该换一个不同的算法

问候

编辑:所以基本上,我只是遍历这条线,继续添加dx/dy

edit2:是的,这是java代码


edit3:有人知道不同的算法,因为这似乎有很多特殊情况

我是否正确地理解了你在画一个填充的三角形,你画了很多相邻的线?下面是扫描线。我会用矢量代替你的dx/dy,这样你就不会在dy很小的时候遇到问题。你会怎么用它们呢?我试着写一个例子,但我对你的代码有点困惑。你的点是整数坐标还是双坐标?(看起来是后者,但我不明白如何在
bY
eY
之间循环整数)