10

私は G コード インタープリターを書いていますが、円と半径上の 2 つのポイントに対して (X, Y) を指定すると、円の中心を決定するのに苦労しています。中心点を指定すると 2 点から円をプロットできますが、代わりに半径値を指定すると、それを中心点に使用できません。

さまざまな形式の数学 (微積分、幾何学、三角法など) で記述された複数の例を調べましたが、それらのいずれもコードに変換できません。私の理解では、指定された値は 2 つの異なる中心/交点を生成します。それらは私が理解する必要があるものです。

インタープリターは Arduino で実行され、C で記述されています。誰かが疑似コードで説明してくれれば、とても感謝しています。

ありがとう!

4

4 に答える 4

6

C# の場合:

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


    }
于 2016-03-24T23:43:32.033 に答える
3

2 つの点と半径が与えられたときに、常に一意の中心点を見つけることができるとは限りません。実際には、次の 3 つのケースがあります。

        

ケース 1:

                                  

指定された直径が指定されたポイント間の距離よりも小さい場合に発生します。この場合、解決策はありません。

ケース 2:

                                  

指定された直径が 2 点間の距離と正確に等しい場合に発生します。この場合、自明な解決策があります

                                  

ケース 3:

指定された直径が 2 点間の距離より大きい場合に発生します。この場合、方程式から 2 つの解が得られます。

                                  

たとえば、このページから解決策を見つけることができます:

                               

ここでqは 2 点間の距離で、[x3, y3]は中間点です。

   


このGistでは、これらを C で実装しようとしていますが、まだ完了していません。私が去ったところから自由に続けてください。

于 2019-04-06T17:45:26.570 に答える
0

これは同じコードの Ruby バージョンです。誰かがそれを必要とする場合に備えてください (rookie1024 による C# コードに感謝します)。

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
于 2016-07-15T12:34:20.480 に答える