日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python判断点在直线的哪一侧_判断点在直线的哪一侧

發(fā)布時間:2024/10/8 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python判断点在直线的哪一侧_判断点在直线的哪一侧 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2.2.1下面開始程序的設(shè)計:

由于本部分需要判斷空間多邊形的拓撲關(guān)系,現(xiàn)在約定凸多邊形的邊界和內(nèi)部,凸多邊形用頂點坐標(biāo)的逆時針方向序列確定。凸多邊形P Q的頂點序列為p1 p2 ..pn和q1 q2 …qn。為了簡單,假設(shè)P邊界上不包含Q的頂點,Q的邊界上不包含P的頂點。這使得P和Q或者完全分離,或者重疊而交出一個新的凸多邊形。(這是我對本部分的初步設(shè)計。)

程序部分:

struct point

{

double x,y;

bool operator !=(point& p){return ((x!=p.x)||(y!=p.y));}

};

定義點的存儲結(jié)構(gòu)同時根據(jù)需要重載了operator !=。

然后是主類實現(xiàn)拓撲關(guān)系判斷。此外還有兩個輔助類dotline.h,LineIntersect.h分別實現(xiàn)點線判斷,兩線段相交求交點,為主類提供相應(yīng)的輔助功能。

Yolk.h(主類)

class ConvexPolyIntersection

{

private:

point R;

void output(double ,double);

void advance();頂點前進程序部分

point *p,*q;

int il,jl,i,j,onlyonce;

dot inst1;

Intersect inst2;

public:

ConvexPolyIntersection(int itmp,int jtmp);求交集函數(shù)部分。

int intersection(int tab);

void printRelate();

~ConvexPolyIntersection(){delete p;delete q;inst1.~dot();inst2.~Intersect();}

};

為了有次序地求出交點,可以在兩個多邊形上交替的前進,原則是在哪個多邊形的邊上可能有交點就等待,在另一個多邊形的邊上前進。如果兩個凸多邊形相交,本程序可以精確的輸出交得的新凸多邊形的坐標(biāo)。并且已經(jīng)具備了一定的拓撲關(guān)系判斷能力,可是由于程序在設(shè)計之前添加了很多苛刻限制,使得程序不能很好的判斷EQ和相切關(guān)系。但是基本的分明蛋黃RCC5程序已經(jīng)完成。

難點問題解決

主要難點是判斷多邊形頂點前進的方法,規(guī)定P0=P1 Q0=Q1,接下來在哪個多邊形上前進,需要區(qū)分8種情況,其中前四種和后四種是P和Q的地位對調(diào)。如圖

情形

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

Pi在Qi-1Qi

Qi在Pi-1Pi

安排在那個多邊形前進

Q

P

Q

P

P

Q

P

Q

這樣完成了理論部分。

本來我認為完成上面的程序就已經(jīng)大功告成,可是我發(fā)現(xiàn)他不遵守RCC標(biāo)準(zhǔn),即沒有求三原謂詞P,C和I,雖然程序在改進后可以完全實現(xiàn)RCC5拓撲判斷功能,但是已經(jīng)無法直接求取三原謂詞P,C和I了。因為程序中關(guān)于三原謂詞P,C和I的理解發(fā)生了偏差,程序中是按照相交為P考慮的,即求出交集p=true。而當(dāng)C=true時P并不為真,他僅僅關(guān)注邊和點,而理論中應(yīng)該是關(guān)注邊所圍成的面積。P是C的一部分。所以將對程序進行改寫。

由于下面將繼續(xù)使用點線判斷類,所以對此類的實現(xiàn)進行詳細介紹:

dotline.h(注意這里直線是有方向性的)

怎么判斷坐標(biāo)為(xp,yp)的點P是在直線的哪一側(cè)呢?設(shè)直線是由其上兩點(x1,y1)(x2,y2)確定的,直線方向是由(x1,y1)到(x2,y2)的方向。這時若直線方程記為Ax+By+C=0

則有:

A=y2-y1; B=x1-x2; C=x2*y1-x1*y2;

這時可以計算D:

D=A*xp+B*yp+C

若D<0,則點(xp,yp)在直線的左側(cè);若D>0,則點在直線的右側(cè);D=0點在直線上。

接下來將實現(xiàn)真正的RCC5程序。在原有程序的實踐基礎(chǔ)上,求三原謂詞P,C和I關(guān)系實際上就是求凸多邊形的邊界頂點與另一個凸多邊形的位置關(guān)系。

即:

P(x,y)只要有凸多邊形x或y的一個頂點在凸多邊形y或x內(nèi),說明x,y有相交部分(即,面積有重合部分),P=true否則P=false。

C (x,y)凸多邊形y的所有頂點都在凸多邊形x中或上,c=true,否則c=false。

I (x,y)與C (x,y)同理。

這樣就減少了設(shè)計的復(fù)雜性,同時相切問題也會得到解決,即主要注意“點線”關(guān)系,就可以很好的判斷各種關(guān)系。

難點問題解決:

這樣程序的焦點就都集中在一個功能齊全的點與線段關(guān)系判斷類上。此類首先能判斷點與線段所在直線的位置關(guān)系(點在直線左側(cè);點在直線右側(cè) ;點在直線上),當(dāng)點在直線上時,進一步判斷點與線段的關(guān)系,在線段上(在線段端點上 或 不在),在線段外。

本程序?qū)⒗^承 dotline.h

實現(xiàn)Superdotline.h

#include”dotline.h”/*頭文件*/

class SuperDot: public dot

{

public:

SuperDot(){}

SuperDot(double xp1,double yp1,double x11,double y11,double x22,double y22):dot(xp1, yp1,x11,y11,x22,y22){}

~SuperDot(){}

int judgeDeeply();/*此函數(shù)返回點線關(guān)系結(jié)果*/

};

/*

點線關(guān)系:

1在線段左側(cè) -- 點在凸多邊形 內(nèi)部 是點在直線的公共左側(cè)

0在線段右側(cè)

2點在線段外

3點與線段端點重合

4點在線段上

*/

其中 輸出結(jié)果為3 4時,是為RCC8程序準(zhǔn)備的。此程序由于是對dotline.h的擴展,所以函數(shù)數(shù)量較少。

完成點線關(guān)系判斷后,實現(xiàn)RCC5判斷

實現(xiàn)yolk1.h(在yolk.h的基礎(chǔ)上對其進行標(biāo)準(zhǔn)RCC5重寫 求三原謂詞P,C和I)

本程序繼承了yolk.h的優(yōu)點,使用指針存儲點結(jié)構(gòu)(對頂點數(shù)沒有限制)。

class yolk :public SuperDot

{

proteced:

point *p,*q;

int il,jl,i,j;

bool P,C,I;

void relateRcc();/*求P C I*/

yolk(){}

public:

yolk(int itmp,int jtmp);

~yolk(){delete p;delete q;}

void printRelate();

};

算法設(shè)計:

此類的焦點集中在relateRcc()函數(shù)上。他對矢量數(shù)據(jù)進行兩次掃描判斷三原謂詞P,C和I。以“點 、凸多邊形”拓撲關(guān)系為基礎(chǔ)。如當(dāng)其中一個凸多邊形的端點在另一個的內(nèi)部時,可以判斷P=true.

總結(jié)

以上是生活随笔為你收集整理的python判断点在直线的哪一侧_判断点在直线的哪一侧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。