2016-03-24 29 views
3

私はGコードインタプリタを書いて、円と半径の2ポイントの(X、Y)与えられたとき、円の中心を決定する非常に困難な時間を過ごしています。検索円弧/円の中心与えられた2点と半径

センターポイントが与えられたときに2ポイントから円をプロットすることができますが、半径値を代入すると、そのポイントをセンターポイントに変換できません。

私は数学の異なる形で書かれている複数の例(微積分、幾何学、三角など)まで見てきたが、コードにそれらのいずれかを翻訳することはできません。

私は、Visual Basicで1つだけ本当の答えとここで、この同じ質問を見つけましたが、貼り付けたコードのセクションが含まれていない追加のコードに依存しているように見えます。

私の理解は、指定された値が2つの異なる中心/交点を生成することです。それらは私が把握する必要があるものです。

通訳はArduinoで動作しており、Cで書かれています。誰かが私を擬似コードでも歩いてもらえると、私はとても感謝しています。

ありがとうございます!

+4

半径のある2つの点を通る円は、2つの解を持っています。 –

+0

[this](http://stackoverflow.com/a/4914148/1183079)答えを確認してください。代わりにsqrtの代わりにMath.Sqrtを使用してください。 – Kateract

答えて

3

private double CenterX(double x1,double y1, double x2, double y2,double radius) 
    { 
     double radsq = radius * radius; 
     double q = Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))); 
     double x3 = (x1 + x2)/2; 


    return x3 + Math.Sqrt(radsq - ((q/2) * (q/2))) * ((y1 - y2)/q); 


    } 

    private double CenterY(double x1, double y1, double x2, double y2, double radius) 
    { 
    double radsq = radius * radius; 
    double q = Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))); 

    double y3 = (y1 + y2)/2; 

     return y3 + Math.Sqrt(radsq - ((q/2) * (q/2))) * ((x2-x1)/q); 


    } 
+1

コーディー、これは素晴らしく見えます。私はできるだけ早くそれを試してみて、報告する。ありがとう! –

+0

私はあなたのプロジェクトに興味があります - あなたはarduinoで使用できるようにCNC通訳を書いていますか? –

+0

Yessir。ここまでは順調ですね。私はGコードが実際の標準を持っていないので、さまざまなソースから作成されたGコードファイルとのバトルテストを行ってきました。アークは間違いなくハードルでしたが、与えられたとき(I、J、K)コマンドを処理することができます。 GRBLと呼ばれるオープンソースプログラムがあり、Arduino上で実行され、Gコードを例外的に処理します。これは、独自のArduinoベースのCNCマシンを開発している人々にとっては、はるかに優れたプログラムです。 –

5

円の方程式と中点の方程式を考える:

q = sqrt((x2-x1)^2 + (y2-y1)^2) 

y3 = (y1+y2)/2 

x3 = (x1+x2)/2 

一つの答えは次のようになります。

x = x3 + sqrt(r^2-(q/2)^2)*(y1-y2)/q 

y = y3 + sqrt(r^2-(q/2)^2)*(x2-x1)/q 

他は次のようになりますと仮定すると、

x = x3 - sqrt(r^2-(q/2)^2)*(y1-y2)/q 

y = y3 - sqrt(r^2-(q/2)^2)*(x2-x1)/q 

ポイントの変数がすでに宣言されている場合、コードは次のようになります。

double q = Math.Sqrt(Math.Pow((x2-x1),2) + Math.Pow((y2-y1),2)); 

double y3 = (y1+y2)/2; 

double x3 = (x1+x2)/2; 

double basex = Math.Sqrt(Math.Pow(r,2)-Math.Pow((q/2),2))*(y1-y2)/q; //calculate once 
double basey = Math.Sqrt(Math.Pow(r,2)-Math.Pow((q/2),2))*(x2-x1)/q; //calculate once 

double centerx1 = x3 + basex; //center x of circle 1 
double centery1 = y3 + basey; //center y of circle 1 
double centerx2 = x3 - basex; //center x of circle 2 
double centery2 = y3 - basey; //center y of circle 2 

ソース:C#でhttp://mathforum.org/library/drmath/view/53027.html

+0

私は数時間でC#のバージョンを考え出します。 –

+0

welp ...コーディは既に1つを作っています。素晴らしいコーディーに見えます。 –

+0

応答Chrisをありがとう。私は線形の考え方に非常に制限されなければならない。 X3とY3が方程式の右辺にあるとき、私はこのような困難な時間をかけて解決します。 –

0

この同じコードのルビーバージョンは、誰かが

def chord 
    @chord ||= begin 
    a = (point_1.x.to_f - point_2.x.to_f).abs ** 2 
    b = (point_1.y.to_f - point_2.y.to_f).abs ** 2 
    Math.sqrt(a + b) 
    end 
end 

def radius 
    @radius ||= begin 
    s = (chord/2) * bulge 
    ((chord/2) ** 2 + (s ** 2))/(2*s) 
    end.to_f 
end 

def center 
    x1 = point_1.x 
    y1 = point_1.y 

    x2 = point_2.x 
    y2 = point_2.y 

    x3 = (x1+x2)/2 
    y3 = (y1+y2)/2 

    basex = Math.sqrt((radius ** 2) - ((chord/2) ** 2)) * (y1-y2)/chord 

    basey = Math.sqrt((radius ** 2) - ((chord/2) ** 2)) * (x2-x1)/chord 

    centerx1 = x3 + basex 
    centery1 = y3 + basey 
    centerx2 = x3 - basex 
    centery2 = y3 - basey 

    bulge > 0 ? [centerx1, centery1] : [centerx2, centery2] 
end 
(rookie1024により、C#コードのおかげで)、それを必要とする必要があります
関連する問題