如何在 2D 中查找圆周与椭圆相交的点 (C#)
本文关键字:2D 查找 | 更新日期: 2023-09-27 17:55:32
我需要找到一个圆周与椭圆相交的点。
椭圆方程为:
((x-x1)^2)/(a*a)+((y-y1)^2)/(b*b)=1
周长方程为:
(x-x0)^2+(y-y0)^2=r*r
,其中 (x0,y0) 和 (x1,y1) - 是图形的中心。
我一直试图使用上面的这些公式找到 (x, y) 的交集,但卡住了。
此外,我试图在谷歌中找到有关此主题的内容。谷歌回答了我几个解决方案,但所有这些解决方案都远非逻辑完整。
如果有人已经解决了这个问题,请帮忙。
您可以从以下解决方案开始:
public class Ellipse
{
public double x { get; set; }
public double y { get; set; }
public double a { get; set; }
public double b { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
var el1 = new Ellipse { x = 10, y = 4, a = 5, b = 2 };
var el2 = new Ellipse { x = 9, y = 4, a = 2, b = 3 };
var Xmin = Math.Max(el1.x - el1.a, el2.x - el2.a);
var Xmax = Math.Min(el1.x + el1.a, el2.x + el2.a);
var step = 0.01;
var accuracy = 0.01;
Func<Ellipse, double, List<double>> calculateY = (el, x) => {
var shift = el.b * Math.Sqrt(1 - Math.Pow((x - el.x) / el.a, 2));
return new List<double> { el.y - shift, el.y + shift };
};
var result = new List<List<double>>();
for(double i = Xmin; i <= Xmax; i += step)
{
var left = calculateY(el1, i);
var right = calculateY(el2, i);
foreach(var l in left)
foreach (var r in right)
if(Math.Abs(l - r) < accuracy)
result.Add(new List<double> { i, (l + r) / 2 });
}
foreach(var res in result)
Console.WriteLine(string.Format("x = {0}, y = {1}", res.First(), res.Last()));
}
}