假設我有一個由三個整數頂點(x1,y1),(x2,y2)和(x3,y3)給出的三角形。我可以使用什麼樣的算法來返回位於三角形內部的ALL(x,y)整數對的全面列表。以x,y位置的形式獲取三角形內的位置列表
回答
下面的算法應該是合適的:
排序的三角形頂點按x座標遞增。現在我們在一側(頂部或底部)有兩個線段(1-2和2-3),另一個線段(1-3)。線的方程(其含有鏈段)的
計算係數:
A * x + B * y + C = 0 A = y2 - y1 B = x1 - x2 C = x2 * y1 - x1 * y2
有(X1,Y1)和(X2,Y2)是線的兩個點。
對於每個範圍[X1,X2),(X2,X3]和X2(特殊情況)遍歷整數個範圍,然後針對每x如下:
- 查找頂部結合作爲y_top =( - A1 * x - C1)div B1。
- 查找下邊界爲y_bottom =( - A2 * y - C2 - 1)div B2 +1。
- 將(x,y_bottom)和(x,y_top)。
該算法不適用於嚴格的內部頂點。對於嚴格的內部頂點項目3.1和3.2略有不同。
我想你有一個你想測試的對子列表(如果這不是你的問題所在,請清楚地說明你的問題)。您應該首先將這些對存儲爲四叉樹或kd-tree結構,以便擁有足夠小的候選集合。如果你有幾分,這可能是不值得的麻煩(但如果你不這樣做,它不會很好地擴展)。
您還可以通過針對三角形的邊界框進行測試來縮小候選範圍。
然後,對每個候選對(x, y)
,解決a, b, c
系統
a + b + c = 1
a x1 + b x2 + c x3 = x
a y2 + b y2 + c y3 = y
(我讓你工作了這一點),並且這個點在三角形內,如果a
b
和c
都是積極的。
我喜歡光線投射,很好地描述在this Wikipedia article。在我的項目中用於相同的目的。該方法也可以在其他多邊形上縮放,包括凹面。不知道性能,但很容易被編碼的,所以你可以自己嘗試一下(我在我的項目中沒有性能問題)
此問題的正確名稱是三角形rasterization。
這是一個研究得很好的問題,有很多方法可以做到這一點。兩種流行的方法是:
掃描線掃描線。
對於每條掃描線,您都需要一些基本幾何圖形來重新計算 該行的開始和結束。見Bresenham's Line drawing algorithm。
測試邊界框中的每個像素以查看它是否在 三角形中。
這通常通過使用barycentric座標來完成。
大多數人認爲方法1)是因爲你不浪費時間測試像素,可以是三角形外,大約在邊框中的所有像素的一半以上有效。但是,2)有一個主要優勢 - 它可以更容易地並行運行,所以對於硬件來說通常是更快的選擇。 2)編碼也更簡單。
用於描述如何使用方法2的原始paper由Juan Pineda於1988年撰寫,被稱爲「多邊形柵格化的並行算法」。
對於三角形,它在概念上非常簡單(如果你學習重心協調)。如果將每個像素轉換爲三角形重心座標,alpha,beta和gamma - 那麼簡單測試就是alpha,beta和gamma必須介於0和1之間。
- 1. 的Visio形狀 - 獲得X,Y位置
- 2. 獲取三角形內的三角形?
- 3. Xamarin形式獲取位置
- 4. 獲取x和y位置?
- 5. AS3:獲取3D三角形的3D中間位置
- 6. 獲取任意一點在三角形中的位置
- 7. 驗證三角形內的鼠標位置 - Python
- 8. 使用UIScrollview時獲取x,y位置
- 9. Clojures的位置做形式
- 10. 找到一個列表中最近的x,y位置到另一個列表中的x,y位置?
- 11. 基於鼠標的X和Y位置旋轉矩形
- 12. 在不同的x,y位置畫布重繪一個矩形
- 13. java swing'JLabel'和圖形元素的位置(x,y)不一樣
- 14. 在時間T在位置x,y處的多邊形
- 15. qt。如何根據位置獲取圖形項目(x和y值)
- 16. 在較低的三角形內抓取三角形
- 17. android - 如何獲取圖像邊緣x/y位置imageview內
- 18. Bing Maps位置api:以字符串形式獲取響應
- 19. WebGL的三角形鼠標位置旋轉
- 20. 檢測飛機上三角形物體的位置
- 21. 如何在用戶點擊的位置畫一個三角形
- 22. OpenGL:指定三角形的意外頂點位置
- 23. UIScrollView visibleRect與pdf內容位置x,y
- 24. 獲取位於'n'位置'x'位置的範圍內的數字
- 25. 如何獲取XYSeries x位置的屏幕x位置?
- 26. x的左邊三角形
- 27. 獲取畫布內的矩形的光標位置
- 28. 提取以y座標矩陣格式表示的三角形的頂點
- 29. 從X和Y獲取網格行和列位置
- 30. 使用x和y位置設置textarea的插入位置
這將是無限的點數,除非您施加一些一種約束,例如座標是整數? –
請註明。如果@PaulR是對的,解決方案與我在我的回答中提出的建議非常不同。 –
你強調你想要所有的對,但顯然有很多是不計其數的。你是指整數對嗎?在這種情況下,這是光柵化的問題,關於這個問題有大量的文獻。這是一個很好的教程:http://joshbeam.com/articles/triangle_rasterization/您可能需要調整它,這取決於您在'inside'中的含義,因爲我不知道是否要包含邊界。 – sigfpe