0

三角形を描画(/塗りつぶし)しようとしていますが、うまくいきます.時々、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 コードです。

edit3: これには多くの特殊なケースがあるように見えるので、誰もが別のアルゴリズムを知っています。

4

0 に答える 0