C 实现射线检测多边形碰撞

本文介绍了使用射线检测算法实现点、线及多边形碰撞的方法,详细阐述了如何通过判断点与多边形边的位置关系,结合向量叉积公式,确定碰撞情况。此算法适用于2D和3D场景,对于防止刚体碰撞后的交织问题,通过计算左右点的数量差也可进行有效判断。同时,该方法还提供了线与线碰撞的检测方式。
摘要由CSDN通过智能技术生成

   以前,使用旋转分离轴实现过, 矩形旋转碰撞,OBB方向包围盒算法实现 。但这个算法,本身有点复杂,并且在边越多的时候计算量增长的会很快,扩展到3D层面会更加的复杂。而且这个算法碰撞后获取碰撞点的坐标有点繁琐。射线检测算法,是一个比较简单清晰的思路,实现起来复杂度也不高,碰撞点也容易获得,扩展到3D世界依然有效。

   要用射线去检测碰撞,之前我们先从一个点开始。如果能够判断一个点是否和多边形碰撞,那么就可以轻易的扩展到,线和多边形,多边形和多边形的碰撞。点与多边形的碰撞是基于这个实现,PNPOLY - Point Inclusion in Polygon Test

   其核心的思路是,判断这个点,和多边形每条边的位置关系。在一个多条边围成的区域,点在一条边的右侧,这个点可能在多边形内部,也可能在外部。但是如果判断完点和每一条边的左右关系,如果在右边的边是奇数个,那么点就在内部,如果是偶数,那么点就在外部(先要通过判断Y轴坐标,排除点完全在直线的上部或下部的情况,这时候没有左右的概念)。通过这个规则,就可以判断,点和多边形的碰撞关系。有两个注意点,多边行必须是凸多边形,并且如果点落在边上,我们算在右边,这样落在边上是算在内部。

   那么,如果判断一个点和一条边的位置关系。这里需要用到一个向量叉积公式。比如,点(x, y),与线 (x1, y1) (x2, y2) 的位置关系。我们先求出两个向量,(x - x1, y - y1) 和 (x2 - x1, y2 - y1)。对这两个向量做叉积的结果是 (x - x1) * (y2 - y1) - (y - y1) * (x2 - x1), 如果结果是0,那么点在线上。如果结果大于0,点在线的右边。如果结果小于0,点在线的左边。利用这个公式,我们就能判断点是否在多边形的内部还是外部。代码如下:

/**
 * Test polygon contains point, true inside or false outside
 * one vertex contains pair of x, y
 */
static bool TestPolygonPoint(Array(float)* vertexArr, float x, float y)
{
	int    preIndex   = vertexArr->length - 2;
	bool   inside     = false;
	float* vertexData = AArray_GetData(vertexArr, float);

	for (int i = 0; i < vertexArr->length; i += 2)
	{
		float vertexY = vertexData[i + 1];
		float preY    = vertexData[preIndex + 1];

		if ((vertexY < y && preY >= y) || (preY < y && verte
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值