编程之美: 点是否在三角形内
2016-06-20 10:33
337 查看
如果有一个点D在三角形ABC内,那么沿着三角形的边界逆时针走,点D一定保持在边界的左边,也就是说点D在边AB、BC、CA的左边。于是问题转化成如何去判断一个点P3是在射线P1P2的左边,这其实是个数学问题,通过判断P1P2和P1P3两个向量的叉积的正负来判断。
#include<iostream>
using namespace std;
struct point{
double x;
double y;
};
double product(point &a,point &b,point& d){
return (b.x-a.x)*(d.y-a.y)-(b.y-a.y)*(d.x-a.x);
}
bool isInTriangle(point &a,point &b,point &c,point d){
if(product(a,b,d)>=0 && product(b,c,d)>=0 && product(c,a,d)>=0){
return true;
}
return false;
}
int main(){
point a={0.5,1};
point b={0,0};
point c={1,0};
point d1={0.5,1};
cout<<isInTriangle(a,b,c,d1)<<endl;
point d2={2,2};
cout<<isInTriangle(a,b,c,d2)<<endl;
return 0;
}
扩展:
1.是否在凸多边性内?
类似用叉乘
2.判断是否在一个不自交多边形(不保证为凸)内?
参见http://m.blog.csdn.net/article/details?id=9246967
主要就是从点(x,y)发出水平的射线,
判断与凹多边形的交点个数的奇偶性
3.判断一个点是否在一个四面体内?
这个参见http://www.cnblogs.com/sosi/p/4658694.html
<编程之美>的两种解答方案都很直观, 一种是 秦九韶海伦公式来做面积判断, 一种是 常用的判断点是否在三角形内.
为什么说 <编程之美> 没有讲清楚问题呢? 因为实质上这两种方法是统一的.
对于三角形的情况, 我们使用有向面积来判断,假设三角形三个点为(x1,y1),(x2,y2), (x3,y3), 需要判断的点为(x,y). 根据向量代数的公式, 已知3点坐标, 判断三角形有向面积为
有向面积的正负与行列式的排列顺序有关(交换行列式的任意两行, 行列式的正负发生变化)
简单的可以展开为 A0 = (x1y2 – x1y3 – x2y1 + x3y1 + x2y3 - x3y2)/2. 这个判断式子与 叉乘的判断的公式是一模一样的. 可以看出通过有向面积可以统一 <编程之美>中的两种方法, 面积与叉乘的方法在数学本质上是一致的.
在编程之美之后凹多边形的判断, 这个是图形学里面的一个经典问题, 从点(x,y)发出水平的射线, 判断与凹多边形的交点个数的奇偶性, 注意处理通过顶点的特殊情况.
如何判断一个点在四面体的内部呢? 使用有向体积的概念. 假设四面体的四个顶点的坐标为 (x1,y1,z1), (x2,y2,z2), (x3,y3,z3), (x4,y4,z4). 需要判断的点为(x,y,z). 那么原来四面体的有向体积 为
同理剩下的4个有向体积分别为
判断准则很简单, V0与V1V2V3V4都同向的时候, 则点位于四面体内, 否则位于四面体外. 当Vi = 0 的时候, 则此四面体退化了.
#include<iostream>
using namespace std;
struct point{
double x;
double y;
};
double product(point &a,point &b,point& d){
return (b.x-a.x)*(d.y-a.y)-(b.y-a.y)*(d.x-a.x);
}
bool isInTriangle(point &a,point &b,point &c,point d){
if(product(a,b,d)>=0 && product(b,c,d)>=0 && product(c,a,d)>=0){
return true;
}
return false;
}
int main(){
point a={0.5,1};
point b={0,0};
point c={1,0};
point d1={0.5,1};
cout<<isInTriangle(a,b,c,d1)<<endl;
point d2={2,2};
cout<<isInTriangle(a,b,c,d2)<<endl;
return 0;
}
扩展:
1.是否在凸多边性内?
类似用叉乘
2.判断是否在一个不自交多边形(不保证为凸)内?
参见http://m.blog.csdn.net/article/details?id=9246967
主要就是从点(x,y)发出水平的射线,
判断与凹多边形的交点个数的奇偶性
3.判断一个点是否在一个四面体内?
这个参见http://www.cnblogs.com/sosi/p/4658694.html
<编程之美>的两种解答方案都很直观, 一种是 秦九韶海伦公式来做面积判断, 一种是 常用的判断点是否在三角形内.
为什么说 <编程之美> 没有讲清楚问题呢? 因为实质上这两种方法是统一的.
对于三角形的情况, 我们使用有向面积来判断,假设三角形三个点为(x1,y1),(x2,y2), (x3,y3), 需要判断的点为(x,y). 根据向量代数的公式, 已知3点坐标, 判断三角形有向面积为
有向面积的正负与行列式的排列顺序有关(交换行列式的任意两行, 行列式的正负发生变化)
简单的可以展开为 A0 = (x1y2 – x1y3 – x2y1 + x3y1 + x2y3 - x3y2)/2. 这个判断式子与 叉乘的判断的公式是一模一样的. 可以看出通过有向面积可以统一 <编程之美>中的两种方法, 面积与叉乘的方法在数学本质上是一致的.
在编程之美之后凹多边形的判断, 这个是图形学里面的一个经典问题, 从点(x,y)发出水平的射线, 判断与凹多边形的交点个数的奇偶性, 注意处理通过顶点的特殊情况.
如何判断一个点在四面体的内部呢? 使用有向体积的概念. 假设四面体的四个顶点的坐标为 (x1,y1,z1), (x2,y2,z2), (x3,y3,z3), (x4,y4,z4). 需要判断的点为(x,y,z). 那么原来四面体的有向体积 为
同理剩下的4个有向体积分别为
判断准则很简单, V0与V1V2V3V4都同向的时候, 则点位于四面体内, 否则位于四面体外. 当Vi = 0 的时候, 则此四面体退化了.
相关文章推荐
- 开发者眼中的Spring与JavaEE
- C扩展python的module和Type
- ASP.NET Core 中文文档 第二章 指南(4.8)添加新的字段
- 写的一个简单的java线程池
- [转载]关于Debug和Release的区别 (VS C#)
- C语言发送邮件 基于libesmtp库
- Spring+Quartz的版本问题
- 解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题
- Git学习笔记01—windows上安装Git
- 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
- Java常用基础概念整理(一)
- C++bulder修改窗口风格
- Java - PAT - 1029. 旧键盘(20)
- Java多线程编程总结
- 安装 mysql - python
- c++实现ping模块
- 浅析java 的 static 关键字用法
- java 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
- python之set(集合)简介
- Git学习笔记02—git文件的三种状态