滿天的星座2017-06-12 09:31:32
計算幾何中挺常見的題目
有△ABC
,以及點O(x, y)
,設三角形頂點座標為:A(x1,y1)、B(x2,y2)、C(x3,y3)
點O在△ABC中,點O和點C在直線AB的同一側,則有:
[(x-x1)(y2-y1) - (y-y1)(x2-x1)][(x3-x1)(y2-y1) - (y3-y1)(x2-x1)] > 0
同理,點O和點B在直線AC的同一側;點O和點A在直線BC的同一側。
滿足以上三個條件,點O就在△ABC內。
個人比較喜歡這個方法,因為只含有四則運算和大小判斷,不涉及三角函數和平方開方等運算,速度較快。如果有更好的方法,歡迎指教。
phpcn_u15822017-06-12 09:31:32
可以透過 Barycentric coordinate system (重心座標)去處理。
參考連結:https://en.wikipedia.org/wiki...
設要測的點為 (x0, y0),三角形三點分別為 (x1, y1),(x2, y2),(x3, y3)
根據重心座標的定義:
x0 = a * x1 + b * x2 + c * x3
y0 = a * y1 + b * y2 + c * y3
a + b + c = 1
其中 a b c 分別為三個係數。 當且僅當 a b c 均大於等於 0 且小於等於 1 時,點 (x0, y0) 在由點 (x1, y1)、點 (x2, y2) 和點 (x3, y3) 構成的三角形內。
由上面的定義可得出 a b c 的解:
a = ((y2 - y3)*(x0 - x3) + (x3 - x2)*(y0 - y3)) / ((y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3))
b = ((y3 - y1)*(x0 - x3) + (x1 - x3)*(y0 - y3)) / ((y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3))
c = 1 - a - b
寫成 JS 方法:
function pointInTriangle(x0, y0, x1, y1, x2, y2, x3, y3) {
var pisor = (y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3);
var a = ((y2 - y3)*(x0 - x3) + (x3 - x2)*(y0 - y3)) / pisor;
var b = ((y3 - y1)*(x0 - x3) + (x1 - x3)*(y0 - y3)) / pisor;
var c = 1 - a - b;
return a >= 0 && a <= 1 && b >= 0 && b <= 1 && c >= 0 && c <= 1
}
漂亮男人2017-06-12 09:31:32
這還不簡單
例如x點 三角形 a、b、c三個角
x為一個角的頂點 如果
axb bxc cxa 三個角和是360度 那麼 x點在三角形內
很多文章的
搜尋一下咯
http://www.cnblogs.com/baie/a...