bool GeometricTools::intersect(Vector3f ray_o, Vector3f ray_d,
Vector3f tri_p0, Vector3f tri_p1, Vector3f tri_p2,
Vector3f& res)
{
float t = 0;
// for the plane: Xn(x - X0) + Yn(y - Y0) + Zn(z - Z0) = 0
// for the line: L(t) = s + td
// t = (n * p)/(n * d)
Vector3f p1 = tri_p1 - tri_p0;
Vector3f p2 = tri_p2 - tri_p0;
// 注意glm中三角形存储为顺时针,这里需要逆转一下
Vector3f normal = Cross(p2, p1);
Vector3f P = tri_p0 - ray_o;
float fDiv = Dot(normal, ray_d);
if (fabs(fDiv) < FloatEPS)
{
return false;
}
t = Dot(normal, P) / fDiv;
if (t <= 0)
{
return false;
}
res.x = ray_o.x + t * ray_d.x;
res.y = ray_o.y + t * ray_d.y;
res.z = ray_o.z + t * ray_d.z;
// is the point in the triangle?
// 面积法判断
// http://www.cnblogs.com/cgwolver/archive/2009/03/26/1257611.html
Vector3f p01 = tri_p1 - tri_p0;
Vector3f p02 = tri_p2 - tri_p0;
Vector3f pr0 = tri_p0 - res;
Vector3f pr1 = tri_p1 - res;
Vector3f pr2 = tri_p2 - res;
float s1 = Magnitude(Cross(p01, p02))/2.0;
float s21 = Magnitude(Cross(pr0, pr1))/2.0;
float s22 = Magnitude(Cross(pr0, pr2))/2.0;
float s23 = Magnitude(Cross(pr1, pr2))/2.0;
float s2 = s21 + s22 + s23;
if (fabs(s1 - s2) > FloatEPS)
{
return false;
}
return true;
}
分享到:
相关推荐
直线、射线、线段求交;平面三角形求交,空间三角形求交的代码,可以用在C++上。
利用eigen库内矩阵运算函数,写了LinesPositionRelationship3D类。实现了确定三维空间任意两条直线位置关系并获得在平行和交错条件下的两直线距离的功能。该类是在确定空间两圆柱轴线关系下的副产品。
包括简单的碰撞检测计算,函数包括: 向量加减法,向量点乘与叉乘,向量缩放,向量长度 三角形面积,点到直线(和线段)的距离...直线(和线段)与三角形碰撞,三角形与三角形碰撞 两平行矩形碰撞,平行矩形与椭圆碰撞
IntersectTri.doc 判断直线是否与三角形相交的解析几何知识基础。
7.13判断线段是否与空间三角形相交 27 7.14计算两条直线的交点 28 7.15计算直线与平面的交点 28 7.16计算两平面的交线 29 7.17点到直线的距离 29 7.18 计算点到平面的距离 29 7.19计算直线到直线的距离 30 7.20空间...
* 等腰三角形的轴对称性:等腰三角形是轴对称图形,顶角平分线(底边上的高线或中线)所在的直线是它的对称轴。 * 等腰三角形的底角只能为锐角,不能为钝角或直角。 * 等腰三角形的顶角可以为钝角或直角。 二、等腰...
3. 平行于三角形一边的直线和其他两边相交,所构成的三角形和原三角形相似。 三、黄金分割点 黄金分割点是指把线段AB分成两条线段AC和BC,如果=≈0.618,那么线段AB被点C黄金分割。其中点C叫做线段AB的黄金分割点...
在平面直角坐标系中,对于一条与x轴相交的直线,如果把x轴绕着交点按逆时针方向旋转到和直线重合时所转的最小正角为 ,则 就叫做直线的倾斜角;当直线和x轴平行或重合时,规定此时直线的倾斜角为0°,因此,倾斜角...
知识点20:y=kx+m与椭圆)0(12222相交于两点,则纵坐标之和为22222bkamb该结论用于解决椭圆与直线的相交问题。 知识点21:已知三角形三边x、y、z,求面积可用下述方法(一些情况下比海伦公式更实用,如27、28、29)...
* 直线与平面的位置关系的例子:例如,直线l可以与平面α相交于一点A,也可以与平面α平行。 六、空间几何图形的表示 * 空间几何图形的表示:空间几何图形可以用符号表示,例如,点A可以用A表示,直线AB可以用AB...
我们遍历网格的每个三角形,如果它与平面相交,我们将其分成3个三角形:在切口的较大侧为2个,在另一侧为1个(我们假设不能完美地将其切割为2个)三角形)。 如果三角形不与平面相交,我们只需将其存储在其各自的...
新建“记录”与“绘图”——录制记录——画三点,并组成三角形,作三边的中点,连接三边顶点成新三角形——此时(“记录”窗口中多出一个“循环”按钮)——先选中新三角形三个顶点再按“循环”按钮——结束录制。...
判断线段与直线是否相交 9.点到线段最短距离 10.求两直线的交点 11.判断一个封闭图形是凹集还是凸集 12.Graham扫描法寻找凸包 数论: 1.x的二进制长度 2.返回x的二进制表示中从低到高的第...
22. 已知:如图,AB,CD,EF 三直线相交于一点 O,且 OE⊥AB,∠COE=20°,OG 平分∠BOD,求∠BOG 的度数为 70°。 知识点:角的度数的计算和关系。 23. 已知,如图,CD⊥AB,GF⊥AB,DE∥BC.试说明∠1=∠2。 ...
实验代码与实验结果 4 (1) 画矩形 4 (2) 画点 6 (3) 画直线 7 (4) 画等边三角形 8 实验二 直线绘制实验 9 1. 实验目的和实验内容 9 2. 实验代码和实验结果 9 (1) 掌握数值微分算法编程绘制直线 9 (2) 掌握中点画线...
相交判断线段与直线是否 9.点到线段最短距离 10.求两直线的交点 11.判断一个封闭图形是 凹集还是凸集 12.Graham 扫描法寻找凸 包 数论: 1.x 的二进制长度 2.返回 x 的二进制表示 中从低到高的第 i 位 3.模取幂运算...
8.判断线段与直线是否相交 9.点到线段最短距离 10.求两直线的交点 11.判断一个封闭图形是凹集还是凸集 12.Graham扫描法寻找凸包 13.求两条线段的交点 数论: 1.x的二进制长度 2.返回x的二进制表示中从低...
| 直线与圆的交点,已知直线与圆相交 36 | 点是否在射线的正向 36 | 射线与圆的第一个交点 36 | 求点 P1 关于直线 LN 的对称点 P2 36 | 两直线夹角(弧度) 36 ACM/ICPC 竞赛之 STL 37 ACM/ICPC 竞赛之 STL ...
(2)设 O 为坐标原点,过 O 的直线 l 与相交于 A,B 两点,且 l 与相交于 C,D两点.若,求直线 l 的方程. 19. 如 图 , 在 三 棱 锥中 , 底 面 △ ABC 为 等 边 三 角 形 ,,,且平面 PAC平面 ABC.(1)求...
2.两条直线相交组成的四个角中,如果有一个角是直角,那么其它三个角也是直角。( ) 3.四边相等的四边形一定是正方形。( ) 4.小数点的后面添上0或者去掉0,小数的大小不变。( ) 5.1.25扩大10倍等于125缩小10倍...