`
wangchangshuai0010
  • 浏览: 120790 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

计算机图形学几个算法的关键代码

阅读更多

一、中点画线算法:

 

//中点画线算法
void CMidPointLineView::MyMidLine(int x0, int y0, int x1, int y1)
{
	CClientDC dc(this);

	int a=0;
	int b=0;
	int d1=0;
	int d2=0;
	int d=0;
	int x=0;
	int y=0;
	
	a=y0-y1;
	b=x1-x0;
	d=2*a+b;
	d1=2*a;
	d2=2*a+2*b;
	x=x0;
	y=y0;
	
	dc.SetPixel(x,y,RGB(255,0,0));
	while(x<x1)
	{
		if(d<0)
		{
			x++;
			y++;
			d += d2;
		}
		else
		{
			x++;
			d += d1;
		}
		dc.SetPixel(x,y,RGB(255,0,0));
	}
}
效果图如下:

 

 

二、中点画圆算法:


 

//画1/8圆弧
void CMidPointCircleView::MyMidCircle(int x0,int y0, int r)
{
	CClientDC dc(this);
	int x=0;
	int y=r;
	float d=1.25-r;
    CirclePoint(x0,y0,x,y);
	while(x<=y)
	{
		if(d<0)
		{
           d+=2*x+3;
		}
		else
		{
		d+=2*(x-y)+5;
		y--;
		}
		x++;
		CirclePoint(x0,y0,x,y);
	}
}
效果图如下:

 

 

三、多边形裁剪算法:


 

//直线窗口裁剪
int CPolygonCutView::DrawLine(float x1, float y1, float x2, float y2)

{
	CDC *pDC=GetDC();
	int code1,code2,code;
	float x,y;

	CPen redpen(PS_SOLID,1,RGB(255,0,0));//创建画实线、线宽为2的红色画笔
	CPen *old=pDC->SelectObject(&redpen);

	encode(x1,y1,code1);
	encode(x2,y2,code2);
	while(code1!=0||code2!=0)
	{
		if(code1&code2)
			return 1;//线段在窗口外,返回
		code=code1;
		if(code1==0)code=code2;
		if(l&code)
		{
			x=left;
			y=y1+(y2-y1)*(left-x1)/(x2-x1);
		}
		else if(r&code)
		{
			x=right;
			y=y1+(y2-y1)*(right-x1)/(x2-x1);
		}
		else if(b&code)
		{
			y=bottom;
			x=x1+(x2-x1)*(bottom-y1)/(y2-y1);
		}
		else if(t&code)
		{
			y=top;
			x=x1+(x2-x1)*(top-y1)/(y2-y1);
		}
		if(code==code1)
		{
			x1=x;y1=y;encode(x,y,code1);
		}
		else
		{
			x2=x;y2=y;encode(x,y,code2);
		}
	}
	pDC->MoveTo(x1,y1);
	pDC->LineTo(x2,y2);

	ReleaseDC(pDC);

	return 1;
}

效果图如下:

 

 

四、多边形区域填充算法:


 

//扫描线填充算法
void CFieldFillView::ScanlineSeedfill(CDC *pDC, int x, int y, COLORREF boundaryvalue, COLORREF newvalue)
{
	int x0,xl,xr,y0,xid;
	int flag,xnextspan;
	stack<CPoint> s;//堆栈
	CPoint p;
	s.push(CPoint(x,y));//第一个种子入栈
	while (!s.empty())//堆栈不为空
	{
		p = s.top();
		s.pop();//取栈顶元素并弹栈
		pDC->SetPixel(p.x,p.y,newvalue);//绘制像素点为指定颜色
		x = p.x;y = p.y;
		x0 =x + 1;
		while (pDC->GetPixel(x0,y) != boundaryvalue)//填充右方元素
		{
			pDC->SetPixel(x0,y,newvalue);
			x0++;
		}
		xr = x0 -1;//最右边像素
		x0 = x -1;
		while (pDC->GetPixel(x0,y) != boundaryvalue)//填充左方像素
		{
			pDC->SetPixel(x0,y,newvalue);
			x0--;
		}
		xl = x0 + 1;//最左边像素
		//检查上一条和下一条扫描线,若存在边界且未填充的像素
		//则选取代表各连续区间的种子像素入栈
		y0 = y;
		for (int i=1;i>=-1;i-=2)
		{
			x0 = xr;
			y = y0 + i;//获得上一行和下一行
			while (x0 >= xl)
			{
				flag = 0;
				while ((pDC->GetPixel(x0,y) != boundaryvalue)
					&& (pDC->GetPixel(x0,y) != newvalue) 
					&& (x0 > xl))
				{
					if (flag == 0)
					{
						flag = 1;
						xid = x0;
					}
					x0--;
				}
				if (flag == 1)
				{
					s.push(CPoint(xid,y));//新种子入栈
					flag = 0;
				}
				xnextspan = x0;
				while ((pDC->GetPixel(x0,y) == boundaryvalue)
					|| (pDC->GetPixel(x0,y) == newvalue)
					&& (x0 >= xl))
					x0--;
				if (xnextspan == x0) x0--;
			}
		}
	}
}

效果图如下:

 

 

 

五、Bezier曲线生成算法:


 

//画Bezier曲线
void CBezierView::OnBezier() 
{
	CDC*pDC=GetDC();
	RedrawWindow();
    CPen redpen(PS_SOLID,2,RGB(255,0,0));//创建画笔
	CPen *old=pDC->SelectObject(&redpen);
	float x0=50,y0=80,x1=150,y1=250,x2=400,y2=130,x3=300,y3=70;
	float x,y,dt,t,n=30.0;
	int i ;
	dt=1/n;
	for(i=0;i<=n;i++)
	{
		t=i*dt;
		x=x0*(1-t)*(1-t)*(1-t)+x1*3*t*(1-t)*(1-t)+x2*3*t*t*(1-t)+x3*t*t*t;
        y=y0*(1-t)*(1-t)*(1-t)+y1*3*t*(1-t)*(1-t)+y2*3*t*t*(1-t)+y3*t*t*t;
		if(i==0)pDC->MoveTo(x,y);
		pDC->LineTo(x,y);
	}
    pDC->MoveTo(x0,y0);
	pDC->LineTo(x1,y1);
	pDC->LineTo(x2,y2);
	pDC->LineTo(x3,y3);

	pDC->SelectObject(old);
	ReleaseDC(pDC);
}

效果图如下:

 

 

 

 

工程文件下载地址:http://www.kuaipan.cn/file/id_8128290032206914.htm

 

 

 

 

 

 

 

 

2
2
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    C语言在本科计算机相关专业的课程定位及学习体会-.doc

    C语言作为一门计算机高级语言,对于初学者普遍觉得难学、学不懂,笔者就 如何学好C语言谈了几点体会,供同行之间交流。 【关键词】:^p :C语言;计算机 一、首先要学好数学这门基础课 IT 界有一句比较实在的话"数学...

    vc++ 应用源码包_6

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

    vc++ 应用源码包_5

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

    vc++ 开发实例源码包

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 1:综合FTP下载和HTTP(网络蚂蚁)(多线程). 2:FTP...

    计算机二级公共基础知识

    二叉树具有以下几个性质: 性质1:在二叉树的第k层上,最多有2k-1(k≥1)个结点。 性质2:深度为m的二叉树最多有2m-1个结点。 性质3:在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。 ...

    vc++ 应用源码包_1

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

    vc++ 应用源码包_2

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

    vc++ 应用源码包_3

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

    基于C++开发的射击游戏

    解决这个问题有几个方法,其中有一个方法是利用计算机图形学上的Bresenhem直线算法。该算法用于计算机画平面上的直线,算法如下: |m|的情况 1、输入线段的两个端点,并将左端点存储在(x0,y0)中; 2、将(x0,y0)装入...

    软件工程知识点

    它包含:软件定义、软件开发、软件运行维护三个时期,并可以细分为可行性研究、项目计划、需求分析、概要设计、详细设计、编码实现与单元测试、系统集成测试、系统确认验证、系统运行与维护等几个阶段。 软件定义...

    软件设计规范

    把这种“高级计算机语言”翻译成可以执行的代码,就是软件生成(代码生成)的任务。而软件编制是专业人员的事情,因此语言问题的本质其实不那么重要。须知,经过培训,莫尔司码的电报发报可以比说话的语速还快!因此...

    数据结构(C++)有关练习题

    2、实现1所要求的代码后,运行设计好的代码,将以下的几组整数序列建成搜索二叉树,并记录下它们的前序遍历序列和后序遍历序列: a. 1、3、5、7、9; b. 1、13、35、13、27; c. 50、25、78、13、44、...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...

    软件工程-理论与实践(许家珆)习题答案

    软件发展有几个阶段?各有何特征? 答: ① 程序设计阶段。  硬件特征:价格贵、存储容量小、运行可靠性差。  软件特征:只有程序、程序设计概念,不重视程序设计方法。  ② 程序系统阶段。  硬件特征:速度、...

    VC与Labview、Matlab编程论文资料[2].rar

    基于VC_Maya_Matlab的图形学算法实验平台.pdf 基于VC_MFC的滑动轴承设计软件开发.pdf 基于VC__NET的串行通信的机器人控制系统设计.pdf 基于VC_与LabVIEV的微机采样与保护算法虚拟测试软件的研制.pdf 基于VC_与Matlab...

    VC与Labview、Matlab编程论文资料

    基于VC_Maya_Matlab的图形学算法实验平台.pdf 基于VC_MFC的滑动轴承设计软件开发.pdf 基于VC__NET的串行通信的机器人控制系统设计.pdf 基于VC_与LabVIEV的微机采样与保护算法虚拟测试软件的研制.pdf 基于VC_与Matlab...

    VC与Labview、Matlab编程论文资料[4].rar

    基于VC_Maya_Matlab的图形学算法实验平台.pdf 基于VC_MFC的滑动轴承设计软件开发.pdf 基于VC__NET的串行通信的机器人控制系统设计.pdf 基于VC_与LabVIEV的微机采样与保护算法虚拟测试软件的研制.pdf 基于VC_与Matlab...

Global site tag (gtag.js) - Google Analytics