使用MFC實現圖形學課程中中點圓算法

1.進入資源視圖,新建對話框,編輯修改Caption或者ID屬性 

  右擊該對話框添加類 基類爲 CDialog 

命名爲:MyCircleDialog


使用類嚮導,選擇MyCircleDialog類,選 擇成員變量 添加變量 value類型 int型 

m_radius  設置 變量取值範圍 

m_circlex 

m_circlex


2.添加菜單,設置ID 爲 ID_MyCircleMenu 並通過類嚮導添加消息映射函數

選擇類名 C***View

查找ID  ID_MyCircleMenu,映射 ONCOMMAND 消息 

 

C***View


3.添加變量並在構造函數中初始化

C***View.h

public:
    int m_vradius;
    int m_vcirclex;
    int m_vcircley;

C***View.cpp

    m_vradius = 0;
    m_vcirclex = 0;
    m_vcircley = 0;

添加 MyCircleDialog 頭文件 

#include "MyCircleDialog.h"


4.在消息處理程序中添加與dialog交互 獲取 輸入數據的代碼 

// CMFCCircleDialogDemoView 消息處理程序
void CMFCCircleDialogDemoView::OnMycirclemenu()
{
	// TODO: 在此添加命令處理程序代碼
	MyCircleDialog dlg;  //定義一個對話框對象
	if(dlg.DoModal() == IDOK) //顯示對話框
	{
		m_vradius = dlg.m_radius;
		m_vcirclex = dlg.m_circleX;
		m_vcircley = dlg.m_circleY;   //接收並存儲編輯框數據
		Invalidate(); //刷新視圖
	}
}


// CMFCTestView 繪製

5.在OnDraw中 添加 繪圖 代碼(取消CDC*參數註釋,使用所有設備環境基類CDC畫圖,

也可以定義使用 其他設備環境類如CClientDC等) 

void CMFCCircleDialogDemoView::OnDraw(CDC* pDC)
{
	CMFCCircleDialogDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此處爲本機數據添加繪製代碼
	/*確定圓心,畫出直角座標系*/
	CRect rect;
	GetWindowRect(rect);
	int center_x = rect.Width()/2;
	int center_y = rect.Height()/2;

	CPen myPen; //創建畫筆
	myPen.CreateStockObject(BLACK_PEN); //設置畫筆屬性
	pDC->SelectObject(&myPen); //綁定畫筆句柄

	pDC->MoveTo(center_x,0);
	pDC->LineTo(center_x, rect.Height());
	pDC->MoveTo(0,center_y);
	pDC->LineTo(rect.Width(),center_y);

	/*********************繪製圓****************/
		//邏輯圓心座標
	/*
		int m_vradius = 50;
		int m_vcirclex = -70; 
		int m_vcircley = 100;	
		*/
		//轉化爲畫布中圓心座標
		center_x = center_x + m_vcirclex;
		center_y = center_y - m_vcircley;
		pDC->SetPixel(center_x,center_y+m_vradius,RGB(125,125,125));//繪製圓心的點
		pDC->Ellipse(center_x-3,center_y-3,center_x+3,center_y+3); //畫個小圓,確定圓心位置
		int p=5/4-m_vradius;                                      //鍵值的初始值
		int x=0;
		int y=m_vradius;
        //使用中點圓算法畫圓  
		while(x<y){
			x++;
			if(p<0){				
				p=p+2*x+3;
				pDC->SetPixel(center_x+x,center_y+y,RGB(125,125,125));
				pDC->SetPixel(center_x+y,center_y+x,RGB(125,125,125));
				pDC->SetPixel(center_x+y,center_y-x,RGB(125,125,125));
				pDC->SetPixel(center_x+x,center_y-y,RGB(125,125,125));
				pDC->SetPixel(center_x-x,center_y-y,RGB(125,125,125));
				pDC->SetPixel(center_x-y,center_y-x,RGB(125,125,125));
				pDC->SetPixel(center_x-y,center_y+x,RGB(125,125,125));
				pDC->SetPixel(center_x-x,center_y+y,RGB(125,125,125));          //以對稱的方式完成圓的繪製
			}
			else{
				y--;
				p=p+2*x+3-2*y-2;
				pDC->SetPixel(center_x+x,center_y+y,RGB(125,125,125));
				pDC->SetPixel(center_x+y,center_y+x,RGB(125,125,125));
				pDC->SetPixel(center_x+y,center_y-x,RGB(125,125,125));
				pDC->SetPixel(center_x+x,center_y-y,RGB(125,125,125));
				pDC->SetPixel(center_x-x,center_y-y,RGB(125,125,125));
				pDC->SetPixel(center_x-y,center_y-x,RGB(125,125,125));
				pDC->SetPixel(center_x-y,center_y+x,RGB(125,125,125));
				pDC->SetPixel(center_x-x,center_y+y,RGB(125,125,125));             //以對稱的方式完成圓的繪製  
			}
			Sleep(20);
		}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章