多邊形或輪廓等距離外擴或收縮

2021-08-26 02:34:20 字數 2085 閱讀 9662

給定乙個簡單多邊形,多邊形按照順時針或者逆時針的數許排列

內部等距離縮小或者外部放大的多邊形,實際上是由距離一系列平行已知多邊形的邊,並且距離為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點集,尋找可旋轉的最小面積的...