青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-19  評論-1  文章-0  trackbacks-0
原文鏈接:http://cschf.spaces.live.com/blog/cns!E113B8D05D833E2B!140.entry
寫幾點不熟悉的
12. 判斷點是否在多邊形中
13. 判斷線段是否在多邊形內
25. 計算線段或直線與線段的交點
27. 求線段或直線與圓的交點

判斷點是否在多邊形中

判斷點P是否在多邊形中是計算幾何中一個非常基本但是十分重要的算法。以點P為端點,向左方作射線L,由于多邊形是有界的,所以射線L的左端一定在多邊形外,考慮沿著L從無窮遠處開始自左向右移動,遇到和多邊形的第一個交點的時候,進入到了多邊形的內部,遇到第二個交點的時候,離開了多邊形,……所以很容易看出當L和多邊形的交點數目C是奇數的時候,P在多邊形內,是偶數的話P在多邊形外。

但是有些特殊情況要加以考慮。如圖下圖(a)(b)(c)(d)所示。在圖(a)中,L和多邊形的頂點相交,這時候交點只能計算一個;在圖(b)中,L和多邊形頂點的交點不應被計算;在圖(c)和(d) 中,L和多邊形的一條邊重合,這條邊應該被忽略不計。如果L和多邊形的一條邊重合,這條邊應該被忽略不計。

為了統一起見,我們在計算射線L和多邊形的交點的時候,1。對于多邊形的水平邊不作考慮;2。對于多邊形的頂點和L相交的情況,如果該頂點是其所屬的邊上縱坐標較大的頂點,則計數,否則忽略;3。對于P在多邊形邊上的情形,直接可判斷P屬于多邊行。由此得出算法的偽代碼如下:
    count ← 0;
    以P為端點,作從右向左的射線L; 
    for 多邊形的每條邊s
     do if P在邊s上 
          then return true;
        if s不是水平的
          then if s的一個端點在L上
                 if 該端點是s兩端點中縱坐標較大的端點
                   then count ← count+1
               else if s和L相交
                 then count ← count+1;
    if count mod 2 = 1 
      then return true;
    else return false;
其中做射線L的方法是:設P'的縱坐標和P相同,橫坐標為正無窮大(很大的一個正數),則P和P'就確定了射線L。

判斷點是否在多邊形中的這個算法的時間復雜度為O(n)。

另外還有一種算法是用帶符號的三角形面積之和與多邊形面積進行比較,這種算法由于使用浮點數運算所以會帶來一定誤差,不推薦大家使用。


判斷線段是否在多邊形內

線段在多邊形內的一個必要條件是線段的兩個端點都在多邊形內,但由于多邊形可能為凹,所以這不能成為判斷的充分條件。如果線段和多邊形的某條邊內交(兩線段內交是指兩線段相交且交點不在兩線段的端點),因為多邊形的邊的左右兩側分屬多邊形內外不同部分,所以線段一定會有一部分在多邊形外(見圖a)。于是我們得到線段在多邊形內的第二個必要條件:線段和多邊形的所有邊都不內交。

線段和多邊形交于線段的兩端點并不會影響線段是否在多邊形內;但是如果多邊形的某個頂點和線段相交,還必須判斷兩相鄰交點之間的線段是否包含于多邊形內部(反例見圖b)。

 

因此我們可以先求出所有和線段相交的多邊形的頂點,然后按照X-Y坐標排序(X坐標小的排在前面,對于X坐標相同的點,Y坐標小的排在前面,這種排序準則也是為了保證水平和垂直情況的判斷正確),這樣相鄰的兩個點就是在線段上相鄰的兩交點,如果任意相鄰兩點的中點也在多邊形內,則該線段一定在多邊形內。

證明如下:

命題1:
如果線段和多邊形的兩相鄰交點P1 ,P2的中點P' 也在多邊形內,則P1, P2之間的所有點都在多邊形內。

證明:
假設P1,P2之間含有不在多邊形內的點,不妨設該點為Q,在P1, P'之間,因為多邊形是閉合曲線,所以其內外部之間有界,而P1屬于多邊行內部,Q屬于多邊性外部,P'屬于多邊性內部,P1-Q-P'完全連續,所以P1Q和QP'一定跨越多邊形的邊界,因此在P1,P'之間至少還有兩個該線段和多邊形的交點,這和P1P2是相鄰兩交點矛盾,故命題成立。證畢。

