如圖,點p在三角形abc內部,可以通過以下三個條件判斷:
點p和點c在直線ab同側
點p和點b在直線ac同側
點p和點a在直線bc同側
這裡的c就是我們說的在ab的左邊,就是你用你的右手四指指向ab的朝向,然後大拇指那邊就是「左邊」了。
那麼我們如何判斷c和ab的位置關係呢?
先給出**,然後給予解釋:
typedef struct
point;
//input : 直線s->e,點p
//return :
//> 0 p is left of the line
//= 0 p is on the line
//< 0 p is right of the line
bool isleftpoint(point s, point e, point p)
讓我們解釋一下上述**。
這個函式很短,這個形式有點奇怪,為什麼這樣就能判斷呢?
我們把return的那行重寫一下:
((e.x - s.x) * (p.y - s.y)) - ((p.x - s.x) * (e.y - s.y)) > 0 //等價
而這個式子的樣子,和叉乘意外的有點相似。
我們接觸叉乘的時候都是在三維空間,那麼這個二維空間的形似叉乘的式子是怎麼來的?
其實你可以把二維向量看做是第三維為0的三維向量,這樣你套叉乘的公式,可以得到:
(x1,y1,0) x (x2,y2,0) = (0, 0, x1y2 – y1x2)
但是我們一般取的是這個向量的最後一維x1y2 - y1x2,這樣看起來好像就是叉乘的結果是乙個數量而非向量了。
再回到我們的isleftpoint函式,實際上我們就是根據三個點構造了兩個向量然後做了一次叉乘的運算,我們是用的向量se叉乘向量sp
其實,這個x1y2 - y1x2還有乙個比較神奇的特點:
如果x1y2 - y1x2的結果為負,那麼說明sep三個點必定是按照逆時針順序排列的
判斷點是否在三角形外
我們已經知道了如何判斷乙個點是否在直線的左側,那麼如何利用這個來判斷點是否在三角形外呢?
其實不難想到,如果我們把三角形的點順序按照順時針方向排列,也就是abc的順序:
如果三角形abp、bcp、cap都是按照逆時針的方向排列的,那麼p必然在abc的外部。
float isin********(float x, float y, float ax, float ay, float bx, float by, float cx, float cy)
{ return (bx - ax) * (y - ay) > (by - ay) * (x - ax) &&
(cx - bx) * (y - by) > (cy - by) * (x - bx) &&
(ax - cx) * (y - cy) > (ay - cy) * (x - cx) ? false : true;
判斷乙個點是否在三角形內部
題目 在二維座標系中,所有的值都是double型,那麼乙個三角形可以由三個點來代表,給定三個點代表的三角形,再給定乙個點 x,y 判斷 x,y 是否在三角形中 基本思路 如果乙個點o在三角形的內部,那麼從三角形的乙個點出發,逆時針走過所有邊的過程中,點o始終在走過邊的左邊。如果點o在外側,則不滿足這...
判斷乙個點是否在三角形內部
判斷乙個點是否在三角形內部 在二維座標系中,所有的值都是double型別,那麼乙個三角形可以由3個點來代表,給定3個點代表的三角形,再給定乙個點 x,y 判斷 x,y 是否在三角形中 輸入描述 輸入有四行,每行兩個浮點數。前三行的6個數分別代表三角形的三個頂點的座標 最後兩個數分別表示 x,y 輸出...
判斷一點是否在三角形內
一點 d 是否在三角形 abc 內,相對於ab邊來說,d點在三角形內一定要和c點在 ab 邊同側,對於a,b 點也用相同的方法去判斷d點是否於其在相應邊的同側,這種方法還可以用來判斷多點是不是可以構成乙個凸多邊形。下邊以 ab 為邊例,驗證 c,d兩點是否在ab邊同側,ab 的在二維座標中的線性方程...