计算几何算法基础————判断点是否在线段上(另附叉积的重要应用,折线段的拐向判断)...

本文介绍了一种简单的算法来判断一个点是否位于给定的线段上,并利用叉乘概念进行了说明。此外,还提供了如何判断折线段拐向的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:《ACM/ICPC程序设计与分析》

判断点在线段上这个算法非常的简单,只要学过叉乘(CrossProduct)就很容易搞定

设点为Q,线段为P1P2,判断点Q是否在P1P2上。

算法依据:

1.点Q首先要在P1P2所在的直线上。

  比较原始的办法是利用P1P2的坐标做出直线方程,然后代入点Q看是否满足方程,这样代码稍微麻烦些。

  简单点就是用叉乘,如果点Q在P1P2直线上,那么:

  P1Q x P1P2 = 0(x代表叉乘)

 这个代码实现很容易。

 P x Q = P.x * Q.y - P.y * Q.x(交叉相乘)PS:叉积的结果还是一个向量,二维向量的叉积是垂直于两个向量形成的平面的一个向量。这行公式实际上求的是标量。

2.Q要在以P1P2为对角线的平行矩形内

   这个就更简单了,做一下比较即可

下面给出伪代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">bool  On_Segment(Point P1,Point P2,Point Q)
{
	int condition1 = condition2 = 0
	if(CrossProduct(P1Q,P1P1) == 0)//条件1 
		condition1 = 1;
	if((min(P1.x,P2.x) <= Q.x) && (Q.x <= max(P1.x,P2.x)) &&
	   (min(P1.y,P2.y) <= Q.y) && (Q.y <= max(P1.y,P2.y)))//条件2 
	   condition2 = 1;
	if(condition1 && condition2)
		return true;
	else
		return false;   
}</span>


这里在说一下矢量叉乘的一个重要应用!

如果给出三点ABC,其位置关系如下:



给出求AB x AC叉乘的伪代码

<span style="font-family:Microsoft YaHei;font-size:14px;">double CrossProduct(Point A,Point B,Point C)
{
	return (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
}
</span>

有了这些基础,就可以对折线段的拐向进行判断


对于有公共端点的线段AB,BC,通过计算AB x AC可以确定AB的拐向


图示情况为AB x AC > 0 即AB在B点向左侧拐向C 



图示情况为AB x AC < 0 即AB在B点拐向右侧后到C


不要忘了AB x AC == 0 的情况,此时ABC共线。


转载于:https://www.cnblogs.com/sixdaycoder/p/4348374.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值