判断点是否在扇形范围内

7 篇文章 0 订阅
6 篇文章 0 订阅

最近做一个潜入游戏其中有一种敌人面前会有一个扇形的检测范围,并且此扇形范围会来回旋转移动,所以就遇到了一个如何判断主角是否在扇形范围内的问题。在网上找了一些方法,但是感觉都太复杂,所以这里自己实现了一下。


思路如下:

我的扇形的生成方式是从中心方向像两边展开若干角度。

所以我们只要算出扇形的中心向量与角色向量的夹脚是否大于扇形的展开角度即可。


步骤:

扇形的来回摆动是有程序控制,所以这里可以很容易得到扇形当点的摆动角度,这样就可以很容易的算出扇形的中心方向。

这里我们只需要一个单位向量即可,所以向量的x方向长度为cos(angle) = x/1,y方向为sin(angle) = y/1。

所以我们的代码应该是这样:

float sectorangle = (eulerAngles) * (Mathf.PI / 180f);
Vector2 from = new Vector2(Mathf.Cos(sectorangle), Mathf.Sin(sectorangle));

由于扇形的摆动是用角度来计算的,而Sin和Cos函数需要的是弧度,所以这里先计算出对应的弧度。

from即为我们需要的中心单位向量。

然后计算扇形中心点到目标点的单位向量,这个非常简单,两个坐标相减再进行归一化即可:

Vector2 to = (target.position - position).normalized;

现在我们只要计算两个向量的夹脚即可,unity为我们提供了现成的方法:

float angle = Vector2.Angle(from, to);

最后使用此结果与扇形的展开角度进行比较即可。



可以使用向量的方法来判断一个是否扇形范围内。首先,将扇形的起始和结束分别与目标构成两个向量,然后计算这两个向量的夹角,如果夹角小于等于扇形的角度,则目标扇形范围内。具体实现可以参考以下代码: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 typedef struct { double x; double y; } Point; double getAngle(Point p1, Point p2) { return atan2(p2.y - p1.y, p2.x - p1.x); } double getAngleDiff(double angle1, double angle2) { double diff = angle2 - angle1; while (diff > PI) { diff -= 2 * PI; } while (diff < -PI) { diff += 2 * PI; } return diff; } int isPointInSector(Point center, Point start, Point end, double radius, double angle) { double dist = sqrt(pow(center.x - start.x, 2) + pow(center.y - start.y, 2)); if (dist > radius) { return 0; } double angle1 = getAngle(center, start); double angle2 = getAngle(center, end); double diff = getAngleDiff(angle1, angle2); if (diff > angle) { return 0; } return 1; } int main() { Point center = {0, 0}; Point start = {1, 0}; Point end = {0, 1}; double radius = 1; double angle = PI / 4; Point target = {0.5, 0.5}; if (isPointInSector(center, start, end, radius, angle)) { printf("Target point is in sector\n"); } else { printf("Target point is not in sector\n"); } return 0; } ``` 这段代码实现了一个判断是否扇形范围内的函数 isPointInSector,其 center 表示扇形,start 和 end 表示扇形的起始和结束,radius 表示扇形的半径,angle 表示扇形的角度。函数返回值为 1 表示目标扇形范围内,返回值为 0 表示目标不在扇形范围内。在 main 函数,我们调用了 isPointInSector 函数来判断一个目标是否在一个半径为 1,角度为 45 度的扇形范围内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值