我目前正在嘗試完成填充繪製的三角形的算法。我一直在做的方式是遍歷形狀並繪製單行。我有一個幾乎完美的算法,除了一個小問題。當我有一個水平的一面時,填充失敗。填充三角形算法
這是我目前的填充算法。我應該注意到稱爲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。我可以蠻橫逼我的方法來處理水平和垂直邊緣的所有情況,但這似乎效率很低。我寧願學習如何解決我的困境,也不願意解決它。