輪廓布林運算原理及實現思路

2021-09-26 02:17:11 字數 2300 閱讀 6178

輪廓布林運算包括以下運算:反、交、並、差、異或。

一、取反

乙個輪廓既可以代表實體也可以代表負實體,約定輪廓逆時針時為實體輪廓,順時針時為負實體輪廓,輪廓取反即反轉輪廓方向即可。

二、輪廓交

三、輪廓並

四、輪廓差

五、輪廓異或

兩個多邊形的異或是乙個多邊形,其內部區域為原來兩個多變性差的並

六、其中取反和交是兩種基礎運算,其他運算可以基礎運算的組合來實現

取反:交:

並:差:

異或:七、輪廓交實現

輪廓取反實現就是將輪廓方向反轉,輪廓交實現稍微複雜一點。

兩種方法,先說第一種,以兩個實體輪廓p、q為例;

(1)求p、q交點

(2)最終求交得到的輪廓的頂點由p\q交點、p在q內部的頂點、q在p內部的頂點三部分構成,如下圖

(3)這三部分點比較容易求得,那麼接下來的關鍵是這些點的順序問題了,

兩個實體輪廓求教後所得也是乙個實體輪廓,即頂點為逆時針方向,這些頂點是沿著原始輪廓邊乙個接乙個的連線著的,

即頂點中和原始輪廓p相關的兩部分:intersection vertex、vertex of p in q,在p看來是沿著p的邊進行排序的;而和原始輪廓q相關的兩部分:intersection vertex、vertex of q in p,在q看來是沿著q的邊進行排序的。這樣兩個排序好的頂點列表進行合併即得到求教後輪廓的頂點列表;當然合併是有一定規則的。

(4)規則即:1.與p相關的部分:intersection vertex、vertex of p in q依據在p邊上的位置進行排序得到lstvertexp;與q相關的兩部分intersection vertex、vertex of q in p依據在q邊上的位置進行排序得到lstvertexq;2.由lstvertexp第乙個點出發,若下乙個點與當前點在p中的同一條邊上並且它們倆的中點在輪廓q內,那麼繼續第2步;否則切換到lstvertexq中與當前點對應的點開始出發,規則同第2步;3.直到形成閉合輪廓,並且這三部分中所有點都已走過;這樣即得到相交的輪廓。

具體過程:當前點為lstvertexp中點0,由當前點0出發,下一點1與點0同在p的一條邊上,然後當前點為點1,下一點2與點1不屬於p上的同一條邊,即尋找當前點在lstvertexq上的位序即lstvertexq中的點6,當前點為點6,由當前點出發,下一點7與點6同屬於q中的一條邊,當前點為點7,下一點8與點7不滿足條件,點前點切換為lstvertexp中的點2...最終形成兩個輪廓。

再來看第二種方法,不用於第一種方法以點為單位尋找下一點來最終構成輪廓,第二種方法以邊為單位,尋找下一條邊來構成輪廓。

可以看出第二種方法相對較為簡單,那麼還有可以優化的地方嗎?是的。

八、兩種方法比較

1.第一種以點為單位,粒度小;第二種以邊為單位,粒度大,問題規模較小;

2.第二種方法以邊為單位,邊是有方向的,這樣以邊來尋找下一條邊最終構成輪廓的過程要簡單些;

3.兩種方法都可以優化,第一種求交點過程以及第二種求「交邊」過程可以用空間分割槽二叉樹來減小計算次數。

九、其他輪廓布林運算可通過組合取反、求交運算來實現。

python 布林運算

給定乙個布林表示式和乙個期望的布林結果 result,布林表示式由 0 false 1 true and or 和 xor 符號組成。實現乙個函式,算出有幾種可使該表示式得出 result 值的括號方法。示例 1 輸入 s 1 0 0 1 result 0輸出 2解釋 兩種可能的括號方法是1 0 0...

布林運算製做火箭

首先把要製作的火箭看一下 如圖 首先畫兩個橢圓,然後把它們交集獲得乙個這樣的圖形有一點像火箭的身體了 再然後又畫兩個橢圓還是跟剛剛一樣的但是不是交集了,畫出來以後,把乙個橢圓放到另乙個橢圓的上面,然後來乙個減去頂層形狀就行了.又畫乙個橢圓,把橢圓放到有點像火箭的下面,但是橢圓的圖層一定要到火箭圖層的...

布林運算子

a,b 1,2 有乙個為假即為假 print a 1 and b 2 true and true true print a 1 and b 2 true and false false 有乙個為真即為真 print a 1 or b 2 true or true true print a 1 or ...