將射線定義為乙個基點和向量,那麼射線上的任意點可以表示為p = p0 + tv,其中p0為基點,v為向量,t滿足 t>=0.採用重心座標定義三角形,三角形上的任意點可以表示為:p = w v0 + u v1 + v v2, 其中u+v+w = 1. 由此,將射線方程代入上式,則:
p0 + tv = (1 - (u+v)) v0 + uv1+vv2.
利用克萊姆法則計算得出t,u,v. 交點位於三角形內的條件為: 0 <= u <= 1, 0 <= v <= 1, 0 <= u+v <= 1. 否則位於三角形外部的平面上。
該方法是moller, trumbore與2023年提出的。
下面我們用**實現(c++):
當有大量射線和三角形求交的時候,計算是很耗時的。下面我們用tbb庫來實現平行計算。我們使用tbb提供的parallel_for. 為了使用parallel_for,我們需要定義乙個函式物件類來包裝計算的**:
在parallelcomputeintersections2::operator()中,我們加入了一些**來快速判斷一條射線和乙個三角形有沒有可能相交。這些**對於提高運算速度是很有用的。經過在我本地的資料集測試中(約2萬個射線和2萬個三角形),這個判斷使原來18s的計算時間減少到15s.
下面是主函式
**中使用了tbb提供的乙個並行向量來儲存運算結果。
使用上面提到的資料集測試,在我的雙核筆記本上結果如下.
在沒有加入快速判斷**的情況下:
順序計算:38.25s
平行計算:18.57s
加入快速判斷**的情況下:
順序計算:26.31s
平行計算:15.11s
預設tbb會根據當前cpu核的數量來設定並行任務數量。從結果來看,效果還是比較明顯的。
求大三角形中三角形個數
一道筆試程式設計題要求求乙個大三角形中所有小三角形的個數,大約是下面這種情況 首先想到是的將問題由求邊長為n的三角形個數 求邊長為n 1的三角形個數 求邊長為1的三角形個數 1,回溯求得所有三角形個數。但是再仔細一看因為有重疊三角形和倒置的三角形,所以這個方法不可行。接著找到三角形個數由三部分組成 ...
求三角形性質
作 者 b23 完成日期 2014年 10 月 31 日 版 本 號 v1.0 輸入描述 輸入三角形的三邊 a,b,c,值,根據其數值,判斷是否能構成三角形,若能,還有判斷其三角形的性質 等邊三角形,等腰三角形,直角三角形和任意三角形。using system using system.collec...
計算三角形面積
計算三角形面積 總時間限制 1000ms 記憶體限制 65536kb 描述平面上有乙個三角形,它的三個頂點座標分別為 x1,y1 x2,y2 x3,y3 那麼請問這個三角形的面積是多少。輸入輸入僅一行,包括6個單精度浮點數,分別對應x1,y1,x2,y2,x3,y3。輸出輸出也是一行,輸出三角形的面...