2011-11-23 172 views
4

我需要在C++中繪製一個多邊形。我在矢量中設置了隨機點,然後通過線連接它們。但有時這些線相交,我得到這樣的東西。如何在C++中繪製多邊形,使線條不相交?

enter image description here

是否有任何公式或類似的東西,使線不會生氣嗎?

下面是部分代碼:

void draw_picture(Canvas & canvas) { 
    PairXY a,b,c,d,e; 
    int k; 
    vector <PairXY> vertex; 
    vertex.push_back(PairXY(drandom(k),drandom(k))); 
    vertex.push_back(PairXY(drandom(k),drandom(k))); 
    vertex.push_back(PairXY(drandom(k),drandom(k))); 
    vertex.push_back(PairXY(drandom(k),drandom(k))); 
    vertex.push_back(PairXY(drandom(k),drandom(k))); 

    vector <PairXY>::const_iterator iter; 

    iter = vertex.begin(); 
    a=*iter; 
    iter = vertex.begin()+1; 
    b=*iter; 
    iter = vertex.begin()+2; 
    c=*iter; 
    iter = vertex.begin()+3; 
    d=*iter; 
    iter = vertex.begin()+4; 
    e=*iter; 

    Line l1(a,b); 
    draw_line(l1,canvas); 
    Line l2(b,c); 
    draw_line(l2,canvas); 
    Line l3(c,d); 
    draw_line(l3,canvas); 
    Line l4(d,e); 
    draw_line(l4,canvas); 
    Line l5(e,a); 
    draw_line(l5,canvas); 
} 
+3

您可能想了解**循環** ... –

+1

可以由一組點構成多個多邊形。你想要什麼? – Pubby

回答

2

這聽起來像你可能正在尋找的是一個「簡單」(而不是「複雜」)多邊形:

http://en.wikipedia.org/wiki/Simple_polygon

有不一定是唯一的解決方案是:

Sort point list into polygon

這就是爲什麼點或路徑段的排序通常在多邊形繪圖引擎中很重要的原因。如果你願意的話 - 但是 - 你可以找到至少一個不復雜的多邊形的點的集合:

http://www.computational-geometry.org/mailing-lists/compgeom-announce/2003-March/000727.html

http://www.computational-geometry.org/mailing-lists/compgeom-announce/2003-March/000732.html


其他人指出你的代碼是重複的,如書面。你也沒有在你分享的摘錄中定義k,最好使用複數項來表示對象的矢量(「頂點」),而不是表示它是單數的(「頂點」)。這裏有一個非常簡單易懂的設置應該推廣到任意數量的頂點的變化:

void draw_picture(Canvas & canvas, int k, int numVertices = 5) { 
    vector<PairXY> vertices; 
    for (int index = 0; index < numVertices; index++) { 
     vertices.push_back(PairXY(drandom(k),drandom(k))); 
    } 

    vector<PairXY>::const_iterator iter = vertices.begin(); 
    while (iter != vertices.end()) { 
    PairXY startPoint = *iter; 
    iter++; 
    if (iter == vertices.end()) { 
     Line edgeLine (startPoint, vertices[0]); 
     draw_line(edgeLine, canvas); 
    } else { 
     Line edgeLine (startPoint, *iter); 
     draw_line(edgeLine, canvas); 
    } 
    } 
} 

有很多的方法來管理在C++中的迭代,雖然很多都是比他們的同行更詳細其他語言。最近在C++ 11中添加了一個不錯的range-based for loop,但是你的編譯環境可能還不支持它。

0

排序數組繪製它

前找到最左邊的點 比從那裏

即 最左邊的地方點y <第一點y,直到沒有發現

右邊的點直到沒有去CCW找到

+0

CCW圍繞什麼來源? –

+0

這裏的起源可以被描述爲連接最左和最右點的線的中間點, –