多邊形與多邊形 位置關係的判斷

2021-07-11 09:55:27 字數 3457 閱讀 2653

c#判斷點的位置方法一

public

intisleft(point p0, point p1,point p2)

private

boolpointinfences(point pnt1, point fencepnts)}}

else}}

}if(wn == 0)

return

false;

else

return

true;

}c#判斷點的位置方法二——c#內建函式:

graphicspath mygraphicspath =newgraphicspath();

region myregion=newregion();

mygraphicspath.reset();

point inputponint =newpoint(inputx, inputy);

mygraphicspath.addpolygon(points);//points);

myregion.makeempty();

myregion.union(mygraphicspath);

//返回判斷點是否在多邊形裡

boolmypoint= myregion.isvisible(inputponint);

this.lblx.text = mypoint.tostring();

圖形演算法:

1,面積法。就是看所有邊和目標點組成的三角形面積和是否等於總的多邊形面積,如果相等,則在內部。反之在外部。這種方法計算量較大,用到的主要計算是查乘。

2,夾角和法。參見三樓,判斷所有邊和目標點的夾角和是否為360度。計算量比上面這種方法稍微小點,用到主要是點乘和求模計算。

3,引射線法。就是從該點出發引一條射線,看這條射線和所有邊的交點數目。如果有奇數個交點,則說明在內部,如果有偶數個交點,則說明在外部。這是所有方法中計算量最小的方法,在光線追蹤演算法中有大量的應用。

在c#中的話,有乙個region類,可以直接呼叫isvisible判斷是否在這個區域內部,我估計內部的實現應該是上面說的第三種方法。主要看你的需求是哪種輸入了,如果在c#中,你完全可以用region類來隱藏內部實現。

c#判斷點的位置的另外一種解決方法:

1.已知點point(x,y)和多邊形polygon(x1,y1;x2,y2;….xn,yn;);

2.以point為起點,以無窮遠為終點作平行於x軸的直線line(x,y; -∞,y);

3.迴圈取得(for(i=0;i< n;i++))多邊形的每一條邊side(xi,yi;xi+1,yi+1),且判斷是否平行於x軸,如果平行continue,否則,i++;

4. 同時判斷point(x,y)是否在side上,如果是,則返回1(點在多邊形上),否則繼續下面的判斷;

5.判斷線side與line是否有交點,如果有則count++,否則,i++。

6.判斷交點的總數,如果為奇數則返回0(點在多邊形內),偶數則返回2(點在多邊形外)。

**:

const

doubleinfinity = 1e10;

const

doubleesp = 1e-5;

const

intmax_n = 1000;

structpoint ;

structlinesegment ;

typedef vector< point> polygon;

// 計算叉乘 |p0p1| × |p0p2|

doublemultiply(point p1, point p2, point p0)

// 判斷線段是否包含點point

boolisonline(point point, linesegment line)

// 判斷線段相交

boolintersect(linesegment l1, linesegment l2)

// 判斷點在多邊形內

boolinpolygon(constpolygon& polygon, point point)

// 如果side平行x軸則不作考慮

if( fabs(side.pt1.y - side.pt2.y) < esp )

if( isonline(side.pt1, line) )else

if( isonline(side.pt2, line) )else

if( intersect(line, side) )

}if( count % 2 == 1 )

else}}

protected override void onpaint(painteventargs e)

); gp2.addrectangle(new rectangle(new point(0,50),new size(300,200)));

g.fillpath(brushes.green, gp2);

g.fillpath(brushes.greenyellow, gp1);

region region = new region(gp1);

region.intersect(gp2); 

//求長方形和多邊形的交集

g.fillregion(brushes.red, region);//用紅色填充

}

最近專案需要判斷兩個圖形要素是否相交的問題:

乙個圖形元素是graphicspath 構造的閉合多邊形,另乙個圖形元素是矩形,然後用region.intersect(矩形)來獲取兩者的交集元素,但明明是有交集的,返回的交集卻為空。

可能的原因是構建圖形要素的值太小造成的返回結果不準確,建立圖形要素的座標限定在: 

請問有什麼辦法可以使下面的交集能夠正確返回?

注:下面的兩圖形元素肯定是有交集的。

public void intersecttestx(painteventargs e)

分不多,請大家見諒!謝謝。 

判斷多邊形重疊 多邊形碰撞檢測

在討論多邊形碰撞檢測之前,我們可以先思考一下遊戲物件怎麼判斷2d圖形有碰撞,靠的是判斷2d圖形在遊戲世界中有接觸,或者有重疊區域,大到包含,小到重疊接觸乙個點。那麼我們就需要精確計算2d圖形在某一幀有重疊部分,或者預判到下一幀有重疊部分,那麼就是碰撞到了。先從簡單的模型來討論碰撞。判斷乙個點是否在多...

Matlab生成多邊形,並且判斷多邊形是否相交

隨機生成若干個點,就可以生成多邊形。嚴格來說,是要判斷產生的點是否共線的,但是這樣概率太低,所以我就沒有判斷。生成的點不能直接連起來,因為點的順序有可能是錯亂的,所以首先要進行順序判斷,方法是計算角度。找到平面內某一點,計算多邊形每乙個點到這個點連線和x軸的夾角,對這個夾角進行排序,就可以得到點的順...

多邊形判斷模板

include include define maxn 1000 define offset 10000 define eps 1e 8 define zero x x 0?x x define sign x x eps?1 x eps?2 0 struct point struct line do...