給定乙個簡單多邊形,多邊形按照順時針或者逆時針的數許排列
內部等距離縮小或者外部放大的多邊形,實際上是由距離一系列平行已知多邊形的邊,並且距離為l的線段所構成的。
外圍的是原多邊形,內側是新的多邊形
多邊形的相鄰兩條邊,l1和l2,交於pi點
做平行於l1和l2,平行線間距是l的,並且位於多邊形內部的兩條邊,交於qi
我們要計算出qi的座標
如圖,
piqi向量,顯然是等於平行四邊形的兩個相鄰邊的向量v1和v2的和的
而v1和v2向量的方向,就是組成多邊形的邊的方向,可以用頂點差來表示
v1和v2向量的長度是相同的,等於平行線間距l與兩個線段夾角的sin值的除法。
即: qi = pi + (v1 + v2)
qi = pi + l/sinθ * ( normalize(v2) + normalize(v1))
sin θ = |v1 × v2 | /(|v1|*|v2|) = |v1 × v2 |
⑴、獲取多邊形頂點陣列plist;
⑵、計算dplist[vi+1-vi];
⑶、單位化normalizedplist,得到ndp[dpi];(用同乙個陣列儲存)
⑷、sinα = dp(i+1) x dp(i);
⑸、qi = pi + d/sinα (ndpi+1-ndpi)
⑹、這樣一次性可以把所有頂點計算完。
注意,交換qi表示式當中ndpi+1-ndpi的順序就可以得到外部多邊形頂點陣列。
import foundation
class point2d
init( point:point2d)
}func + (left:point2d, right:point2d)->point2d
func - (left:point2d, right:point2d)->point2d
func * (left:point2d, right:point2d)->double
func * (left:point2d, value:double )->point2d
// 自定義的向量差乘運算符號,
infix operator ** {}
func ** (left:point2d, right:point2d)->double
var plist = [point2d]() // 原始頂點座標, 在initplist函式當中初始化賦值
var dplist = [point2d]() // 邊向量dplist[i+1]- dplist[i] 在 initdplist函式當中計算後賦值
var ndplist = [point2d]() // 單位化的邊向量, 在ini***plist函式當中計算後膚質,實際使用的時候,完全可以用dplist來儲存他們
var newlist = [point2d]() // 新的折線頂點,在compute函式當中,賦值
// 初始化頂點佇列
func initplist()
// 初始化dplist 兩頂點間向量差
;
我的工程執行效果圖
工程位置:
多邊形等距縮放
給定乙個簡單多邊形,多邊形按照順時針或者逆時針的數許排列 內部等距離縮小或者外部放大的多邊形,實際上是由距離一系列平行已知多邊形的邊,並且距離為l的線段所構成的。外圍的是原多邊形,內側是新的多邊形 演算法構造 多邊形的相鄰兩條邊,l1和l2,交於pi點 做平行於l1和l2,平行線間距是l的,並且位於...
halcon繪製多邊形輪廓的方法
在使用halcon的過程中,有時候需要自己建立乙個多邊形輪廓,例如進行模板匹配時,可以自己建立乙個多邊形輪廓來建立匹配模板,故而介紹halcon繪製多邊形輪廓的方法,主要採用以下兩個運算元實現 1.gen contour polygon rounded xld建立帶圓角的多邊形輪廓,座標和圓角可以通...
OpenCV之使用多邊形將輪廓包圍
在實際的應用中,常常需要將檢測到的輪廓用多邊形來表示,主要涉及到以下函式。此函式計算並返回指定點集最外面的矩形邊界。rect boundingrect inputarray points 函式的輸入是二維的點集,可以是std vector或mat型別。此函式對於給定的2d點集,尋找可旋轉的最小面積的...