验证点是否被圈出的算法

时间:2014-04-12 06:28:58

标签: android algorithm geometry point

enter image description here

我将在平面上有一个椭圆形。椭圆中心和椭圆半径的x和y坐标是已知的。使用粒子在平面上移动,必须验证椭圆是否被圈出(通过将粒子移动到椭圆的所有侧面)。

如何验证椭圆是否被粒子圈出?

2 个答案:

答案 0 :(得分:1)

考虑椭圆的中心是极坐标中的(0,0deg)。

我假设你的粒子没有进入椭圆形的边界(从你的椭圆形边缘)。

最小化粒子的起始位置(atan(yParticle-yOvalCentre,xParticle-xOvalCentre))的最小值和最大值。每次粒子都朝向最小更新最小角度,并且类似于最大值。一旦max-min> 360,你已经完成了这个圈子。

答案 1 :(得分:1)

当您决定开始围绕圆形绘制椭圆时,您创建了从圆心到点的起始矢量(让我们称之为鼠标点)。

  

(mouseX-circleX,mouseY-circleY)=起始载体

因此,当前和起始矢量之间的初始角度将为0(直到您移动鼠标为止)。

Mohit建议您检查当前矢量是否在最小和最大角度值之间达到一些增量(359度足够)(角度可以在-180 ... 180之间变化)。

但是,我不确定他的公式。我认为使用

这一事实找到起始矢量(ax,ay)和当前(bx,by)之间的角度会更好
  

[a,b] = | a | * | b | * sin(alpha)= ax * by - ay * bx

     

(a,b)= | a | * | b | * cos(alpha)= ax * bx + ay * by

     

atan([a,b] /(a,b))= atan(tan(alpha))= alpha

因此,计算每次鼠标移动时的当前角度并更新最小/最大值,直到max-min <1。 359

如果要同时检查多个圆圈,请同时对起始矢量数组和最小/最大值进行检查)

UPD 我在这里注意到了很大的问题,在围绕圆圈画180度之后,你立即得到-180分。因此,我认为最好的办法是在当前和流行之间积累一些有符号三角形角度的汇总值&#34; MouseMove&#34;打回来。因此,当汇总值变为359或-359时,表示您制作有效时钟或逆时针旋转。