【计算几何】求三角面和直线交点
需求:
对于给定的三角形面片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
【计算几何】求三角面和直线交点相关推荐
- java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码
JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...
- [计算几何] (二维)圆与直线的交点
给出圆心O的坐标, 和半径r, 再给出点A,B的坐标构成直线AB, 求出圆与直线AB交点的坐标 如下图 Step1: 首先求出圆心c在直线l 上的投影点pr的坐标 可通过求解向量p1pr(p1pr的长 ...
- java 直线交点_[Java教程]谈谈求线段交点的几种算法(js实现,完整版)
[Java教程]谈谈求线段交点的几种算法(js实现,完整版) 0 2014-08-27 10:05:22 "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面 ...
- 向量叉乘求三维空间中两直线(或线段)的交点
1.2D空间的直线相交 在二维空间中,利用两个直线方程y = kx + b我们可以直接计算出交点,但是这种方法麻烦了些,并且套用到三维空间用公式就更麻烦了,接下来介绍的是如何利用向量叉乘求出直线交点. ...
- 一般方程与参数方程求直线交点
一般方程与参数方程求直线交点 一. 一个例子: 如上图,有两条直线,设L1,L2.L1上有两点(0, 0).(10,10),L2上有两点(0,10).(10,0),它们的交点是 ...
- 分别已知两直线上的两点,求两直线交点
分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...
- 关于求直线交点的问题。
二维坐标系下,关于求两条之前的交点问题,在国内网站上查来查去都没找到比较清晰易懂的.多数都是解决线段求交点的问题.最后在外国网站找到一篇,感觉讲解比较清晰.现在把他翻译过来. 2D空间中表示一条直线, ...
- 求圆心到点的直线与圆的相交点
求圆心到点的直线与圆的相交点 点B为圆上一动点,已知圆心O(x2,y2), 圆外点A(x1,y1),圆半径r值,求B(x,y)坐标. 由图可知,产生下面两个公式. m/n = y1-y2/x1-x2 ...
- 图像处理;C++求已知两直线方程交点
经过图像处理,得到两直线方程,求两直线交点: 直线的一般方程为F(x) = ax + by + c = 0.既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = ...
最新文章
- 2011计算机考研分数线,2011年计算机考研各院校分数线 说明
- JS-鼠标跟随块(一个小圆点跟着鼠标跑)
- 资源|最好的九张机器学习/深度学习代码速查表,附高清下载
- 火热物联网下,中国传感器的冷思考
- .WM_CTLCOLOR和OnCtlColor消息的用法
- 003_Maven插件
- Pytorch学习 - Task5 PyTorch卷积层原理和使用
- SAP and ABAP Memory总结
- Spring Boot面试题
- tp5.1升级指导---控制器调整 _initialize方法更改为initialize
- Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期
- 【线性查询之间存在相关性误差】差分隐私系统学习记录(七)
- Java队列——线程池创建的例子
- Linux系统日志及screen工具
- 大B与小b的区别(Bps与bps)
- Linux 上部署 Seafile 9.0.x 专业版(Seafile Server端)——踩一路坑,溅一身水
- JS 网页打印解决方案
- 每日一练20210814
- 坦克大战第一节——画出自己的坦克(新手篇)
- windows快捷方式
热门文章
- Bootstrap5不再支持IE浏览器,在网站顶部给IE浏览器访客给予提示
- 2020度小满java方向笔试题
- kiwi syslog安装部署中的问题
- 计算机人物系列-约翰·冯·诺依曼
- 如何学习大咖的经验?
- 数字图像处理第十章 图像分割
- 虚拟机 Ubuntu 16.04.3 LTS 安装搜狗拼音输入法
- Docker创建容器找不到网卡:Error response from daemon: network xxxx not found
- 蓝桥杯_既约分数_java
- 模流分析的11个作用:让产品在设计过程中得到最优的方案