由命題1直接可得出推論:
推論2:
設多邊形和線段PQ的交點依次為P1,P2,……Pn,其中Pi和Pi+1是相鄰兩交點,線段PQ在多邊形內的充要條件是:P,Q在多邊形內且對于i =1, 2,……, n-1,Pi ,Pi+1的中點也在多邊形內。
在實際編程中,沒有必要計算所有的交點,首先應判斷線段和多邊形的邊是否內交,倘若線段和多邊形的某條邊內交則線段一定在多邊形外;如果線段和多邊形的每一條邊都不內交,則線段和多邊形的交點一定是線段的端點或者多邊形的頂點,只要判斷點是否在線段上就可以了。
至此我們得出算法如下:
    if 線端PQ的端點不都在多邊形內 
      then return false;
    點集pointSet初始化為空;
    for 多邊形的每條邊s
      do if 線段的某個端點在s上
           then 將該端點加入pointSet;
         else if s的某個端點在線段PQ上
           then 將該端點加入pointSet;
         else if s和線段PQ相交 // 這時候已經可以肯定是內交了
           then return false;
    將pointSet中的點按照X-Y坐標排序;
    for pointSet中每兩個相鄰點 pointSet[i] , pointSet[ i+1]
      do if pointSet[i] , pointSet[ i+1] 的中點不在多邊形中
           then return false;
    return true;
這個過程中的排序因為交點數目肯定遠小于多邊形的頂點數目n,所以最多是常數級的復雜度,幾乎可以忽略不計。因此算法的時間復雜度也是O(n)。


計算線段或直線與線段的交點:

設一條線段為L0 = P1P2,另一條線段或直線為L1 = Q1Q2 ,要計算的就是L0和L1的交點。
1. 首先判斷L0和L1是否相交(方法已在前文討論過),如果不相交則沒有交點,否則說明L0和L1一定有交點,下面就將L0和L1都看作直線來考慮。

2. 如果P1和P2橫坐標相同,即L0平行于Y軸

a) 若L1也平行于Y軸,

i. 若P1的縱坐標和Q1的縱坐標相同,說明L0和L1共線,假如L1是直線的話他們有無窮的交點,假如L1是線段的話可用"計算兩條共線線段的交點"的算法求他們的交點(該方法在前文已討論過);
ii. 否則說明L0和L1平行,他們沒有交點;

b) 若L1不平行于Y軸,則交點橫坐標為P1的橫坐標,代入到L1的直線方程中可以計算出交點縱坐標;

3. 如果P1和P2橫坐標不同,但是Q1和Q2橫坐標相同,即L1平行于Y軸,則交點橫坐標為Q1的橫坐標,代入到L0的直線方程中可以計算出交點縱坐標;

4. 如果P1和P2縱坐標相同,即L0平行于X軸

a) 若L1也平行于X軸,

i. 若P1的橫坐標和Q1的橫坐標相同,說明L0和L1共線,假如L1是直線的話他們有無窮的交點,假如L1是線段的話可用"計算兩條共線線段的交點"的算法求他們的交點(該方法在前文已討論過);
ii. 否則說明L0和L1平行,他們沒有交點;

b) 若L1不平行于X軸,則交點縱坐標為P1的縱坐標,代入到L1的直線方程中可以計算出交點橫坐標;

5. 如果P1和P2縱坐標不同,但是Q1和Q2縱坐標相同,即L1平行于X軸,則交點縱坐標為Q1的縱坐標,代入到L0的直線方程中可以計算出交點橫坐標;

6. 剩下的情況就是L1和L0的斜率均存在且不為0的情況

a) 計算出L0的斜率K0,L1的斜率K1 ;

b) 如果K1 = K2 

