- 浏览: 279656 次
- 性别:
- 来自: 济南
文章分类
最新评论
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205
圆的特征
圆被定义为到给定中心位置(xc,yc)距离为r的点集。圆心位于原点的圆有四条对称轴x=0,y=0, x=y和x=-y。若已知圆弧上一点(x,y),可以得到其关于四条对称轴的其它7个点,这种性质称为八分对称性。因此,只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集。
显示圆弧上的八个对称点的算法:
void CirclePoints(int x,int y,int color) { Putpixel(x,y,color); Putpixel(y,x,color); Putpixel(-x,y,color); Putpixel(y,-x,color); Putpixel(x,-y,color); Putpixel(-y,x,color); Putpixel(-x,-y,color); Putpixel(-y,-x,color); }
中点画圆算法
果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:
d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2
若 d<0,则应取P1为下一象素,而且再下一象素的判别式为:
d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3
若d≥0,则应取P2为下一象素,而且下一象素的判别式为
d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5
我们这里讨论的第一个象素是(0,R),判别式d的初始值为:
d0=F(1,R-0.5)=1.25-R
【算法流程图】
【算法代码】
void PaintArea::drawCircleMiddle(QPainter &painter,const QPoint ¢er, int r) { int x,y,deltax,deltay,d; x=0;y=r; deltax=3;deltay=2-3-3;d=1-r; while(x<y) { if(d<0) { d+=deltax; deltax+=2; x++; } else { d+=(deltax+deltay); deltax+=2;deltay+=2; x++;y++; } painter.drawPoint(center.x()+x,center.y()+y); painter.drawPoint(center.x()+x,center.y()-y); painter.drawPoint(center.x()-x,center.y()+y); painter.drawPoint(center.x()-x,center.y()-y); painter.drawPoint(center.x()+y,center.y()+x); painter.drawPoint(center.x()+y,center.y()-x); painter.drawPoint(center.x()-y,center.y()+x); painter.drawPoint(center.x()-y,center.y()-x); } }
Bresenham画圆算法
思想参见直线的Bresenham画法 【计算机图形学】基本图形元素:直线的生成算法
【算法流程图】
【算法代码】
void PaintArea::drawCircleBresenham(QPainter &painter,const QPoint ¢er, int r) { int x,y,delta,delta1,delta2,direction; x=0;y=r; delta=2*(1-r); while(y>=0) { painter.drawPoint(x,y); if(delta<0) { delta1=2*(delta+y)-1; if(delta1<=0)direction=1; else direction=2; } else if(delta>0) { delta2=2*(delta-x)-1; if(delta2<=0)direction=2; else direction=3; } else direction=2; switch(direction) {case 1: x++;delta+=2*x+1; break; case 2: x++; y--; delta+=2*(x-y+1); break; case 3: y--;delta+=(-2*y+1); break; } } }
椭圆弧生成算法
基本同圆弧算法,只是方程变得复杂F(x,y)=(bx)^2+(ay)^2-(ab)^2.
对称性:4分对称,画第一象限
分段依据:斜率为一点
上段圆弧:
下段圆弧:
【椭圆中点算法流程图】
【算法代码】
void PaintArea::drawEllipseMiddle(QPainter &painter,int xCenter,int yCenter, int Rx, int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p,x=0,y=Ry,px=0,py=twoRx2*y; void ellipsePlotPoints(QPainter&,int,int,int,int); ellipsePlotPoints(painter,xCenter,yCenter,x,y); //Region1 p=round(Ry-(Rx2*Ry)+(0.25*Rx2)); while(px<py){ x++; px+=twoRy2; if(p<0) p+=Ry2+px; else{ y--; py-=twoRx2; p+=Ry2+px-py; } ellipsePlotPoints(painter,xCenter,yCenter,x,y); } //Region2 p=round(Ry2*(x+0.5)*(x+0.5)+Rx2*(y-1)*(y-1)-Rx2*Ry2); while(y>0){ y--; py-=twoRx2; if(p>0) p+=Rx2-py; else{ x++; px+=twoRy2; p+=Rx2-py+px; } ellipsePlotPoints(painter,xCenter,yCenter,x,y); } } void ellipsePlotPoints(QPainter &painter,int xCenter,int yCenter,int x,int y) { painter.drawPoint(xCenter+x,yCenter+y); painter.drawPoint(xCenter-x,yCenter+y); painter.drawPoint(xCenter+x,yCenter-y); painter.drawPoint(xCenter-x,yCenter-y); }
软件截图
这个绘图软件是用QT写的,我会另外写一篇介绍编程结构,待续~
转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7909607
发表评论
-
unity基础开发----物体位移和旋转实用代码
2013-11-21 22:46 1268using UnityEngine; using Syst ... -
android 动态时钟 附源码
2013-09-24 12:03 1279自定义View实践 例子代码 自定义动态时钟 ... -
android Dialog 背景问题
2013-08-14 11:22 1203我们在使用自定义的Dialog的时候,喜欢自己 ... -
ScrollView scrollTo 的使用 动画效果
2013-08-05 17:43 4595今天用到了ScrollView scrollTo方法 ... -
Android中View绘制优化之一---- 优化布局层次
2012-09-04 23:00 1065... -
Android中View绘制优化二一---- 使用<include />标签复用布局文件
2012-09-08 13:54 1049... -
Android中View绘制优化之三---- 优化View
2012-09-13 21:00 1081... -
兰林任务管理应用程序雏形版以及概要说明
2012-09-15 21:54 874... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
2012-10-10 18:14 1160... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
2012-10-17 20:05 858... -
Android中文件选择器的实现
2012-11-30 08:59 1164... -
【编译原理】使用Lex将C/C++文件输出为HTML文件
2012-07-20 09:37 106108年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【编译原理】正则表达式
2012-07-21 21:49 229308年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】访问Mat图像中每个像素的值
2012-07-22 07:10 1168今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值 ... -
【编译原理】用Yacc做语法分析
2012-07-23 05:47 176608年9月入学,12年7月毕 ... -
【UML】UML几种图的绘制
2012-07-24 09:49 98408年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
2012-07-26 10:52 1452邻域滤波(卷积) 邻域算子值利用给定像素 ... -
【数据结构】排序算法:希尔、归并、快速、堆排序
2012-07-28 06:15 101908年9月入学,12年7月毕 ... -
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
2012-07-31 13:25 1542角点 特征检测与匹配 ... -
【UML】案例分析:机场运作系统
2012-08-01 17:22 310508年9月入学,12年7月毕 ...
相关推荐
基本二维图元的生成算法是计算机图形学中最基础的部分,它们是构成图形图像的基本元素。这些图元的生成算法可以分为两步:首先,确定图形对应的象素集合及其颜色;其次,用图形的颜色或其他属性对象素进行写操作。...
在计算机图形学中,线段的绘制通常采用Bresenham算法或DDA(Digital Differential Analyzer)算法,这些算法能高效地在像素级别上近似出直线。 二、圆与椭圆 圆和椭圆的表示通常基于极坐标或者参数方程。例如,可以...
在计算机图形学中,直线和圆是最基本的图形元素,它们的绘制算法是图形渲染的基础。下面将详细介绍标题和描述中提到的三种直线算法(DDA算法、Bresenham算法)以及一种圆算法(中点圆算法)。 1. DDA(Digital ...
在计算机图形学中,基本图形的生成是构建复杂场景的基础,对于初学者来说,理解和掌握这些基本图形的生成算法至关重要。这篇文档"计算机图形学基本图形的生成"将深入探讨这一主题。 首先,我们要理解什么是基本图形...
这是计算机图形学的基础,涉及点、线、圆、矩形等基本元素的创建。在VC6.0环境下,我们可以利用GDI(Graphics Device Interface)库来实现这些功能。例如,通过设置坐标和颜色,可以绘制直线、曲线和填充区域。此外...
计算机图形学的主要研究内容包括图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。...
计算机图形学是信息技术领域的一个重要分支,它涉及图像的生成、处理和显示,以及与之相关的算法和技术。在这个“计算机图形学案例源码-孔令德”资源中,初学者可以深入理解计算机图形学的基本概念和算法,进一步...
在计算机图形学中,线、圆和椭圆是最基本的几何元素,它们被广泛应用于各种场景,如图像处理、游戏开发、CAD设计等。本文将深入探讨这三种图形的绘制算法,以及如何实现缩放、交互式绘图、播放音乐/视频和背景设置等...
计算机图形学演示程序是基于MFC(Microsoft Foundation Classes)框架和VC6.0(Visual C++ 6.0)开发的一个项目,旨在展示和实践计算机图形学的基本原理和算法。这个程序将理论与实践相结合,为学习者提供了一个直观...
1. **基本概念**:计算机图形学首先涉及的是像素、向量、矩阵等基本元素。像素是图像的基本单位,而向量和矩阵则在图形变换中起到关键作用,如平移、旋转、缩放等操作。 2. **坐标系统**:了解和转换不同的坐标系统...
《计算机图形学原理及算法教程》(Visual C++版)和青芳清华大学出版社出版 3.2.2 输入模式 3.3 交互式绘图技术 3.4 交互技术程序设计案例 3.5 课后练习 第 4 章简单 CAD 绘图系统开发实例 4.1 计算机图形学绘图基础...
计算机图形学基本图元生成系统设计与实现 计算机图形学是一门重要的计算机科学领域,涉及计算机图形学、计算机视觉、人机交互等多个方面。随着计算机技术的快速发展,计算机图形学的应用范围也在不断扩展,涵盖了...
这个基本程序集合针对初学者,旨在提供一个了解和实践计算机图形学基础的平台。通过学习这些程序,你可以掌握计算机图形学的核心概念和编程技术。 1. **图形学基础** 计算机图形学的基本概念包括像素、向量、坐标...
对于学习者来说,理解并实现这些基本图元生成算法,有助于深入掌握计算机图形学原理,并为进一步学习高级图形技术打下坚实基础。 总结而言,"计算机图形学基本图元生成程序"是一个涵盖了点、线、多边形等基本图形...
总的来说,计算机图形学中的直线和圆生成算法是通过对点、像素和数学关系的理解来实现的。在实际应用中,我们需要根据不同的情况选择合适的算法,以达到理想的视觉效果。随着硬件性能的提升和新的图形处理技术的发展...
在计算机图形学中,直线和圆是最基本的图形元素,本文将介绍三种直线生成算法和圆的生成算法。 一、DDA 直线生成算法 DDA 直线生成算法是一种简单的直线生成算法。该算法的基本思想是通过计算直线的斜率和截距来...
计算机图形学涉及点、线、面等基本元素的生成,以及色彩、光照、纹理等视觉效果的模拟。在二维(2D)图形中,我们通常从简单的线条和形状开始,如直线、曲线、圆、椭圆等。而在三维(3D)图形中,我们将处理更复杂的...
计算机图形学是计算机科学的一门学科,主要研究如何使用计算机生成图形、图像和动画。该领域的研究对象包括图形基本元素、图形变换、视觉效果、图形交互和图形应用等。 以下是计算机图形学的知识点总结: 1. ...