`
445822357
  • 浏览: 730939 次
文章分类
社区版块
存档分类
最新评论

直线与三角形相交

 
阅读更多
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++上。

    c++计算三维空间中任意两条直线之间的位置关系(平行、相交、交错、重合)

    利用eigen库内矩阵运算函数,写了LinesPositionRelationship3D类。实现了确定三维空间任意两条直线位置关系并获得在平行和交错条件下的两直线距离的功能。该类是在确定空间两圆柱轴线关系下的副产品。

    C语言常用二维解析几何函数集源代码

    包括简单的碰撞检测计算,函数包括: 向量加减法,向量点乘与叉乘,向量缩放,向量长度 三角形面积,点到直线(和线段)的距离...直线(和线段)与三角形碰撞,三角形与三角形碰撞 两平行矩形碰撞,平行矩形与椭圆碰撞

    IntersectTri.doc

    IntersectTri.doc 判断直线是否与三角形相交的解析几何知识基础。

    ACM 计算几何模板

    7.13判断线段是否与空间三角形相交 27 7.14计算两条直线的交点 28 7.15计算直线与平面的交点 28 7.16计算两平面的交线 29 7.17点到直线的距离 29 7.18 计算点到平面的距离 29 7.19计算直线到直线的距离 30 7.20空间...

    黄冈中学高2数学教案

     在平面直角坐标系中,对于一条与x轴相交的直线,如果把x轴绕着交点按逆时针方向旋转到和直线重合时所转的最小正角为 ,则 就叫做直线的倾斜角;当直线和x轴平行或重合时,规定此时直线的倾斜角为0°,因此,倾斜角...

    mesh-cutter:简单的网格切割算法,适用于类0的简单3d流形对象

    我们遍历网格的每个三角形,如果它与平面相交,我们将其分成3个三角形:在切口的较大侧为2个,在另一侧为1个(我们假设不能完美地将其切割为2个)三角形)。 如果三角形不与平面相交,我们只需将其存储在其各自的...

    GSP5.exe

    新建“记录”与“绘图”——录制记录——画三点,并组成三角形,作三边的中点,连接三边顶点成新三角形——此时(“记录”窗口中多出一个“循环”按钮)——先选中新三角形三个顶点再按“循环”按钮——结束录制。...

    acm常用代码及算法

    判断线段与直线是否相交 9.点到线段最短距离 10.求两直线的交点 11.判断一个封闭图形是凹集还是凸集 12.Graham扫描法寻找凸包 数论: 1.x的二进制长度 2.返回x的二进制表示中从低到高的第...

    计算机图形学实验报告.docx

    实验代码与实验结果 4 (1) 画矩形 4 (2) 画点 6 (3) 画直线 7 (4) 画等边三角形 8 实验二 直线绘制实验 9 1. 实验目的和实验内容 9 2. 实验代码和实验结果 9 (1) 掌握数值微分算法编程绘制直线 9 (2) 掌握中点画线...

    ACM常用代码

    相交判断线段与直线是否 9.点到线段最短距离 10.求两直线的交点 11.判断一个封闭图形是 凹集还是凸集 12.Graham 扫描法寻找凸 包 数论: 1.x 的二进制长度 2.返回 x 的二进制表示 中从低到高的第 i 位 3.模取幂运算...

    ACM 内部预定函数

    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 ...

    人教版小学四年级数学下册期末试卷 (4).doc

    2.两条直线相交组成的四个角中,如果有一个角是直角,那么其它三个角也是直角。( ) 3.四边相等的四边形一定是正方形。( ) 4.小数点的后面添上0或者去掉0,小数的大小不变。( ) 5.1.25扩大10倍等于125缩小10倍...

    地理信息系统算法基础.rar

    2.20计算线段或直线与线段的交点 2.21求线段或直线与圆的交点 2.22中心点的计算 2.23过点作垂线 2.24作平行线 2.25过点作平行线 2.26线段延长 2.27三点画圆 2.28线段打断 2.29前方交会 2.30距离交会 ...

    地理信息系统算法基础

    目录序前言第1章算法设计和分析1.1概述1.2算法设计原则1.3算法复杂性的度量...相交2.6判断矩形是否包含点2.7判断线段、折线、多边形是否在矩形中2.8判断矩形是否在矩形中2.9判断圆是否在矩形中2.10判断点是否在...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    1.16.9 pku_1151_矩形相交的面积 76 1.16.10 pku_1118_共线最多的点的个数 78 1.16.11 pku2826_线段围成的区域可储水量 80 1.16.12 Pick公式 84 1.16.13 N点中三个点组成三角形面积最大 86 1.16.14 直线关于圆的反射...

    基于DSP2812的PWM方案设计.doc

    取第n个三角波作分析(1 n n),设等腰三角形的中心线与信号线的交点为d点,过d点 做一条跟横轴平行的直线与等腰三角载波相交于e点和f点,由图2可知,取te,tf作为控 制时刻,根据等腰三角形的比例计算得到脉冲的...

    使用css实现三角符号效果

    下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在css中上下左右的边框相交处并不是一个直线,所以,可以根据此属性进行编写三角符号 那么如何使用css的该属性来实现三角符号的效果呢,代码如下:...

    欧拉公式求圆周率的matlab代码-wykobi:WykobiC++计算几何库

    欧拉公式求长期率的matlab代码描述...3D之间的成对相交-射线,线段,直线,平面,三角形,四分之一,圆,球体,矩形,框,多边形,三次方和二次方贝塞尔曲线 点包含测试-三角形,矩形,圆形,四边形,球形和凸\凹多边形

Global site tag (gtag.js) - Google Analytics