需求:

对于给定的三角形面片3个顶点,和一条直线的2个点,求三角面和直线的交点,若无交点,输出-1。

思路:

利用海伦公式,可以得到三角形的面积,然后用3个点的2个向量,进行叉乘,得到面的法向量。ax+by+cz=d可以表示面,求出常数d,联力面的方程和直线方程,求解交点。

代码:

class CVector
{
public:union{float vec[3];struct { float x, y, z; };};
};class CrossPoint
{
public:CrossPoint();virtual ~CrossPoint();
public:static bool ValidPoint(CVector &LinePoint, CVector &LineV,CVector &TrianglePoint1, CVector &TrianglePoint2, CVector &TrianglePoint3, CVector &result);static float Area(float a, float b, float c);static float Distance(CVector &p1, CVector &p2);
};///CrossPoint::CrossPoint()
{}CrossPoint::~CrossPoint()
{}
//计算p1到p2的距离的平方
float CrossPoint::Distance(CVector &p1, CVector &p2)
{float dist;dist = ((p2.x - p1.x)*(p2.x - p1.x)+ (p2.y - p1.y)*(p2.y - p1.y)+ (p2.z - p1.z)*(p2.z - p1.z));return (float)sqrt(dist);
}
//利用海伦公式求变成为a,b,c的三角形的面积
float CrossPoint::Area(float a, float b, float c)
{float s = (a + b + c) / 2;return (float)sqrt(s*(s - a)*(s - b)*(s - c));
}bool CrossPoint::ValidPoint(CVector &LinePoint1, CVector &LinePoint2, CVector &TrianglePoint1, CVector&TrianglePoint2, CVector &TrianglePoint3, CVector &result)
{//三角形所在平面的法向量CVector TriangleV;//三角形的边方向向量CVector VP12, VP13;//直线与平面的交点CVector CrossPoint;//平面方程常数项float TriD;//CVector LineV = LinePoint2 - LinePoint1;CVector LineV;LineV.x = 0, LineV.y = 0, LineV.z = 100;/*-------计算平面的法向量及常数项-------*///point1->point2VP12.x = TrianglePoint2.x - TrianglePoint1.x;VP12.y = TrianglePoint2.y - TrianglePoint1.y;VP12.z = TrianglePoint2.z - TrianglePoint1.z;//point1->point3VP13.x = TrianglePoint3.x - TrianglePoint1.x;VP13.y = TrianglePoint3.y - TrianglePoint1.y;VP13.z = TrianglePoint3.z - TrianglePoint1.z;//VP12xVP13TriangleV.x = VP12.y*VP13.z - VP12.z*VP13.y;TriangleV.y = -(VP12.x*VP13.z - VP12.z*VP13.x);TriangleV.z = VP12.x*VP13.y - VP12.y*VP13.x;//计算常数项TriD = -(TriangleV.x*TrianglePoint1.x+ TriangleV.y*TrianglePoint1.y+ TriangleV.z*TrianglePoint1.z);/*-------求解直线与平面的交点坐标---------*//* 思路:* 首先将直线方程转换为参数方程形式,然后代入平面方程,求得参数t,* 将t代入直线的参数方程即可求出交点坐标*/float tempU, tempD; //临时变量tempU = TriangleV.x*LinePoint1.x + TriangleV.y*LinePoint1.y+ TriangleV.z*LinePoint1.z + TriD;tempD = TriangleV.x*LineV.x + TriangleV.y*LineV.y + TriangleV.z*LineV.z;//直线与平面平行或在平面上if (tempD == 0.0){//printf("The line is parallel with the plane.\n");return false;}//计算参数tfloat t = -tempU / tempD;//计算交点坐标CrossPoint.x = LineV.x*t + LinePoint1.x;CrossPoint.y = LineV.y*t + LinePoint1.y;CrossPoint.z = LineV.z*t + LinePoint1.z;/*----------判断交点是否在三角形内部---*///计算三角形三条边的长度float d12 = Distance(TrianglePoint1, TrianglePoint2);float d13 = Distance(TrianglePoint1, TrianglePoint3);float d23 = Distance(TrianglePoint2, TrianglePoint3);//计算交点到三个顶点的长度float c1 = Distance(CrossPoint, TrianglePoint1);float c2 = Distance(CrossPoint, TrianglePoint2);float c3 = Distance(CrossPoint, TrianglePoint3);//求三角形及子三角形的面积float areaD = Area(d12, d13, d23); //三角形面积float area1 = Area(c1, c2, d12); //子三角形1float area2 = Area(c1, c3, d13); //子三角形2float area3 = Area(c2, c3, d23); //子三角形3//根据面积判断点是否在三角形内部if (fabs(area1 + area2 + area3 - areaD) > 0.001){return false;}result = CrossPoint;return true;
}

