点和椭圆(旋转)位置测试:算法

问题描述 投票:14回答:6

如何测试点P = [xp,yp]是否在中心C = [x,y],a,b和phi(旋转角度)给出的某些旋转椭圆的内部/外部?

目前,我正在使用以下解决方案:旋转椭圆并按-phi角度旋转点,然后对点和“非旋转”椭圆的位置进行通用测试。

但是有很多测试点(成千上万),我发现此解决方案很慢。是否有任何直接且更有效的方法来获得旋转椭圆和点的位置?

我不需要代码,但需要算法。感谢您的帮助。

algorithm testing position point ellipse
6个回答
29
投票

[另一种选择是将所有内容放入二维旋转椭圆的方程式中,然后查看结果是否小于1。

因此,如果以下不等式成立,则点在椭圆内

“椭圆方程”

其中(xp,yp)是点坐标,(x0,y0)是椭圆的中心。

我实现了一个小的Mathematica程序,证明它确实有效:“操作屏幕截图”“ >>

这里正在起作用:

“动画”

这是代码:

ellipse[x_, y_, a_, b_, \[Alpha]_, x0_: 0, y0_: 0] := 
     (((x - x0)*Cos[\[Alpha]] + (y - y0)*Sin[\[Alpha]])/a)^2
   + (((x - x0)*Sin[\[Alpha]] - (y - y0)*Cos[\[Alpha]])/b)^2;

Manipulate[
 RegionPlot[
  ellipse[x, y, a, b, \[Alpha] \[Degree], Sequence @@ pos] < 1, {x, -5, 5}, {y, -5, 5}, 
  PlotStyle -> If[ellipse[Sequence @@ p, a, b, \[Alpha] \[Degree], Sequence @@ pos] <= 1, Orange, LightBlue], 
  PlotPoints -> 25]
, {{a, 2}, 1, 5, Appearance -> "Labeled"}
, {{b, 4}, 2, 5, Appearance -> "Labeled"}
, {\[Alpha], 0, 180,  Appearance -> "Labeled"}
, {{p, {3, 1}}, Automatic, ControlType -> Locator}
, {{pos, {0, 0}}, Automatic, ControlType -> Locator}]

10
投票

您可以简单地将数据输入上述公式中。这是我根据Ajasja的建议进行的python实现:


6
投票

为了处理椭圆,我更喜欢将它们转换为另一个椭圆为以原点为中心的单位圆的坐标系。


1
投票

这是算法,我让您开发代码:


0
投票

Matplotlib在patch类中有一个Ellipse方法,使您可以问一个点是在补丁内还是在补丁外。检查here并查找方法contains_point()。您将需要使用Ellipse类创建椭圆,然后好像里面有一个点。顺便说一句,matplotlib是python的软件包。


0
投票

我想知道3D版本的方程如何:旋转的椭球。有什么想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.