简单的MFC画正弦曲线
1. MFC 單文檔 如何畫正弦曲線
1.畫筆類,CPen,創建畫筆類的對象后,需要調用CreatePen(......)函數創建畫筆。然后將其選入設備描述表中。
pDC->SelectObject(.......);
2.設置起點坐標。在這里調用一個函數來設置坐標原點。
pDC->SetViewportOrg(100,255);
3.調用LineTo(point),MoveTo(Point)函數畫圖。
4.刪除創建的畫筆對象。pen.DeleteObject();
以下是今天所寫的畫正弦函數的圖像。創建一個單文檔的應用程序。并且在VIEW類中的OnDraw(。。。。)函數里面做消息響應。由于調用了sin()函數,所以要把math.h頭文件包含進來。#include "math.h"
void CDrawSinXView::OnDraw(CDC* pDC)
{
CDrawSinXDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//建立畫筆
CPen pen_Zuobixi,pen_sinx;
pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));
pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));
pDC->SelectObject(&pen_Zuobixi);
//指定原點
pDC->SetViewportOrg(100,255);
pDC->SetTextColor(RGB(255,0,0));
//繪制橫坐標
CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};
int n=-1;
int nTemp=0;
while (nTemp<=660)
{
?? pDC->LineTo(60*n,0);
?? pDC->LineTo(60*n,-5);
?? pDC->MoveTo(60*n,0);
?? pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);
?? n++;
?? nTemp +=60;
}
pDC->MoveTo(0,0);
CString strTemp;
//繪制縱坐標
for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60)
{
?? pDC->LineTo(0,60*n);
?? pDC->LineTo(5,60*n);
?? pDC->MoveTo(0,60*n);
?? strTemp.Format("%d",-n);
?? pDC->TextOut(10,60*n,strTemp);
}
?? double y,radian;?
pDC->SelectObject(&pen_sinx);
for(int x=-60;x<600;x++)
{
?? //弧度=X坐標/曲線寬度*角系數*π
?? //Y坐標=振幅*曲線寬度*sin(弧度)
?? radian =x/((double)60*2)*PI;
?? y=sin(radian)*2*60;
?? pDC->MoveTo((int)x,(int)y);
?? pDC->LineTo((int)x,(int)y);
}
pen_sinx.DeleteObject();
pen_Zuobixi.DeleteObject();
}
?
http://www.360doc.com/content/14/1127/22/11539950_428607967.shtml
?
2. 做一個振幅可以改變的正弦曲線的vc小程序,但是坐標軸可以畫出來,正弦曲線出不來,高手給分析一下程序吧~
void?CSinxDlg::OnBtn()?
{
//?TODO:?Add?your?control?notification?handler?code?here
CWnd*?pWnd=GetDlgItem(IDC_SRC);
CDC*?pDC=pWnd->GetDC();
pDC->Rectangle(0,0,400,300);
CPen?redpen(PS_SOLID,1,RGB(255,0,0));
CPen*?pOldPen=pDC->SelectObject(&redpen);
pDC->MoveTo(20,10);
pDC->LineTo(20,290);
pDC->MoveTo(20,150);
pDC->LineTo(380,150);
CString?sPIText[]={"0","1/2π","π","3/2π","2π","5/2π","3π"};
for?(int?i=0;i<7;i++)
{
pDC->MoveTo(60*i+20,150);
pDC->LineTo(60*i+20,145);
pDC->TextOut(60*i+15,153,sPIText[i]);
}
CString?sYText[]={"-2","-3/2","-1","-1/2","","1/2","1","3/2","2"};
for?(int?j=0,m=0;m<9;j++,m++)
{
pDC->MoveTo(20,250-25*j);
pDC->LineTo(23,250-25*j);
pDC->TextOut(5,250-25*j,sYText[m]);
}
pDC->SelectObject?(pOldPen);
double?radian,y;
UpdateData();
double?m_pi;
m_pi=m_radius;
for?(i=20;i<380;i++)
{
radian=(i-20)/((double)60*2)*PI;
y=150-sin(radian)*50*m_pi;
pDC->MoveTo(i,(int)y);
pDC->LineTo(i,(int)y);
}
}
小弟明白了,其實最后兩句:
?pDC->MoveTo(i,(int)y);
?pDC->LineTo(i,(int)y);
進行畫線的時候是顯示的正弦曲線上的一些點,但是此時系統畫筆的寬度為1,當畫筆寬度為1時,是不顯示繪制的每個點的,當把畫筆的寬度改為2或者更大的時候就可以顯示啦~
http://bbs.csdn.net/topics/340031505
總結
以上是生活随笔為你收集整理的简单的MFC画正弦曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15条常用的视频音频编辑脚本命令(men
- 下一篇: C++中cstring和int互换