使用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);
		}
}
时间: 2024-10-12 20:59:17

使用MFC实现图形学课程中中点圆算法的相关文章

【计算机图形学课程】二.MFC鼠标响应函数模拟画图软件

上一篇文章我们讲述MFC绘制图形的基本函数,包括绘制直线.绘制矩形.绘制椭圆及绘制文字,同时通过绕圆旋转和矩形平移简单的理解了图形学知识.这篇文章我将介绍鼠标响应和键盘响应,通过这些事件让学生实现一个类似画图的简单软件,同时充分发挥学生想象,自己创作东西.        前文:       [计算机图形学课程]一.MFC基本绘图函数使用方法 一. MFC工程创建及鼠标响应 新建一个MFC 单文档的应用程序"MousePic". 然后,选择"View(视图)"->

【Python】菜鸟的基本课程继续中

同样的缩进表示这段代码处于同一个层次. 每一个print都自带一个换行. 定义变量一定要在使用函数等之前. abs(-14) ======= 取绝对值函数 内建函数 print abs(-14) ====== 14 notepad++编译器没有gbk的 所以但是dos脚本系统是使用gbk的 所以建议直接使用自带的IDLE进行编码 % s字符串 d整型 f浮点型 s文字 d.f数字:f小数点后六位 换行符 \n [Python]菜鸟的基本课程继续中,布布扣,bubuko.com

VC/MFC 在ListCtl 控件中随鼠标移动提示单元格信息

[cpp] view plaincopy BEGIN_MESSAGE_MAP(CTipListCtrl, CListCtrl) //{{AFX_MSG_MAP(CTipListCtrl) ON_WM_MOUSEMOVE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTipLis

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可

中点画圆算法

[中点画圆算法] 此算是一种圆的光栅化算法.定义以下函数: 通过上述函数,可以得到点(x,y)与半径为r的圆的关系: 已知点(Xk,Yk),我们需要知道(Xk+1,Yk).(Xk+1,Yk-1)哪一个更接近圆.决策方程如下: 如果Pk小于0,那么中点位于圆内,扫描线Yk上的像素更接近于圆.否则,中点位于圆外,应该选择Yk - 1. 参考:<计算机图形学>3.9.2 中点画圆算法 中点画圆算法

在.NET中应用MATLAB算法

在科学研究和工程应用中,往往要进行大量的数学计算,其中包括矩阵运算.这些运算一般来说难以用手工精确和快捷地进行,而要借助计算机编制相应的程序做近似计算.目前流行用Basic.Fortran和c语言编制计算程序, 既需要对有关算法有深刻的了解,还需要熟练地掌握所用语言的语法及编程技巧.对多数科学工作者而言,同时具备这两方面技能有一定困难.通常,编制程序也是繁杂的,不仅消耗人力与物力,而且影响工作进程和效率.为克服上述困难,美国Mathwork公司于1967年推出了"Matrix Laborator

Java中的经典算法之冒泡排序(Bubble Sort)

Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:  

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

iOS中中UIView头文件详细解析

@interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem> /** *  通过一个frame来初始化一个UI控件 */ - (id)initWithFrame:(CGRect)frame; // YES:能够跟用户进行交互 @property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteraction