2012-08-03 5 views
0

음, MFC를 사용하여 몇 가지 작은 창 응용 프로그램을 작성하고 어떻게 작동하는지 배우려고 노력 중이며, 국가의 국기를 그리는 동안 문제가 발생했습니다. 다음 코드 행은 3 개의 직사각형과 중간 직사각형의 중심에서 원을 그립니다. 다음으로해야 할 일은 원을 그어서 스포크를 그리는 것입니다. 즉, 45도 각도로 분리 된 8 개의 지름입니다.Visual C++에서 선분 회전

void CMainWindow::OnPaint(){ 
CPaintDC dc(this); 
for (int i=0;i <=100;i+=50) { 
    dc.SetBkMode(TRANSPARENT); 
    CRect rect; 
    CPen pen(PS_SOLID, 1, RGB(0,0,0)); 
    CPen *oldPen = dc.SelectObject(&pen); 
    if (i == 0){ 
     CBrush brush(RGB(255,130,0)); 
     CBrush *oldBrush = dc.SelectObject(&brush); 
     dc.Rectangle(75,(i+50),275,(i+100)); 
    } 
    else if(i == 50) { 
     CBrush brush(RGB(255,255,255)); 
     CBrush *oldBrush = dc.SelectObject(&brush); 
     dc.Rectangle(75,(i+50),275,(i+100)); 
     CPen pen2(PS_SOLID, 1,RGB(0,0,255)); 
     CPen *oldPen = dc.SelectObject(&pen2); 
     dc.Ellipse(150,100,200,150); 
    } 
    else { 
     CBrush brush(RGB(34,139,34)); 
     CBrush *oldBrush = dc.SelectObject(&brush); 
     dc.Rectangle(75,(i+50),275,(i+100)); 
    } 
} 

내가 어떻게 해야할지 모르겠다. MFC 라이브러리에서 찾았지만 아무런 운이 없었습니다.

+0

아무도 언급하지 않았으므로 일반적인 Sin/Cos 함수를 사용하여 결과를 지름으로 곱하여 중심점에 대한 상대 좌표를 얻을 수 있습니다. 나는 C++을하지 않기 때문에 당신에게 예제를 줄 수는 없습니다. – Deanna

답변

1

다음은 sin() cos() 메서드의 예입니다. 전체 코드 블록을 for 루프에 넣는 지점을 보지 못했습니다. 그 부분을 제거한 것을 보여줍니다.

#include "math.h" 
#define PI 3.1415926535898 
void DrawIndiaFlag(CDC & dc , int x, int y) 
{ 
    dc.SetBkMode(TRANSPARENT); 
    CRect rect; 
    CPen pen(PS_SOLID, 1, RGB(0,0,0)); 
    CPen *oldPen = dc.SelectObject(&pen); 

    { 
     CBrush brush(RGB(255,130,0)); 
     CBrush *oldBrush = dc.SelectObject(&brush); 
     dc.Rectangle(x,(y),x+200,(y+50)); 
     dc.SelectObject(oldBrush); 
    } 

    { 
     CBrush brush(RGB(255,255,255)); 
     CBrush *oldBrush = dc.SelectObject(&brush); 
     dc.Rectangle(x,(50+y),x+200,(y+100)); 
     CPen pen2(PS_SOLID, 1,RGB(0,0,255)); 
     CPen *oldPen = dc.SelectObject(&pen2); 
     dc.Ellipse(x+75,y+50,x+125,y+100); 

     // Draw spokes 
     int nOriginX = x+100; 
     int nOriginY = y+75; 
     int nRadius = 25; 
     int nSpokes = 24; 
     double fAngle = 2*PI/nSpokes; 

     for (int i =0; i<nSpokes; i++) 
     { 
      dc.MoveTo(nOriginX,nOriginY); 
      int nX = (int)ceil(cos((fAngle)*i)*(nRadius)+nOriginX); 
      int nY = (int)ceil(sin((fAngle)*i)*(nRadius)+nOriginY); 
      dc.LineTo(nX,nY); 
     } 
     dc.SelectObject(oldPen); 

    } 

    { 
     CBrush brush(RGB(34,139,34)); 
     CBrush *oldBrush = dc.SelectObject(&brush); 
     dc.Rectangle(x,(100+y),x+200,(150+y)); 
     dc.SelectObject(oldBrush); 
    } 

    dc.SelectObject(oldPen); 
} 
+0

안녕하세요. 실제로 문제가 해결되었지만 솔루션이보다 강력하고 유연한 것으로 보입니다. – vin

0

저는 현재 사용중인 API에 익숙하지 않습니다.

  • 얇은 사각형으로 시작하기는
  • 이 가기 원의 중심에서 그립니다 당신의 행으로 (더 라인 기능이없는 가정하고),이
  • 을 해결하는 쉬운 좌표해야한다
  • 첫 번째 줄에서 시작 위치를 가져 와서 원 중심에서 회전합니다. API 함수가없는 경우 여기에서 설명한대로 수동으로 수행 할 수 있습니다. http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm
  • 다음 회전 된 좌표를 사용하여 다음 줄을 입력 한 다음 다시 입력하십시오.
0

당신이 생각하는 것은 CDC::LineTo 방법입니다 (당신은 CDC::MoveTo을 사용하여 시작점에 도달 할 수 있습니다). 더 많은 정보 :

"x와 y (또는 점)에 의해 지정된 점까지 현재 위치에서부터 선을 그립니다 ... 선택한 펜으로 선을 그립니다. 현재 위치가 설정됩니다 x, y 또는 점으로. "