2016-07-07 5 views
0

円周が楕円と交差する点を見つける必要があります。2D(C#)で円周が楕円と交差する点を見つける方法

楕円の方程式は次のとおりです。周囲の

((x-x1)^2)/(a*a)+((y-y1)^2)/(b*b)=1 

式は以下のとおりです(x0、y0)と(X1、Y1)が

(x-x0)^2+(y-y0)^2=r*r 

、 - 図の中心です。

私は上記の数式を使って交差点を(x、y)見つけようとしていましたが、立ち往生しました。

また、私はこのトピックについてgoogleで何かを見つけようとしました。 Googleはいくつかの解決策で私に答えましたが、それらのすべては論理的に完全ではありませんでした。

誰かがすでにこの問題を解決している場合は、お手伝いください。

+4

あなたはおそらく、あなたが言うとき、あなたは「円」を意味するかmath.stackexchange.com http://stackexchange.com/sites – Slai

+0

に良い答えを得るでしょう[ 'circumferential'](https://en.wikipedia.org/wiki/Circumference)? – TaW

+1

円はa == bの楕円であるため、これを2つの楕円について解くと、円と楕円の解が得られます。 [ここにはC#のサンプルソリューションがあります](http://csharphelper.com/blog/2014/11/see-where-two-ellipses-intersect-in-c-part-1/)。 –

答えて

0

あなたはsolutionこれを起動することができます。

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()));    
    }   
}