1

だから私は線だけを使って形を描くことに大きな問題を抱えています。画面の中央の点から線を描き始め、ピクセル単位で 100 の距離で前方に描き、角度 0 で、角度 72 度などを使用して同じ長さの別の線を 360 度まで描くとします。ある線が終わり、その点から別の線が始まる完全な五角形が得られるはずですが、線が最後に交わらないので、角度が0/90/180/270の正方形には完璧に機能しますが、それぞれに対して機能させる必要があります均一な円を形成します。私は計算のためにこのことを使用しています:

_endingPointX = (_currentPostisionX + distance * _cosinuses[_angle]);

_endingPointY = (_currentPostisionY + distance * _sinuses[_angle]);

ここで、_cosinuses と _sinuses は double の配列で、360 度のそれぞれの正弦と余弦の値を含みます。線を描くときは、これらの値を整数にキャストする必要があります。

drawLine(_currentPostisionX, _currentPostisionY, (int) _endingPointX, (int) _endingPointY);

これを修正して、描画された形状の最後で線を合わせる方法がわかりません。数日間これを理解しようとしてきましたが、何も頭に浮かびません。

スクリーンショットは次のとおりです。 ここに画像の説明を入力

問題は解決しました。アドバイスありがとうございます。整数キャストを使用した私の間違いでした。

4

3 に答える 3

2

描画する直前に、すべての値を二重および丸めで計算します。
丸みを帯びたものでこれ以上計算しないでください。

五角形または多角形を描くには、次のようなものを使用します。

     // number of corners of pentagon
    double numVertex = 5;
    // how much to change the angle for the next corner( of the turtle )
    double angleStep = 360.0 / numVertex;
    gc.moveTo(cx, cy - rad);
    for (int i= 1; i < numVertex; i++) {
         // total angle from 0 degrees
         double angle = i* angleStep;
         // px point of turtle is corner of pentagon
         double px = cx + rad * sin(angle * DEG_TO_RADIANS);
         // move turtle to
         gc.lineto((int)Math.round(px),
         (int)Math.round(py));
    }
     gc.lineTo(cx, cy - rad);

代わりにラインを使用するlineToと、ポイントが満たされる可能性が高くなります。

于 2012-12-16T22:48:06.750 に答える
0

値だけに頼ると、不合理であり、もちろんそうではないintため、精度の問題が発生します。sin(72°)sin(90°)

Line2Dただし、両方doubleまたはfloat精度で描画することも、 GeneralPath[を使用するfloat] を使用することもできます。

于 2012-12-16T22:50:23.220 に答える
0

sin 関数と cos 関数の精度に起因する丸め誤差のため、完全には一致しません。これを修正するには、開始点を別の変数として保存し、それを最後の行の終了点として使用します。

于 2012-12-16T22:40:41.380 に答える