1、 矢量叉积
AB * AC > 0 ; AC在AB的 逆时针方向, 否则顺时针
= 0; A B C 共线
class Point{
public:
double x;
double y;
Point(double _x,double _y):x(_x),y(_y){}
};
//P Q 为向量 A,B,C为点
// P * Q = x1 * y2 - x2 * y1
// P = A-B Q=C-A
//即 (x1-x0) * (y2-y0) - (x2-x0) * (y1-y0)
/*
*计算 AB*AC 的叉积
*/
double CorssProd(Point A, Point B, Point C){
return (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
}
2 、 判断点是否在线段上
点Q, 线段 P1,P2.
/*
* 点Q 是否在 线段 P1,P2 上
*/
bool on_segment(Point P1, Point P2, Point Q){
return CrossProd(P1,P2,Q) == 0 &&
(min(P1.x,P2.x) <= Q.x && max(P1.x, P2.x) >= Q.x )
&& ( min(P1.y,P2.y) <= Q.y && max(P1.y, P2.y) >= Q.y );
}
3、跨立实验 线段是否相交。
#include <iostream>
using namespace std;
class Point{
public:
double x;
double y;
Point(double _x,double _y):x(_x),y(_y){}
};
//P Q 为向量 A,B,C为点
// P * Q = x1 * y2 - x2 * y1
// P = A-B Q=C-A
//即 (x1-x0) * (y2-y0) - (x2-x0) * (y1-y0)
/*
*计算 AB*AC 的叉积
*/
double CrossProd(Point & A, Point & B, Point & C){
//cout << (B.x - A.x) << " " << (B.y - A.y)<< endl;
//cout << (C.x - A.x) << " " << (C.y - A.y) << endl;
return (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
}
/*
* 点Q 是否在 线段 P1,P2 上
*/
bool on_segment(Point P1, Point P2, Point Q){
return CrossProd(P1,P2,Q) == 0 &&
(min(P1.x,P2.x) <= Q.x && max(P1.x, P2.x) >= Q.x )
&& ( min(P1.y,P2.y) <= Q.y && max(P1.y, P2.y) >= Q.y );
}
// (Q1P1 * Q1Q2) * (Q1Q2 * Q1P2) >=0 并且
// (P1Q1 * P1P2) * (P1P2 * P1Q2) >= 0
bool corssJudge(Point P1,Point P2, Point Q1, Point Q2){
return ( CrossProd(Q1,P1,Q2) * CrossProd(Q1,Q2,P2) >=0 ) &&
( CrossProd(P1,Q1,P2) * CrossProd(P1,P2,Q2) >= 0);
}
int main() {
Point p1(1.0,2.0);
Point p2(3.0,3.0);
Point q1(2.0, 2.5); //在
Point q2(1.0, 2.5); //不在
Point q3(5.0, 4.0); //在延长线上
//cout << CrossProd( p1, p2 , q1) << endl;
cout << "测试点是否在线段 p1p2 上: q1在, q2,q3不在 " << endl;
cout << on_segment(p1, p2, q1) << endl;
cout << on_segment(p1, p2, q2) << endl;
cout << on_segment(p1, p2, q3) << endl;
cout << "测试线段是否相交:" << endl;
cout << "p1(1.0,2.0) p2(3.0,3.0) q1(2.0, 2.5) q2(1.0, 2.5) q3(5.0, 4.0)" << endl;
cout << "p1p2 与 q1q2相交, 与 q2q3不相交" << endl;
cout << corssJudge(p1,p2,q1,q2) << endl;
cout << corssJudge(p1,p2,q2,q3) << endl;
return 0;
}
分享到:
相关推荐
很详细的计算几何资源集合,囊括了几乎所有的计算几何书籍,包括《计算几何导论》、《计算几何基础》,很经典的计算几何书籍
8计算几何基础.ppt
计算几何基础知识提纲
计算几何基础总结.rar
acm课件3 计算几何基础acm课件3 计算几何基础acm课件3 计算几何基础
ACM算法 计算几何基础 用于计算不规则多边形,凹多边形和凸多边形
包含点、线、多边形、凸多边形、圆、半平面交等算法的板子
学习计算机语言的基础文档,对于思维的培养有很大的好处。
计算几何基础凸包学习笔记
计算几何基础知识,在外面比较难找
计算几何基础知识讲义.pdf
ACM课件!!(lecture_07)计算几何基础_easy ACM课件!!(lecture_07)计算几何基础_easy hdu acm usa 测试数据 算法
(lecture_05)计算几何基础_20081022.ppt
需要注意的细节 向量及其运算 外积的应用 三角形的一些性质 判断点在直线上
(lecture_05)计算几何基础_20071030 计算机学院 刘春英
文档内有很多计算几何的基础算法,直线、多边形等等的算法的C语言实现,有详细的注释,一目了然。
杭电ACM课件2014版之 (HDUACM201403版_08)计算几何基础
计算几何基础知识_陈胤伯.pdf