计算几何---点与三角形面片的关系

点是否再三角形面之内的位置关系判定

  常用的方法是,如果点在三角形内部,则连接与三角形的三个顶点,并计算组成的组成矢量的角度和,如果为2pei, 则在三角形内部,否则不再三角形内不。理论上该方法可行,但是效率非常慢。

  因为要计算夹角,需要多次计算平方根。

1. 判定是否同边的技术原理(Same Side Technique)

  快速且简洁的方法如下:

   

  如图,三角形,线段AB, BC, and CA,每一条都半分剩下的部分,且剩下的在三角形的外部部分,我们可以利用这个特性做如下处理:

  如果一个点在三角形内部,则点必然在AB下面, BC左面,AC右边。如果不符合这个特性,则判定结果比在三角形外面,因此这个判定很快。

(1)计算一个点在一个线段的位置关系

  

  通过叉积的方式,用[B - A ]和[p - A ]组成的叉积,即AB * Ap, 如果结果为正(叉积朝向屏幕外面),则p 在AB的左边, 否则(叉积朝向屏幕里面)在AB的右边。

  因为在3D空间中,AB方向线段,与点p的位置关系,可以借助点C来判定,因为ABC组成一个平面,因此C可以作为参考值。

  继而,判定任意点p, 如果[B - A ]和[p - A ]叉积方向,与[B - A ]和[C - A]的叉积方向不相同,则可直接判定没有在三角形内部; 如果与叉积方向相同,则可以继续对余下的边进行同样的判定方式。

  判断两个叉积结果的方向是否同向,使用点乘的方式。

  实现方面的方法非常容易,可以实现一个方法来判定是否在相同的边的位置。在判定的时候可以分别调用:

function SameSide(p1,p2, a,b)
    cp1 = CrossProduct(b-a, p1-a)
    cp2 = CrossProduct(b-a, p2-a)
    if DotProduct(cp1, cp2) >= 0 then return true
    else return false

function PointInTriangle(p, a,b,c)
    if SameSide(p,a, b,c) and SameSide(p,b, a,c)
        and SameSide(p,c, a,b) then return true
    else return false

  这样的方法非常高效,不需要计算平方根,弧度反求,等等。

2 判定中心的技术原理(Barycentric Technique)

  还有一种方法可以执行的更快,原理更简单的方法,与数学知识有一点点关联。

  因为三角形的三个点确定一个平面,在这个平面中,可以任意选择一点,其他的点都是作为相对位置关系。如以点A为例,然后选定[C-A][B-A]两个向量作为该平面的坐标分量,因此三角形平面中任意一点都可以用这连个向量AB,AC表示。

  即  P = A + u * (C - A) + v * (B - A)

注意:如果系数u或者v都< 0, 则p点必然在三角形区域之外。同样,如果u 或者v > 1, 则 点 p则在三角形之外,最后,如果 u + v > 1, 同样越过BC边,而到三角形之外

  

  因此可以计算出P在u,v系数下的表示。但是怎么获取p点在上述公式中的系数u,v呢?

  可以使用下述的公式推导:

    // We have two unknowns (u and v) so we need two equations to solve
    // for them.  Dot both sides by v0 to get one and dot both sides by
    // v1 to get a second.
    (v2) . v0 = (u * v0 + v * v1) . v0
    (v2) . v1 = (u * v0 + v * v1) . v1

    // Distribute v0 and v1
    v2 . v0 = u * (v0 . v0) + v * (v1 . v0)
    v2 . v1 = u * (v0 . v1) + v * (v1 . v1)

    // Now we have two equations and two unknowns and can solve one
    // equation for one variable and substitute into the other.  Or
    // if you‘re lazy like me, fire up Mathematica and save yourself
    // some handwriting.
    Solve[v2.v0 == {u(v0.v0) + v(v1.v0), v2.v1 == u(v0.v1) + v(v1.v1)}, {u, v}]
    u = ((v1.v1)(v2.v0)-(v1.v0)(v2.v1)) / ((v0.v0)(v1.v1) - (v0.v1)(v1.v0))
    v = ((v0.v0)(v2.v1)-(v0.v1)(v2.v0)) / ((v0.v0)(v1.v1) - (v0.v1)(v1.v0))

  下面是用于编程的快速实现:

  

// Compute vector,计算向量AC, AB, CP
v0 = C - A
v1 = B - A
v2 = P - A

// Compute dot products 计算点乘
dot00 = dot(v0, v0)
dot01 = dot(v0, v1)
dot02 = dot(v0, v2)
dot11 = dot(v1, v1)
dot12 = dot(v1, v2)

