判斷空間射線是否穿過空間三角形的程式實現

2021-04-14 08:04:26 字數 1582 閱讀 8351

題目:在三維座標系中,任一射線ab,與一三角形abc,判斷射線是否穿過三角形.

應用:在三維建模軟體和三維遊戲中,選取螢幕上乙個基本幾何圖形或物體是其基本功能之一.同時遊戲需要演算法有非常高的效率,但不需要有極高的精確程度.

原理:以射線ab為三維座標系的ox軸,過濾掉三角形所有點座標都在負半軸的情況,則轉化為乙個在yoz二維座標中三角形abc是否包含原點的問題,若o在abc中,則三角形oab,obc,oca的面積與abc面積相等,否則大於abc的面積.

實現:

1.已知射線ab,求以a為原點,ab方向為x軸的座標系o'x'y'z'的變換矩陣;

2.將三角形三個頂點座標轉化到新的座標系中;

3.若三角形三個頂點座標的x值均小於零,則認為射線不經過三角形(注意,此處簡略了一些射線不經過三角形但不影響視覺效果的情況);

4.在y'o'z'中求原點到三角形各頂點的距離;

5.根據海公式求出三角形oab,obc,oca,abc的面積;

6.若在一定精度內oab+obc+oca>abc,則認定原點在三角形abc外.

float ********area(float a, float b, float c)

bool islinecross********(vector3 a, vector3 b, vector3 *tri)

if(v[0].x <= 0 && v[1].x <= 0 && v[2].x <= 0) return false;

float ab = sqrtf((v[0].y - v[1].y) * (v[0].y - v[1].y) + (v[0].z - v[1].z) * (v[0].z - v[1].z));

float bc = sqrtf((v[1].y - v[2].y) * (v[1].y - v[2].y) + (v[1].z - v[2].z) * (v[1].z - v[2].z));

float ca = sqrtf((v[2].y - v[0].y) * (v[2].y - v[0].y) + (v[2].z - v[0].z) * (v[2].z - v[0].z));

float oa = sqrtf(v[0].y * v[0].y + v[0].z * v[0].z);

float ob = sqrtf(v[1].y * v[1].y + v[1].z * v[1].z);

float oc = sqrtf(v[2].y * v[2].y + v[2].z * v[2].z);

float aob = ********area(oa, ob, ab);

float boc = ********area(ob, oc, bc);

float coa = ********area(oc, oa, ca);

float abc = ********area(ab, bc, ca);

if(aob + boc + coa - abc > 0.0002)

return true;

}注:vector3類是乙個具有x,y,z分量的三維座標,類中過載了'='操作符.

三角形判斷

description 婁月的妹妹劉月是個初中生,某天回來興高采烈的回家告訴姐姐他學會了如何憑藉三角形三邊判斷三角形的形狀 設兩條短邊為啊a,b 長邊為c,判斷a a b b和c c的關係 於是婁月告訴劉月,給她三條邊,她可以在一秒之內知道三角形是直角,鈍角還是銳角三角形,當然,這麼快只有程式設計才...

判斷三角形

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 小明非常喜歡研究三角形。現在,小明已經知道三角形的三條邊,如果三條邊能組成三角形,小明就會很高興,他就會得到乙個 ye 如果他經過進一步的研究知道它又是等腰三角形,他又會得乙個 ye 他再次研究出它又是乙個等邊三角形,當然,他又...

判斷三角形

problem description 給定三條邊,請你判斷一下能不能組成乙個三角形。input 輸入資料第一行包含乙個數m,接下有m行,每行乙個例項,包含三個正數a,b,c。其中a,b,c 1000 output 對於每個測試例項,如果三條邊長a,b,c能組成三角形的話,輸出yes,否則no。sa...