i. 如果Q1在L0上,則說明L0和L1共線,假如L1是直線的話有無窮交點,假如L1是線段的話可用"計算兩條共線線段的交點"的算法求他們的交點(該方法在前文已討論過);
ii. 如果Q1不在L0上,則說明L0和L1平行,他們沒有交點。
c) 聯立兩直線的方程組可以解出交點來
這個算法并不復雜,但是要分情況討論清楚,尤其是當兩條線段共線的情況需要單獨考慮,所以在前文將求兩條共線線段的算法單獨寫出來。另外,一開始就先利用矢量叉乘判斷線段與線段(或直線)是否相交,如果結果是相交,那么在后面就可以將線段全部看作直線來考慮。需要注意的是,我們可以將直線或線段方程改寫為ax+by+c=0的形式,這樣一來上述過程的部分步驟可以合并,縮短了代碼長度,但是由于先要求出參數,這種算法將花費更多的時間。

求線段或直線與圓的交點:

設圓心為O,圓半徑為r,直線(或線段)L上的兩點為P1,P2。

1. 如果L是線段且P1,P2都包含在圓O內,則沒有交點;否則進行下一步。

2. 如果L平行于Y軸,

a) 計算圓心到L的距離dis;
b) 如果dis > r 則L和圓沒有交點;
c) 利用勾股定理,可以求出兩交點坐標,但要注意考慮L和圓的相切情況。
3. 如果L平行于X軸,做法與L平行于Y軸的情況類似;

4. 如果L既不平行X軸也不平行Y軸,可以求出L的斜率K,然后列出L的點斜式方程,和圓方程聯立即可求解出L和圓的兩個交點;

5. 如果L是線段,對于2,3,4中求出的交點還要分別判斷是否屬于該線段的范圍內。