转载于:https://www.cnblogs.com/SeekHit/p/7061451.html

【计算几何】求三角面和直线交点相关推荐

  1. java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码

    JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...

  2. [计算几何] (二维)圆与直线的交点

    给出圆心O的坐标, 和半径r, 再给出点A,B的坐标构成直线AB, 求出圆与直线AB交点的坐标 如下图 Step1: 首先求出圆心c在直线l 上的投影点pr的坐标 可通过求解向量p1pr(p1pr的长 ...

  3. java 直线交点_[Java教程]谈谈求线段交点的几种算法(js实现,完整版)

    [Java教程]谈谈求线段交点的几种算法(js实现,完整版) 0 2014-08-27 10:05:22 "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面 ...

  4. 向量叉乘求三维空间中两直线(或线段)的交点

    1.2D空间的直线相交 在二维空间中,利用两个直线方程y = kx + b我们可以直接计算出交点,但是这种方法麻烦了些,并且套用到三维空间用公式就更麻烦了,接下来介绍的是如何利用向量叉乘求出直线交点. ...

  5. 一般方程与参数方程求直线交点

    一般方程与参数方程求直线交点 一.             一个例子: 如上图,有两条直线,设L1,L2.L1上有两点(0, 0).(10,10),L2上有两点(0,10).(10,0),它们的交点是 ...

  6. 分别已知两直线上的两点,求两直线交点

    分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...

  7. 关于求直线交点的问题。

    二维坐标系下,关于求两条之前的交点问题,在国内网站上查来查去都没找到比较清晰易懂的.多数都是解决线段求交点的问题.最后在外国网站找到一篇,感觉讲解比较清晰.现在把他翻译过来. 2D空间中表示一条直线, ...

  8. 求圆心到点的直线与圆的相交点

    求圆心到点的直线与圆的相交点 点B为圆上一动点,已知圆心O(x2,y2), 圆外点A(x1,y1),圆半径r值,求B(x,y)坐标. 由图可知,产生下面两个公式. m/n = y1-y2/x1-x2 ...

  9. 图像处理;C++求已知两直线方程交点

    经过图像处理,得到两直线方程,求两直线交点: 直线的一般方程为F(x) = ax + by + c = 0.既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = ...

最新文章

  1. 2011计算机考研分数线,2011年计算机考研各院校分数线 说明
  2. JS-鼠标跟随块(一个小圆点跟着鼠标跑)
  3. 资源|最好的九张机器学习/深度学习代码速查表,附高清下载
  4. 火热物联网下,中国传感器的冷思考
  5. .WM_CTLCOLOR和OnCtlColor消息的用法
  6. 003_Maven插件
  7. Pytorch学习 - Task5 PyTorch卷积层原理和使用
  8. SAP and ABAP Memory总结
  9. Spring Boot面试题
  10. tp5.1升级指导---控制器调整 _initialize方法更改为initialize
  11. Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期
  12. 【线性查询之间存在相关性误差】差分隐私系统学习记录(七)
  13. Java队列——线程池创建的例子
  14. Linux系统日志及screen工具
  15. 大B与小b的区别(Bps与bps)
  16. Linux 上部署 Seafile 9.0.x 专业版(Seafile Server端)——踩一路坑,溅一身水
  17. JS 网页打印解决方案
  18. 每日一练20210814
  19. 坦克大战第一节——画出自己的坦克(新手篇)
  20. windows快捷方式

热门文章

  1. Bootstrap5不再支持IE浏览器,在网站顶部给IE浏览器访客给予提示
  2. 2020度小满java方向笔试题
  3. kiwi syslog安装部署中的问题
  4. 计算机人物系列-约翰·冯·诺依曼
  5. 如何学习大咖的经验?
  6. 数字图像处理第十章 图像分割
  7. 虚拟机 Ubuntu 16.04.3 LTS 安装搜狗拼音输入法
  8. Docker创建容器找不到网卡:Error response from daemon: network xxxx not found
  9. 蓝桥杯_既约分数_java
  10. 模流分析的11个作用:让产品在设计过程中得到最优的方案