如何确定一个点(X,Y)是否位于圆弧的一部分(即饼状图中的一片)之内?

22

想象一个圆。想象一块馅饼。想象尝试返回一个bool值,确定X,Y提供的参数是否包含在其中一个馅饼块中。

关于弧的了解:

我知道CenterX,CenterY,Radius,StartingAngle,EndingAngle,StartingPoint(圆周上的点),EndingPoint(圆周上的点)。

给定一个坐标X,Y,我想确定这个坐标是否在馅饼图形内。


1
为什么标记C#和Java?这看起来就像一个普通的数学问题。 - jzd
2
糟糕,我最初将问题设定为特定语言,但后来改为更通用的形式。忘记编辑标签了。抱歉。 - AlishahNovin
4个回答

37

检查:

  1. 从 centerX,centerY 经过 X,Y 的角度应该在 start 和 endangle 之间。
  2. 从 centerX,centerY 到 X,Y 的距离应小于半径。

这样就能得到您要的答案了。


1
@Wrikken,如何使用方程确定一个角度是否在另外两个角度之间? - Demian
@Demian:这篇文章有点旧了,但是你可以在这里找到答案:https://math.stackexchange.com/questions/1596513/find-the-bearing-angle-between-two-points-in-a-2d-space。 - rjcarr

19

我知道这个问题很旧,但是没有一个答案考虑到了弧在圆上的位置。

该算法认为所有角度都在0到360之间,并且弧朝正数数学方向绘制(逆时针)

首先,您可以转换为极坐标:半径(R)和角度(A)。注意:如果可用,请使用Atan2函数。wiki

R = sqrt ((X - CenterX)^2 + (Y - CenterY)^2)

A = atan2(Y - CenterY, X - CenterX)

现在,如果R < Radius,则点位于圆内。

要检查角度是否位于StartingAngle(S)和EndingAngle(E)之间,需要考虑两种可能性:

1)如果S < E,则如果S < A < E,则该点位于切片内

image 1

2)如果S > E,则有两种可能的情况

image 2

  • 如果A > S

则该点位于切片内

image 3

  • 如果A < E

则该点位于切片内

在所有其他情况下,该点位于切片之外。

image 4


1
@chux-ReinstateMonica 您是正确的。我之前没有看到过。 - user7048690
为什么你不能只是这样做:起点到角度 < 起点和终点之间的角度 = 在中间吗?我看不出所有这些if else边缘情况的原因。 - WDUK
@WDUK,假设你有一个从350度到30度的切片。假设你的点位于15度。它在切片内,但是350<15<30不成立。 - user7048690
我对这个问题的困惑是,假设你想定义一个弧,你不能真正用那些度数来定义某些图像。例如最后一张图片,你不能将弧定义为“在300度到35度之间”,因为这只有在顺时针方向的弧才有意义。 - WDUK
但是,假设您的起始角度为270度,结束角度为45度,这有点令人困惑(假设逆时针方向),因为您在两者之间移动的方式不能像角度=(起始,结束,t)一样进行线性插值,其中t=[0,1]。我觉得最好始终确保结束角度大于圆上的起始角度。@user7048690 - WDUK
显示剩余2条评论

17

使用以下公式将X,Y转换为极坐标:

角度 = arctan(y/x); 半径 = sqrt(x * x + y * y);

然后,角度必须在起始角度和结束角度之间,半径必须在0和您的半径之间。


你救了我的命!谢谢! :) - marverix
3
可以尝试使用(x*x+y*y)<=r*r代替Radius = sqrt(x * x + y * y); - timekeeper

0

在与起始角度和结束角度进行比较之前,您必须将atan2()转换为0-360。

(A> 0?A:(2 PI + A))* 360 /(2 PI)


如果atan2已经转换为0-360,那么(A> 0)条件是否是不必要的? - moi
不。atan2()函数返回的值在-π到π弧度之间。 - tada007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接