计算几何

博客介绍了如何通过计算几何的方法判断二维平面上给定的四个点所构成的两个向量的位置关系。当向量共线时输出'line',平行时输出'None',相交时输出'Point'及交点坐标。通过判断向量的叉积来确定两向量的关系,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

感觉又会是一篇写不完的文章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的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值