溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用MFC實(shí)現(xiàn)圖形學(xué)課程中中點(diǎn)圓算法

發(fā)布時(shí)間:2021-10-21 09:49:57 來源:億速云 閱讀:162 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)如何使用MFC實(shí)現(xiàn)圖形學(xué)課程中中點(diǎn)圓算法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

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

  右擊該對(duì)話框添加類 基類為 CDialog 

命名為:MyCircleDialog

使用類向?qū)?選擇MyCircleDialog類,選 擇成員變量 添加變量 value類型 int型 

m_radius  設(shè)置 變量取值范圍 

m_circlex 

m_circlex

2.添加菜單,設(shè)置ID 為 ID_MyCircleMenu 并通過類向?qū)砑酉⒂成浜瘮?shù)

選擇類名 C***View

查找ID  ID_MyCircleMenu,映射 ONCOMMAND 消息 

C***View

3.添加變量并在構(gòu)造函數(shù)中初始化

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交互 獲取 輸入數(shù)據(jù)的代碼 

// CMFCCircleDialogDemoView 消息處理程序
void CMFCCircleDialogDemoView::OnMycirclemenu()
{
	// TODO: 在此添加命令處理程序代碼
	MyCircleDialog dlg;  //定義一個(gè)對(duì)話框?qū)ο?
	if(dlg.DoModal() == IDOK) //顯示對(duì)話框
	{
		m_vradius = dlg.m_radius;
		m_vcirclex = dlg.m_circleX;
		m_vcircley = dlg.m_circleY;   //接收并存儲(chǔ)編輯框數(shù)據(jù)
		Invalidate(); //刷新視圖
	}
}

// CMFCTestView 繪制

5.在OnDraw中 添加 繪圖 代碼(取消CDC*參數(shù)注釋,使用所有設(shè)備環(huán)境基類CDC畫圖,

也可以定義使用 其他設(shè)備環(huán)境類如CClientDC等) 

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

	// TODO: 在此處為本機(jī)數(shù)據(jù)添加繪制代碼
	/*確定圓心,畫出直角坐標(biāo)系*/
	CRect rect;
	GetWindowRect(rect);
	int center_x = rect.Width()/2;
	int center_y = rect.Height()/2;

	CPen myPen; //創(chuàng)建畫筆
	myPen.CreateStockObject(BLACK_PEN); //設(shè)置畫筆屬性
	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);

	/*********************繪制圓****************/
		//邏輯圓心坐標(biāo)
	/*
		int m_vradius = 50;
		int m_vcirclex = -70; 
		int m_vcircley = 100;	
		*/
		//轉(zhuǎn)化為畫布中圓心坐標(biāo)
		center_x = center_x + m_vcirclex;
		center_y = center_y - m_vcircley;
		pDC->SetPixel(center_x,center_y+m_vradius,RGB(125,125,125));//繪制圓心的點(diǎn)
		pDC->Ellipse(center_x-3,center_y-3,center_x+3,center_y+3); //畫個(gè)小圓,確定圓心位置
		int p=5/4-m_vradius;                                      //鍵值的初始值
		int x=0;
		int y=m_vradius;
        //使用中點(diǎn)圓算法畫圓  
		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));          //以對(duì)稱的方式完成圓的繪制
			}
			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));             //以對(duì)稱的方式完成圓的繪制  
			}
			Sleep(20);
		}
}

關(guān)于“如何使用MFC實(shí)現(xiàn)圖形學(xué)課程中中點(diǎn)圓算法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

mfc
AI