2016-01-21 200 views
0

我目前正在嘗試完成填充繪製的三角形的算法。我一直在做的方式是遍歷形狀並繪製單行。我有一個幾乎完美的算法,除了一個小問題。當我有一個水平的一面時,填充失敗。填充三角形算法

這是我目前的填充算法。我應該注意到稱爲origin,coor2和coor3的多維數組表示爲我的三角形(origin [0] [0] =原點x,原點[0] [1] = y)的頂點。座標是典型的窗口,(0,0)在左上角。此外,gc就是我需要在窗口中繪製的內容。

void triangle::drawFilled(GraphicsContext* gc) 
{ 
// color 
gc->setColor(colorRGB); 
// algorithm variables 
double ax = origin[0][0]; 
double bx = coor2[0][0]; 
double cx = coor3[0][0]; 
double ay = origin[1][0]; 
double by = coor2[1][0]; 
double cy = coor3[1][0]; 

// sort vertices by y 
if (ay > by) 
{ 
    std::swap(ay, by); 
    std::swap(ax, bx); 
} 
if (ay > cy) 
{ 
    std::swap(ay, cy); 
    std::swap(ax, cx); 
} 
if (by > cy) 
{ 
    std::swap(by, cy); 
    std::swap(bx, cx); 
} 

// define more algorithm variables 
double dx1 = (cx-ax)/(cy-ay); 
double dx2 = (bx-ax)/(by-ay); 
double dx3 = (cx-bx)/(cy-by); 
double x1 = ax; 
double x2 = ax; 

// loop through coordinates 
for(int y = ay; y < by; y++) 
{ 
    gc->drawLine(x1,y,x2,y); 
    x1 += dx1; 
    x2 += dx2; 
} 

// loop through coordinates 
for(int y = by; y < cy; y++) 
{ 
    gc->drawLine(x1,y,x2,y); 
    x1 += dx1; 
    x2 += dx3; 
} 
} 

Here's an example of my results when there are not horizontal sides

And here's when there is a horizontal side

注意如何外形和填充不排隊。

我意識到問題可能在於y頂點的排序,因此不考慮x。我可以蠻橫逼我的方法來處理水平和垂直邊緣的所有情況,但這似乎效率很低。我寧願學習如何解決我的困境,也不願意解決它。

回答

0

問題是您的代碼取決於第一個循環設置x2bx的副作用。當dx2是無窮無盡的,甚至不嘗試。

是第一循環之後所以,正確的,只是設置x2=bx;

大部分的額外步驟是多餘的時間,但它是微不足道的,當頂面是水平的,這是必要的。