2010-05-11 106 views
4

我試圖編程生成二維多邊形的斜邊。例如,給定的4個頂點界定的正方形陣列,我要生成這樣的事:生成二維多邊形的斜邊

_________ 
|\ _____ /| 
| |  | | 
| |  | | 
| |_____| | 
|/_______\| 

但計算的內部形狀的頂點莫名其妙我。

簡單地創建一個原始形狀的副本並縮小它在一般情況下不起作用。 (想象一下,試圖以這種方式斜切一個N形多邊形。)

到目前爲止,我的算法涉及分析相鄰邊(頂點的三元組;例如,一個正方形的左下角,頂點左右角和頂點右頂點)。從那裏,我需要找到它們之間的角度,然後沿着該角度創建一個頂點,具體取決於我希望斜面的深度。

而且因爲我沒有太多的數學背景,所以我被卡住了。我如何找到中心角度?還是有更簡單的方法來攻擊這個問題?

+0

請問你總是有4個頂點或者你需要一個解決方案,對於任意數量的工作嗎? – Skywalker 2010-05-11 20:37:20

+0

以什麼方式簡單地縮小它不起作用? – mathmike 2010-05-11 20:38:26

+0

@Skywalker我需要一個適用於任何凸或凹多邊形的通用解決方案。 – Metaphile 2010-05-11 20:50:16

回答

1

一般算法非常複雜。您正在查找的操作稱爲偏移多邊形;如果你搜索周圍的,你可能會發現一些指點/論文等

如果你在或接近C++的工作,你可以嘗試CGAL

+0

這似乎是我正在尋找的答案。但是,這比我所希望的更復雜。現在我將不得不放棄小說。 – Metaphile 2010-06-04 21:10:51

2

我會做這樣的事情:

每方,製作副本,並將它推「向內」所需的斜角的寬度。 ('內部'沿着側面的法線向量)。一旦你完成了這些,找到新副本(以及它們先前相交的任何一側的副本)之間的交點並將其用作內部形狀的頂點。對於交叉點,您需要考慮真實線條(而不是線段),因爲凹形區域中的邊線需要增長。

如果您嘗試將其用於小於您的斜角尺寸寬度兩倍的區域的形狀上,則會發生可怕的破裂,否則應該是正常的。 (我相信你可以添加一些東西來處理這些情況,但這是另一個討論)

或者,如果你想斜角寬度是相對於頂點,你也可以使用相同的原則推入那些'內部' 。通過平均它連接的邊的法線來估計頂點的法線角。

0

假設你的要點是p1,創建相鄰邊的點是點p2和p3。然後從p1到p2和p1到p3取一個向量。像 -

v1 = p2 - p1 
v2 = p3 - p1 

找到v1和v2之間的角度並生成您的要點。你可以使用this找到角度。