快速檢測乙個點是否包含在乙個2d三角形內

2022-09-15 11:57:10 字數 1425 閱讀 7613

如下圖所示:

由三條線段連線起來的a,b,c三個點在2d平面中構成了乙個三角形。

p點位於三角形外, q點位於三角形內,那麼用什麼方案來判定乙個任意點是否位於三角形內部呢?

我們得找到乙個規律:

假定你按照順時針的方向從a點出發向b點前進再到c點繼而在到a點,你會發現如果點在三角形內,則點一定位於你的右手,如果在三角形外的點,一定位於你的左手

ok,規律找到了,就能用實際的演算法來實現。從上面的規律可以看出,三角形的三個頂點是有序的,這種結構可以保證更快速的計算

,但是也可以不用有序的結構。下面給出的**以無序頂點來計算包含關係的:

private

var temp_0_v:vector_2d = new vector_2d();

private

var temp_1_v:vector_2d = new vector_2d();

private

var value_0:number = 0;

private

var value_1:number = 0;/**

判定當前的三角形是否包含乙個點

@param            t    當前的任意三角形,有三個屬性:t.pa_v,t.pb_v,t.pc_v,每乙個屬性就

表示乙個頂點,而且都是vector_2d物件

@param            pos_v    需要計算的乙個點的向量表示            

*/public function contains(t:********, pos_v:vector_2d):boolean

//計算c->p向量叉乘c->a向量

temp_0_v.x = pos_v.x - t.pc_v.x;

temp_0_v.y = pos_v.y - t.pc_v.y;

temp_1_v.x = t.pa_v.x - t.pc_v.x;

temp_1_v.y = t.pa_v.y - t.pc_v.y;

value_0 = temp_0_v.cross( temp_1_v );

return value_0 * value_1 >= 0;}//

這分**是我as3 2d庫的乙個工具類的**片段。

通過上面講的規律,我們就能推出三角形和線段,三角形和三角形相交等的快速實現演算法。

由此也可以推出凸多邊形相關的演算法實現。 

下面我們來聊聊三角形吧。

這裡從三個角度來看三角形:

1. 三條線段連線起來的三個點在2d平面中構成了乙個三角形

2.三角形可以看成是三對平行線的交集

3.三角形可以看做三個半平面的交集

後面,再來看看這三個角度帶來的應用 

如何判斷乙個變數是否包含在表的乙個欄位中

今天在做乙個資料庫查詢的時候遇到了乙個難題,就是如何根據給定的引數判斷該引數是否在資料庫表的某個欄位中,並返回記錄集。例如 給定引數為 2 資料庫表的某個字段值為 1,2,4,15或者3,11,13或者null等等 那麼如何根據傳進來的2找到相應的記錄,即字段值為1,2,4,15的那條記錄 最後找到...

oracle中判斷乙個串中是否包含另乙個串

select decode instr corporateaaaa floor aaaa 0,0,1 from dualinstr方法的格式為 instr 源字串,目標字串,起始位置,匹配序號 例如 instr corporate floor or 3,2 中,源字串為 corporate floo...

是否可以在另乙個CSS檔案中包含乙個?

是否可以在另乙個css檔案中包含乙個?是的,可以使用 import並提供css檔案的路徑,例如 import url mycssfile.css 要麼 import mycssfile.css 是 import url base.css 注意 css import規則就是這樣做的。例如,import...