如何找到一个点,一条线相交的2D(C#)的椭圆形(How to find a point where

2019-09-17 09:41发布

我需要找到一个点,一条线(其来源是椭圆“中心)在2D交叉的椭圆形......我可以很容易地找到一个圆上的一个点,因为我知道一个角度F和圈”半径(R):

x = x0 + R * cosF
y = y0 + R * sinF

不过,我实在不明白,我怎么对付椭圆...我知道它的尺寸(A&B),但什么是查找参数T的方式?

x = x0 + A * cosT
y = y0 + B * sinT

从我了解的参数T(T角)是不远处从F角度(在某些情况下约+ -15度),但我只是想不出如何计算呢!

如果有一个善良的灵魂,请帮我解决这个问题?

Answer 1:

椭圆的标准方程,驻扎在0,0,是:

1 = (x)^2 / (a)    +  (y)^2 / (b)

其中,a是1/2在水平轴线上的直径,b为1/2在垂直轴上的直径。

你有一条线,假设一个公式:

y = (m)(x - x0) + y0

所以,让我们即插即玩!

1 = (x)^2 / (a)   +   (m(x - x0) + y0)^2 / (b)

1 = x^2 / a  +  (mx + (y0 - mx0))^2 / b

1 = x^2 / a  +  (m^2 * x^2 + 2mx*(y0 - mx0) + (y0 - mx0)^2) / b

1 = x^2 / a  + (m^2 x^2) / b + (2mx*(y0 - mx0) + (y0^2 - 2y0mx0 + m^2*x0^2)) / b

1 = ((x^2 * b) / (a * b)) + ((m^2 * x^2 * a) / (a * b)) + (2mxy0 - 2m^2xx0)/b + (y0^2 - 2y0mx0 + m^2*x0^2)/b

1 = ((bx^2 + am^2x^2)/(ab)) + (x*(2my0 - 2m^2x0))/b + (y0^2 - 2y0mx0 + m^2*x0^2)/b

0 = x^2*((b + a*m^2)/(ab)) + x*((2my0 - 2m^2x0)/b) + (((y0^2 - 2y0mx0 + m^2*x0^2)/b) - 1)

这最后一个方程如下标准二次方程的形式。

因此,只要使用二次公式,有:

((b + a*m^2)/(ab))
((2my0 - 2m^2x0)/b)
and 
(((y0^2 - 2y0mx0 + m^2*x0^2)/b) - 1)

得到交点处的X值; 然后,插上这些值转换成原来的直线方程得到Y值。

祝好运!



Answer 2:

不要做这种方式。 代替检查形成椭圆方程和形成线和解决组:

椭圆: (x/a)^2 + (y/b)^2 = 1你的行: y = cx

你知道A,B和C,所以寻找一个解决方案是一件容易的事。 你会发现两种解决方案,因为该线横穿椭圆的两倍。

编辑:请注意,我搬到你的椭圆形的中心为(0,0)。 它让一切更容易。 只需添加(X0,Y0)的解决方案。



Answer 3:

我写了一个C#代码为您的问题,我希望你能发现它有用。 此代码内的距离函数来计算在空间中的两个点之间的欧氏距离。

wX表示椭圆的水平收音机和wY表示垂直无线电。

private PointF LineIntersectEllipse(PointF A, PointF B, float wX, float wY)
{
      double dx = B.X - A.X;
      double dy = B.Y - A.Y;
      double theta = Math.Atan2(dy, dx);
      double r = distance(A, B) - ((wX * wY) / Math.Sqrt(Math.Pow(wY * Math.Cos(theta), 2) + Math.Pow(wX * Math.Sin(theta), 2)));
      return PointF((float)(A.X + r * Math.Cos(theta)), (float)(A.Y + r * Math.Sin(theta)));
}


文章来源: How to find a point where a line intersects an ellipse in 2D (C#)