点云几何 之 判断某一点是否在三角形的边上(3)
- 一、算法介绍
- 二、算法实现
- 1.代码
- 2.结果
- 总结
一、算法介绍
判断某一点是否在三角形的边上
之前已经介绍了点在三角形的内外判断方法,这里增加点恰好在三角形边上的判断方法
(本质上是遍历每条边,查看点是否在边上,所以对于多边形也是适用的。)
代码复制粘贴即可使用
二、算法实现
1.代码
#include <iostream>
using namespace std;struct Point {float x, y;
};// 判断点是否在三角形的某条边上
bool isOnTriangleEdge(Point p1, Point p2, Point p3, Point p) {float epsilon = 0.000001; // 用于比较浮点数的误差范围// 检查点p是否在边p1-p2上if (abs((p2.y - p1.y) * (p.x - p1.x) - (p.y - p1.y) * (p2.x - p1.x)) < epsilon) {if (p.x >= min(p1.x, p2.x) && p.x <= max(p1.x, p2.x) && p.y >= min(p1.y, p2.y) && p.y <= max(p1.y, p2.y)) {return true;}}// 检查点p是否在边p2-p3上if (abs((p3.y - p2.y) * (p.x - p2.x) - (p.y - p2.y) * (p3.x - p2.x)) < epsilon) {if (p.x >= min(p2.x, p3.x) && p.x <= max(p2.x, p3.x) && p.y >= min(p2.y, p3.y) && p.y <= max(p2.y, p3.y)) {return true;}}// 检查点p是否在边p3-p1上if (abs((p1.y - p3.y) * (p.x - p3.x) - (p.y - p3.y) * (p1.x - p3.x)) < epsilon) {if (p.x >= min(p1.x, p3.x) && p.x <= max(p1.x, p3.x) && p.y >= min(p1.y, p3.y) && p.y <= max(p1.y, p3.y)) {return true;}}return false;
}int main() {Point p1 = { 0, 0 };Point p2 = { 4, 0 };Point p3 = { 2, 4 };Point p = { 2, 4 };if (isOnTriangleEdge(p1, p2, p3, p)) {cout << "点在三角形的边上" << endl;}else {cout << "点不在三角形的边上" << endl;}system("pause");return 0;
}
2.结果
总结
这个和之前判断内部还是外部的方法结合,即可完整表达点与三角形的相对位置关系