posted on 2010-10-12 10:18 孟起 閱讀(719) 評論(0)  編輯 收藏 引用 所屬分類: 計算幾何
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久网站| 午夜精品久久久久久99热| 黄色工厂这里只有精品| 亚洲欧美影音先锋| 亚洲经典三级| 欧美精品aa| 99视频精品免费观看| 午夜免费久久久久| 亚洲制服av| 免费不卡在线观看| 午夜精彩国产免费不卡不顿大片| 亚洲一区二区三区在线视频| 国产日韩欧美黄色| 欧美性做爰猛烈叫床潮| 快播亚洲色图| 久久成人这里只有精品| 在线亚洲精品福利网址导航| 亚洲乱码精品一二三四区日韩在线 | 老鸭窝91久久精品色噜噜导演| 中文在线资源观看网站视频免费不卡| 亚洲区欧美区| 亚洲激情在线观看视频免费| 亚洲国产日韩在线| 牛牛影视久久网| 久久成人18免费观看| 尤物yw午夜国产精品视频明星| 国产精品任我爽爆在线播放| 欧美精品成人91久久久久久久| 欧美日韩免费一区二区三区| 欧美日韩另类一区| 国产精品久久久久久影院8一贰佰| 欧美激情视频免费观看| 国产日韩欧美成人| 亚洲国产欧美日韩精品| 亚洲精品一区二区三区av| 欧美中文字幕在线播放| 99视频日韩| 性做久久久久久| 久久成人免费网| 午夜天堂精品久久久久 | 加勒比av一区二区| 国产亚洲va综合人人澡精品| 亚洲第一福利在线观看| 欧美中文在线观看| 91久久精品www人人做人人爽| 久久深夜福利| 欧美一区中文字幕| 性久久久久久久久久久久| 一本大道久久a久久精品综合| 91久久夜色精品国产网站| 怡红院av一区二区三区| 国产一二三精品| 好吊妞**欧美| 日韩视频精品在线观看| 在线综合亚洲欧美在线视频| 一本大道久久a久久精二百| 99精品欧美一区| 亚洲精品中文字幕女同| 亚洲欧洲偷拍精品| 在线视频一区二区| 亚洲午夜久久久久久久久电影院 | 狠狠狠色丁香婷婷综合久久五月 | 欧美人成在线视频| 欧美电影免费观看高清完整版| 久久精品一二三| 久久天天躁狠狠躁夜夜av| 免费久久久一本精品久久区| 欧美成人精品| 国产日韩欧美另类| 亚洲免费福利视频| 欧美在线亚洲| 久久精品视频一| 欧美一级一区| 欧美黄色免费| 亚洲一区二区视频| 欧美日韩精品综合| 亚洲高清电影| 麻豆av一区二区三区| 亚洲黄色av| 久久久五月天| 国产日韩欧美综合在线| 亚洲免费观看| 久久嫩草精品久久久精品一| 亚洲国产婷婷香蕉久久久久久99| 午夜精品国产精品大乳美女| 欧美日韩国产a| 亚洲精品国产品国语在线app| 羞羞漫画18久久大片| 亚洲电影免费观看高清完整版在线观看 | 一区二区三区欧美视频| 香蕉成人久久| 亚洲精品日本| 欧美色欧美亚洲另类二区 | 欧美亚洲一区二区三区| 欧美精品18| 亚洲精品乱码久久久久久黑人| 久久精彩视频| 欧美在线日韩| 在线观看成人av| 欧美大片第1页| 牛夜精品久久久久久久99黑人| 亚洲人成在线免费观看| 亚洲精品久久久久久久久久久久| 欧美精品一区二区三区视频 | 欧美亚洲一区三区| 亚洲国产精品成人精品| 久久久国际精品| 91久久精品日日躁夜夜躁欧美| 欧美激情久久久久久| 亚洲免费视频观看| 久久久久天天天天| 亚洲精品一线二线三线无人区| 99热在这里有精品免费| 国产一区二区三区奇米久涩| 久久久久久穴| 国产精品久久久久久久第一福利 | 欧美日韩综合| 欧美一区二区三区另类| 欧美在线国产| 日韩亚洲欧美高清| 在线国产精品一区| 亚洲欧美日韩一区二区在线 | 国产精品啊v在线| 亚洲愉拍自拍另类高清精品| 亚洲女人小视频在线观看| 亚洲国产清纯| 久久精品国产999大香线蕉| 99精品热6080yy久久| 久久亚洲精品伦理| 亚洲欧美日韩直播| 欧美另类99xxxxx| 老牛国产精品一区的观看方式| 国产精品捆绑调教| 99re6热只有精品免费观看 | 一本久久综合| 精品二区久久| 欧美在线视频一区二区| 亚洲一区二区三区精品在线| 欧美精品一区二区三区久久久竹菊| 久久男女视频| 国产一区二区三区四区老人| 亚洲综合日韩中文字幕v在线| 一区二区三区精品国产| 欧美日韩18| 日韩午夜在线电影| 国产精品99久久久久久人| 在线亚洲免费| 欧美视频在线观看一区二区| 亚洲精品乱码久久久久久| 日韩一区二区精品视频| 欧美精品一区二区精品网| 欧美成人一区二区在线| 伊人久久综合97精品| 久久久久久伊人| 欧美电影在线免费观看网站| 亚洲大片av| 欧美激情中文字幕一区二区| 日韩视频免费| 久久精品亚洲一区二区| 国产亚洲精久久久久久| 久久久久久久一区二区| 欧美1级日本1级| 99精品福利视频| 国产美女精品视频免费观看| 亚洲欧美成人一区二区三区| 久久综合九色综合久99| 亚洲精品永久免费| 国产日韩欧美精品在线| 欧美精品亚洲精品| 久久国产色av| 日韩一二三在线视频播| 久久久久久久综合色一本| 亚洲人成网在线播放| 国产精品播放| 欧美国产一区二区| 亚洲综合日韩在线| 中文av一区特黄| 最近中文字幕mv在线一区二区三区四区 | 久久精品免费播放| 欧美黄色影院| 久久一区精品| 欧美在线免费观看视频| 在线亚洲欧美视频| 亚洲视频1区| 亚洲视频在线免费观看| 在线一区二区三区四区五区| 亚洲国产高清一区二区三区| 激情视频一区二区三区| 国产日韩欧美视频| 国产女人aaa级久久久级| 欧美日韩直播| 国产性天天综合网| 欧美韩国在线| 亚洲国产91精品在线观看| 美女诱惑黄网站一区| 免费观看亚洲视频大全| 女同性一区二区三区人了人一| 嫩草影视亚洲| 亚洲欧洲精品天堂一级| 牛牛精品成人免费视频|