在Visual C ++中旋转线段

时间:2012-08-03 06:59:48

标签: winapi mfc geometry gdi trigonometry

好吧,我正在尝试使用MFC构建一些小型Windows应用程序,并试图了解工作原理,并在绘制国家标志时,我遇到了问题。下面的代码行在中间矩形的中心绘制三个矩形和一个圆,接下来需要做的是将辐条画成圆形,即8个直径相隔45度角。

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库中找到它但没有运气!

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

我不熟悉您正在使用的API,但您可以;

  • 以细线矩形(假设没有线功能)作为您的线
  • 开始
  • 从圆圈中心到顶部绘制,这应该是一个简单的协调来解决问题
  • 从第一行开始占据这些起始位置并围绕圆圈的中心旋转它们,如果它们没有API功能,您可以按照此处的说明手动执行http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm
  • 使用这些新的旋转坐标绘制下一行,然后重复

答案 2 :(得分:0)

我认为你所追求的是CDC::LineTo方法(你可以使用CDC::MoveTo来达到起点)。更多信息:

“从当前位置绘制一条线,但不包括x和y(或点)指定的点...使用所选笔绘制线条。当前位置设置为x,y或指出。“