感觉又会是一篇写不完的文章QwQ
2022.11.14 AC第一道计算几何题!QwQ
POJ1269
题目大意:
给定p1,p2,p3,p4,求p1,p2和p3,p4组成的向量所在直线的位置关系
- 若两向量共线,输出“line”
- 若两向量平行,输出“None”
- 若相交,则输出“Point ”,然后输出交点的横纵坐标
solution:
情况1:若两向量平行/共线(即斜率相等)
如图
共线:
平行:
首先我们做一条辅助线,连接P1、P4作向量c【因为图一四点共线所以图一共线情况下的向量a、b、c不方便标出,大家可以参考图二平行情况下向量的命名】(或者选择任意其它两个不在同一向量的点进行连接(注意这里是向量不是直线,因为我们现在并不能准确判断点集是否在同一直线上))
推导共线/平行的图像特征
- 首先我们看共线的情况,共线时,连接P1和P4,我们发现,向量a与向量c的叉积等于0(因为共线所以两向量形成的平行四边形面积当然是0啦),向量c与向量b的叉积也等于0(理由同上昂)
- 接着我们看平行,因为两向量不共线,所以连接p1,p4,我们得到,向量a与向量c的叉积恒不等于0(因为只有共线两向量形成的平行四边形面积才等于0阿QwQ),同理,向量c与向量b的叉积也恒不等于0
结论
当两向量a、b斜率相等时,任意连接两个不在同一向量的两点作一条新的向量c
- 若向量a、c和向量a、b的叉积有值(即不为0),则两线平行(其实在斜率相等的情况下,a、b任意一向量与c的叉积有值的话,那么另外一个向量与c的叉积也一定有值啦)
- 反之,若叉积为0,则共线(同上,斜率相等,任一向量与c的叉积为0,则另一向量与c的叉积也一定为0)
实现
求叉积代码:
double cross(point a,point b){
return a.x*b.y-a.y*b.x;
}//point为子成员变量含x、y的结构体,表示一个点
情况2:两直线相交
斜率不相等就肯定相交啦,没啥好说的,这个情况的重点在于求交点
摆个用叉积求交点的公式等啥时候有时间了再补证明哈
实现
point calculate_point(point a,point b,point c,point d){
point w;
w.x=a.x-c.x,w.y=a.y-c.y;
double t=cross(d,w)/cross(b,d);
b.x*=t,b.y*=t;
return a+b;
}
//利用叉积计算交点
//a为p1,b为向量a进行平移,将p1平移至原点时,p2的位置
//c为p3,d为向量b进行平移,将p3平移至原点时,p4的位置