二維平面上判斷點是否在三角形內

2021-08-24 23:26:00 字數 2949 閱讀 3142

已知三角形的三個頂點座標,判斷某個點是否在三角形中(在三角形的邊上,我們也視作在三角形中),本文給出了三種方法。

演算法1

利用面積法,如上圖所示,如果點p在三角形abc的內部,則三個小三角形pab, pbc, pac的面積之和 = abc的面積,反之則不相等。

已知三角形的三個頂點座標求其面積,可以根據向量的叉乘,參考here。

該演算法詳見後面**中的函式:ispointin********1

演算法2

首先看一下這個問題,如何判斷某兩個點在某條直線的同一側(**中函式:ispointatsamesideofline)?

根據向量的叉乘以及右手螺旋定則,ab^am (^表示叉乘,這裡向量省略了字母上面的箭頭符號)的方向為向外指出螢幕,ab^an也是向外指出螢幕,但ab^ao的方向是向內指向螢幕,因此m,n在直線ab的同側,m ,o在直線ab的兩側。實際計算時,只需要考慮叉積的數值正負

假設以上各點座標為a(0,0), b(4,0), m(1,2), n(3,4), o(3,-4), 則:

ab^am = (4,0)^(1,2) = 4*2 - 0*1 = 8

ab^an = (4,0)^(3,4) = 4*4 – 0*3 = 16

ab^ao = (4,0)^(3,-4) = 4*-4 – 0*3 = –16

以上的問題解決了,就很容易的用來判斷某個點是否在三角形內,如果p在三角形abc內部,則滿足以下三個條件:p,a在bc的同側、p,b在ac的同側、pc在ab的同側。某乙個不滿足則表示p不在三角形內部。

該演算法詳見後面**中的函式:ispointin********2

演算法3

該方法也用到了向量。對於三角形abc和一點p,可以有如下的向量表示:

p點在三角形內部的充分必要條件是:1 >= u >= 0,   1 >= v >= 0,   u+v <= 1。

已知a,b,c,p四個點的座標,可以求出u,v,把上面的式子分別點乘向量ac和向量ab

解方程得到:

解出u,v後只需要看他們是否滿足「1 >= u >= 0, 1 >= v >= 0, u+v <= 1」,如滿足,則,p 在三角形內。

(u = 0時,p在ab上, v = 0時,p在ac上,兩者均為0時,p和a重合)

該演算法詳見後面**中的函式:ispointin********3

演算法4

該演算法和演算法2類似,可以看作是對演算法2的簡化,也是用到向量的叉乘。假設三角形的三個點按照順時針(或者逆時針)順序是a,b,c。對於某一點p,求出三個向量pa,pb,pc, 然後計算以下三個叉乘(^表示叉乘符號):

t1 = pa^pb,

t2 = pb^pc,

t3 = pc^pa,

如果t1,t2,t3同號(同正或同負),那麼p在三角形內部,否則在外部。

該演算法詳見後面**中的函式:ispointin********4

經過測試,演算法4最快,演算法3次之,接著演算法2,演算法1最慢。直觀的從計算量上來看,也是演算法4的計算量最少。

以下是**,定義了兩個類:二維向量類 和 三角形類

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

//類定義:二維向量

class vector2d

vector2d():x_(0), y_(0){}

//二維向量叉乘, 叉乘的結果其實是向量,方向垂直於兩個向量組成的平面,這裡我們只需要其大小和方向

double crossproduct(const vector2d vec)

//二維向量點積

double dotproduct(const vector2d vec)

//二維向量減法

vector2d minus(const vector2d vec) const

//判斷點m,n是否在直線ab的同一側

static bool ispointatsamesideofline(const vector2d &pointm, const vector2d &pointn,

const vector2d &pointa, const vector2d &pointb)

}; //三角形類

class ********

//計算三角形面積

double compute********area()

bool ispointin********1(const vector2d pointp)

bool ispointin********2(const vector2d pointp)

bool ispointin********3(const vector2d pointp)

bool ispointin********4(const vector2d pointp)

}; int main()

}

判斷點是否在三角形內

概述 給定三角形abc和一點p x,y,z 判斷點p是否在abc內。這是遊戲設計中乙個常見的問題。需要注意的是,這裡假定點和三角形位於同乙個平面內。本文介紹三種不同的方法,由淺入深 一 內角和法 連線點p和三角形的三個頂點得到三條線段pa,pb和pc,求出這三條線段與三角形各邊的夾角,如果所有夾角之...

判斷點是否在三角形內

給定三角形abc和一點p x,y,z 判斷點p是否在abc內。這是遊戲設計中乙個常見的問題。需要注意的是,這裡假定點和三角形位於同乙個平面內。本文介紹三種不同的方法,由淺入深 連線點p和三角形的三個頂點得到三條線段pa,pb和pc,求出這三條線段與三角形各邊的夾角,如果所有夾角之和為180度,那麼點...

判斷點是否在三角形內

問題 在二維座標系中,已知三角形頂點的座標,那麼對於座標系中的任意一點p,判斷是否在三角形內?double area point a,point b,point c bool is point a,point b,point c,point d 設s area abc s1 area abd s2 ...