// Compute barycentric coordinates 计算系数坐标
invDenom = 1 / (dot00 * dot11 - dot01 * dot01)
u = (dot11 * dot02 - dot01 * dot12) * invDenom
v = (dot00 * dot12 - dot01 * dot02) * invDenom

// Check if point is in triangle 检测
return (u >= 0) && (v >= 0) && (u + v < 1)

  

endl;

  

  

时间: 2024-08-24 09:33:07

计算几何---点与三角形面片的关系的相关文章

[fzu 2273]判断两个三角形的位置关系

首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.php?pid=2273 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const double eps=1e-8; const

计算几何---曲面三角形差值公式

1.对非平面的三角形面片进行差值,可以从指定的定点法相.或者边界切线方向开始进行差值,即从三个端点值,以及留个且向量使用Hermite差值完成. 对于曲面三角形的任一条边,如上图所示.如果向量定点v0处的法向量n0没有给出通过标签<normal>给出,则通过计算v0点的两个边的切向量的叉积的方式,计算v0d的法相量n0. 其中,该曲面三角巷的曲率边通过标签<vertices>下的元素<edge>进行指定. 计算重心点的且向量,通过使用二次Hermite曲线差值的方式,然

计算几何——凸包问题(一)

注:本文是2016年春季清华大学邓俊辉老师<计算几何>MOOC课程的简要个人总结系列之一,我将同步课程内容更新.不过有可能写的不完全是课程内容,也包含一些个人理解.如果你在看完本文后开始对计算几何感兴趣,请前往相应的MOOC平台完整学习邓老师的课程.如此精心设计和编排的课程,不应该被辜负.在此感谢邓老师! Knowledge Dependence: 阅读本文前你只需要有基本的几何知识和算法知识即可.代码实现需要一丢丢C++基础.由于作者很懒不想画图,所以你还需要一点脑内小剧场.不过相信我,自己

面向对象中类和类的关系

在面向对象方法中,我们在确定了类及类的属性和方法后.不可避免的要研究类和类之间的关系,正是这些关系将整个事情串联起来.使彼此之间有了联系,就像现实生活中,人与人交往中存在着不同的关系. 了解这些关系,对于我们开发系统百利而无一害,能够让我们轻松.高效的工作,相同像我们在日常生活中处理好人与人之间的关系.会给我们带来巨大的优点.那么我们就来认识一下.面向对象中类与类之间有那些关系. 类和类之间的关系大概能够分为一下几种类型:泛化关系(Generalization).实现关系(realization

忧桑三角形,调了半天,真忧桑TAT

忧桑三角形 试题描述 小J是一名文化课选手,他十分喜欢做题,尤其是裸题.有一棵树,树上每个点都有点权,现在有以下两个操作: 1. 修改某个点的点权 2. 查询点u和点v构成的简单路径上是否能选出三个点组成三角形 输入 第一行两个整数N,Q,代表点数和询问数.第二行N个整数表示点权.下面N-1行每行两个整数a,b代表a,b之间有一条边.下面Q行每行3个整数t,a,b:若t=0,询问(a,b):否则将点a的权值修改为b 输出 对于每个询问输出Y表示能构成三角形,输出N表示不能构成三角形 输入示例 5

【POJ】2318 TOYS ——计算几何+二分

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10281   Accepted: 4924 Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a problem - their child John never puts his toys away w

科学计算可视化

一. 绪论 现代科学研究主要方法: (1) 理论(推导,完全归纳,演绎) (2) 实验(统计,归纳) (3) 数值方法,模拟仿真 (4) 大数据,知识发现,数据挖掘 可视化定义 可视化是一种方法.它将符号变为直观的几何形体,使研究者可以直接观察他们感兴趣的对象,它提供了一种观察不可见事物的手段. 数据可视化(Data Visualization ):运用计算机图形学和图像处理技术,将数据转换为图形或图像在屏幕上显示出来,并进行交互处理的理论.方法和技术. 数据可视化的类型: (1) 科学计算可视

网上看到的很棒的东西

ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l计算机组成原理l人工智能l编译原理l算法设计与分析除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的.以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单,但内容不限于ACM的知识.英语之类与专业相距较远的课程请自行分配时间,这里不再列举.大一上

3D打印技术之切片引擎(2)

[此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 在上一篇文章中,我从总体上介绍了一下切片引擎技术,从这一篇文章开始,我开始说一下具体的技术细节. 切片引擎,实体部分包括: 提取边界向量-->添加多边-->生成填充向量集合. 还包括生成支撑向量集合.就先说下支撑算法. 生成支撑向量集合分为人工生成和自动生成两种,优越的支撑算法主要体现在 1,省材料. 2,生成速度快. 3,生成的支撑体与零件实体较少的接触与干涉,有利于剥离. 毕竟,切片引擎的