2

これは説明するのが非常に複雑なので、最善を尽くします。見逃したものがある場合は申し訳ありません。お知らせください。修正します。

私の質問は、私はこの形を描くことを任されており、

三日月
(出典:learnersdictionary.com

これは、C++ を使用して、この形状の点を計算するコードを記述して実行します。

重要な詳細。

ユーザー入力 - 中心点 (X、Y)、表示する点の数、フォント サイズ (影響半径)

出力 - 形状の座標のリスト。

ポイントを取得した後の全体的な目的は、それらを Excel のグラフに入れることです。うまくいけば、ユーザーが入力したサイズで描画してくれます。

半径の最大値は 165mm、最小値は 35mm であることがわかっています。基本のフォント サイズを 20 にすることにしました。

半径 = (選択したフォント サイズ/20)*130。これは単なる推定です。おそらく正しくないことは承知していますが、少なくともテンプレートとしては機能すると思いました。

次に、2 つの異なる中心点を持つ 2 つの異なる円を作成し、それらをリンクして形状を作成することにしました。内側の線は、半径を大きくし、中心点を X 軸 (Y は一定のまま) に沿って大きくする必要があると考えました。

そこで、2 番目の中心点を (X+4, Y) と定義しました。(繰り返しになりますが、推定値であり、それらがどれだけ離れているかは実際には問題ではないと考えていました).

次に、半径 2 = (選択したフォント サイズ/20)*165 (最大半径) を決定しました。

したがって、2 つの半径と 2 つの中心点があります。

円の点を計算するために、私は本当に苦労しています。これを行う最善の方法は、インクリメントを作成することであると判断しました(ここにテンプレートがあります)

for(int i=0; i<=n; i++) //where 'n' is users chosen number of points
{ 
  //Equation for X point
  //Equation for Y Point
  cout<<"("<<X<<","<<Y<<")"<<endl;
}

さて、私の人生では、ポイントを計算するための方程式を理解することはできません. 角度を含む方程式を見つけましたが、何も持っていないので苦労しています。

私は本質的に、円の周りを除いて、ここでポイント 'P' を計算しようとしています。 (ソース: tutorvista.com )円上の点

私が問題であると考えているもう1つのポイントは、計算された値に制限を課して、形状にある値のみを表示することです。外側の線を完全な半円にする以外に制限を正確に選択する方法がわからないので、最大半径を取得できますか?

そう。正確に進める方法について、私と共有できるヒント/ヒント/リンクを誰かが持っていますか?

繰り返しますが、質問に問題がある場合は、申し訳ありませんが、お知らせいただければ修正するために最善を尽くします。

乾杯

アップデート;

R1 = (Font/20)*130;
R2 = (Font/20)*165;

for(X1=0; X1<=n; X1++)
{
    Y1 = ((2*Y)+(pow(((4*((pow((X1-X), 2)))+(pow(R1, 2)))), 0.5)))/2;
    Y2 = ((2*Y)-(pow(((4*((pow((X1-X), 2)))+(pow(R1, 2)))), 0.5)))/2;
    cout<<"("<<X1<<","<<Y1<<")";
    cout<<"("<<X1<<","<<Y2<<")";
}

意見?

4

2 に答える 2

2

円の方程式は

(x - h)^2 + (y - k)^2 = r^2

少し代数を使えば、 からまでxの範囲を適切な値だけインクリメントして反復し、 y の 2 つの対応する値を計算できます。これで完全な円が描画されます。hh+rdelta

次のステップは、2 つの円の交点の x 座標を見つけることです (月の形が 2 つの適切な円によって定義されていると仮定します)。繰り返しますが、いくつかの代数と鉛筆と紙が役に立ちます。

詳細:

極座標と三角関数を使用せずに円を描くには、次のようにします。

for x in h-r to h+r increment by delta
    calculate both y coordinates

y 座標を計算するには、円の方程式を y で解く必要があります。これを行う最も簡単な方法は、次の形式の二次方程式に変換し、二次方程式をA*y^2+B*y+C=0使用することです。

(x - h)^2 + (y - k)^2 = r^2
(x - h)^2 + (y - k)^2 - r^2 = 0
(y^2 - 2*k*y + k^2) + (x - h)^2  - r^2 = 0
y^2 - 2*k*y + (k^2 + (x - h)^2  - r^2) = 0

だから私たちは持っています

A = 1
B = -2*k
C = k^2 + (x - h)^2  - r^2

これらを 2 次方程式に代入し、for ループ内の各 x 値に対して 2 つの y 値を取り出します。(ほとんどの場合、別の関数で計算を行う必要があります。)

ご覧のとおり、これはかなり面倒です。三角法と角度でこれを行うと、はるかにきれいになります。

その他の考え:

質問で説明されているユーザー入力には角度がありませんが、計算中にそれらを使用できない本質的な理由はありません (特に特別な要件がある場合を除きます。たとえば、教師が使用しないように指示した場合を除きます)。そうは言っても、極座標を使用すると、これがはるかに簡単になります。完全な円の場合、次のようなことができます。

for theta = 0 to 2*PI increment by delta
    x = r * cos(theta)
    y = r * sin(theta)

完全な円ではなく弧を描くにthetaは、for ループ内の制限を変更するだけです。たとえば、円の左半分は からPI/2まで3*PI/2です。

于 2013-03-26T00:35:28.200 に答える
2

質問に対するCode-Guruのコメントによると、内側の円は外側よりも半円のように見えます. Code-Guru の回答の式を使用して、内側の円のポイントを計算します。次に、この質問を見て、距離(任意に設定できます)と交点(半円なので知っています)を考慮して、円と交差する円の半径を計算する方法を確認してください。これから任意の距離で外側の円弧を描くことができ、満足のいく形になるまで距離を変えるだけです。

この質問は、Code-Guru の方程式を適用するのに役立つ場合があります。

于 2013-03-26T00:48:04.320 に答える