私のプロジェクト (VC++2010、MFC) では、CDC::Ellipse を使用して円を描画したいと考えています。2 つのポイントを設定します。1 つ目は円の中心、2 つ目は円周上のポイントです。
左上隅と右下隅の座標を CDC::Ellipse( int x1, int y1, int x2, int y2 ) に渡します。
簡単に言うと、ピタゴラの定理を使用して、2 点間の距離 ( radius ) を計算し、この値を中心の座標から引いて左上隅を取得し、加算して右下隅を取得します。
円と点を描いてズームインすると、2 番目の円が円周上になく、0°、45°、90° などに設定しない限り、わずかに内側にあることがわかります。座標の絶対系に関して。
次に、CDC::Polyline を使用して同じ円を描画しようとしました。半径に等しい距離で、中心を中心に別の点を回転させて取得した点をこのメソッドに与えました。この場合、ポイントは設定したすべての円周上にあります。
これらの 2 つの円の重なりは、それらが 0°、45°、90° などで完全に重なり合うことを示していますが、ギャップは 22.5°、67.5° などで最大になります。
誰かが似たような行動に気づいたことがありますか?
私を助けることができるすべての人に感謝します!
コード スニペット:
これは、2点を指定して半径を計算する方法です。
centerPX = vvFPoint( 1380, 845 );
secondPointPX = vvFPoint( 654,654 );
double radiusPX = (sqrt( (secondPointPX.x - centerPX.x) * (secondPointPX.x - centerPX.x) + (secondPointPX.y - centerPX.y) * (secondPointPX.y - centerPX.y) ));
( vvFPointは CPoint から派生したカスタム タイプです)
これは、CDC::Ellipse で「円」を描く方法です。
int up = (int)(((double)(m_p1.y-(double)originY - m_radius) / zoom) + 0.5) + offY;
int left = (int)(((double)(m_p1.x-(double)originX - m_radius) / zoom) + 0.5) + offX;
int down = (int)(((double)(m_p1.y-(double)originY + m_radius) / zoom) + 0.5) + offY;
int right = (int)(((double)(m_p1.x-(double)originX + m_radius) / zoom) + 0.5) + offX;
pDC->Ellipse( left, up, right, down);
( m_p1は円の中心、originX/Yは画像の原点、m_radiusは円の半径、zoomは倍率、offX/Yは SW のクライアント領域のオフセットです)
これは、カスタムポリラインクラスを使用して「手動で」(そして非常に簡単な方法で)円を描く方法です。
1) ポイントの配列を作成します。
point.x = centerPX.x + radiusPX;
point.y = centerPX.y;
for ( i=0; i < 3600; i++ )
{
pt1.RotateDeg ( centerPX, (double)0.1 );
poly->AddPoint( pt1 );
}
( RotateDegは、最初の引数をピボットとして、2 番目の引数を度単位の角度値として使用してポイントを回転させるカスタム メソッドです。AddPointは、ポイントの配列を作成するカスタム メソッドです。poly は、カスタムポリラインオブジェクトです)。
2)それを描きます:
Draw( CDC* pDC ) を呼び出すと、前の配列を使用してポリラインを描画します。
pDC->MoveTo(p);
これが私の奇妙な観察を再現するのに役立つことを願っています!
コード スニペット 2 :
void vvPoint<Tipo>::RotateDeg(const vvPoint<Tipo> ¢er, double angle)
{
vvPoint<Tipo> ptB;
angle *= -(M_PI / 180);
*this -= center;
ptB.x = ((this->x * cos(angle)) - (this->y * sin(angle)));
ptB.y = ((this->x * sin(angle)) + (this->y * cos(angle)));
*this = ptB + center;
}
しかし、私の観察をよりよく理解できるように、いくつかの画像を追加して、私の質問全体がどこから始まったかを確認できるようにしたいと思います...問題は、評判が10になる必要があるため、画像を追加できないことです. Dropbox に .zip ファイルをアップロードしました。必要に応じて、このファイルの URL をお送りします。これがこの問題を回避するための正しい (そして安全な..) 方法であるかどうか教えてください。
ありがとう!