计算机图形学 圆的扫描转换(2)

作者:卿笃军

原文地址:http://blog.csdn.net/qingdujun/article/details/40042591

本文通过一个完整的实例,演示圆的扫描转换。

1)创建CP2类

头文件:p2.h

// P2.h: interface for the CP2 class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_P2_H__709052D1_45DA_4DF0_B5F2_15AC2B45687A__INCLUDED_)
#define AFX_P2_H__709052D1_45DA_4DF0_B5F2_15AC2B45687A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//二维点类
class CP2
{
public:
	CP2();
	CP2(double x,double y);
	virtual ~CP2();
public:         //方便访问,直接定义为共有
	double x;
	double y;
};

#endif // !defined(AFX_P2_H__709052D1_45DA_4DF0_B5F2_15AC2B45687A__INCLUDED_)

实现文件:CP2.cpp

// P2.cpp: implementation of the CP2 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DrawCircle.h"
#include "P2.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CP2::CP2()
{

}

CP2::~CP2()
{

}

2)创建CCircle类

头文件Circle.h

// Circle.h: interface for the CCircle class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CIRCLE_H__AFAF8AB9_D976_4D82_8750_DB3E7F64F45C__INCLUDED_)
#define AFX_CIRCLE_H__AFAF8AB9_D976_4D82_8750_DB3E7F64F45C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "P2.h"

class CCircle
{
public:
	CCircle();
	virtual ~CCircle();
	void OneEight(double R,CDC *pDC);               //绘制1/8圆
	void SymmetryFill(double x, double y,CDC *pDC); //绘制,同时根据对称性填充其他的7/8
private:
	CP2 Center;   //圆心
};

#endif // !defined(AFX_CIRCLE_H__AFAF8AB9_D976_4D82_8750_DB3E7F64F45C__INCLUDED_)

实现文件:Circle.cpp

// Circle.cpp: implementation of the CCircle class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DrawCircle.h"
#include "Circle.h"

#include <math.h>
#define Round(d) int(floor(d+0.5))//四舍五入宏定义

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCircle::CCircle()
{
	//初始化圆心坐标
	Center.x = 200;
	Center.y = 200;
}

CCircle::~CCircle()
{

}
void CCircle::OneEight(double R,CDC *pDC)     //绘制1/8圆
{
	double x,y,d,xMax;
	d=1.25-R;       //第一个中点是(1,R-0.5),代入隐函数得d(R为半径)
	x=0; y=R;       //从像素点(0,R)开始填充(圆最上方顶点处)
	xMax = R*cos(3.14/4); // x属于(0 ,R*(sqrt(2)/2) )范围,即cos(45°)
	for(x=0;x<=xMax;x++)  //(主方向为x)
	{
		SymmetryFill(x,y,pDC);//绘制,同时根据对称性填充其他的7/8
		if (d<0)
			d=d+2*x+3;    //当d(i)<0时,递推公式d(i+1)=d(i)+2x(i)+3
		else
		{
			d=d+2*(x-y)+5;//递推公式d(i+1)=d(i)+2[x(i)-y(i)]+5
			y--;
		}
	}
}

void CCircle::SymmetryFill(double x, double y,CDC *pDC) //绘制,同时根据对称性填充其他的7/8
{
	//定义圆的边界颜色
	COLORREF  clr=RGB(255,0,0);
	//绘制,填充该点
	pDC->SetPixelV(Round(x+Center.x),Round(y+Center.y),clr);  //x,y
	//同时根据对称性填充其他的7/8像素点
	pDC->SetPixelV(Round(y+Center.x),Round(x+Center.y),clr);  //y,x
	pDC->SetPixelV(Round(y+Center.x),Round(-x+Center.y),clr); //y,-x
	pDC->SetPixelV(Round(x+Center.x),Round(-y+Center.y),clr); //x,-y
	pDC->SetPixelV(Round(-x+Center.x),Round(-y+Center.y),clr);//-x,-y
	pDC->SetPixelV(Round(-y+Center.x),Round(-x+Center.y),clr);//-y,-x
	pDC->SetPixelV(Round(-y+Center.x),Round(x+Center.y),clr); //-y,x
	pDC->SetPixelV(Round(-x+Center.x),Round(y+Center.y),clr); //-x,y
}

3)OnDraw函数

void CDrawCircleView::OnDraw(CDC* pDC)
{
	CDrawCircleDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CCircle *pCircle = new CCircle;
	pCircle->OneEight(100,pDC);
}

4)运行效果

原文地址:http://blog.csdn.net/qingdujun/article/details/40042591

参考文献:计算机图形学基础教程(Visual C++版)(第2版) 孔令德 编著

时间: 2024-10-13 20:41:47

计算机图形学 圆的扫描转换(2)的相关文章

计算机图形学 椭圆的扫描转换(3)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40045907 本文通过一个完整的实例,演示椭圆的扫描转换. 1)创建CEllipse类 头文件:Ellipse.h // Ellipse.h: interface for the CEllipse class. // ////////////////////////////////////////////////////////////////////// #if !defi

计算机图形学——多边形的扫描转换

一.多边形扫描转换 在光栅图形中,区域是由[相连的]像素组成的集合,这些像素具有[相同的]属性值或者它们位于某边界线的内部 1.光栅图形的一个基本问题是把多边形的顶点表示转换为点阵表示.这种转换成为多边形的扫描转换.2.多边形的扫描转换与区域填充问题是怎样在离散的像素集上表示一个连续的二维图形.3.多边形有两种重要的表示方法: (1)顶点表示:用多边形的定点序列来表示多边形    优点:直观.几何意义强.占内存少.易于进行几何变换    缺点:没有明确指出那些象素在多边形内,故不能直接用于上色(

计算机图形学 - 圆的中点生成算法验证

算法描述: 圆的中点生成算法 如果我们构造函数 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为下一像素,而且下一像

图形学_圆的扫描转换

1.中点画圆算法 (1)P为当前点亮象素,那么,下一个点亮的象素可能是P1(Xp+1,Yp) 或P2(Xp +1,Yp +1). (2)构造函数:F(X,Y)=X2  +  Y2 -  R2 :则 F(X,Y)=  0  (X,Y)在圆上: F(X,Y)< 0   (X,Y)在圆内: F(X,Y)> 0   (X,Y)在圆外. 设M为P1.P2间的中点,M=(Xp+1,Yp-0.5) 有如下结论: F(M)< 0  ->M在圆内->  取P1 F(M)>= 0 ->

计算机图形学之光栅图形学——多边形的扫描转换之 X-扫描算法及改进

本文是对 赵明老师 <计算机图形学>MOOC课程 部分章节的小总结. 多边形有两种表示方法:顶点表示和点阵表示. X-扫描线算法: 算法步骤概括如下: 注意: 改进: 为了避免求交运算,引进一套特殊的数据结构:

计算机图形学 复习笔记

计算机图形学 复习笔记 (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42779341) 第一章 计算机图形学综述 研究内容 图形的概念:计算机图形学的研究对象 能在人的视觉系统中产生视觉印象的客观对象 包括自然景物.拍摄到的图片.用数学方法描述的图形等等 图形的要素 几何要素:刻画对象的轮廓.形状等 非几何要素:刻画对象的颜色.材质等 图形表示法 点阵表示 枚举出图形中所有的点,简称为图像. 参数表示 由图形的

【转载】计算机图形学框架

原文: 计算机图形学框架 应用 基本图形生成算法 图元光栅化标准 直线要直 图元终点要准 图元生成的亮度.色泽粗细要均匀 快速计算 直线光栅化算法 逐点比较法 数值微分法 中点Bresenham算法 圆的光栅化算法 简单方程产生圆弧 Bresenham算法产生圆弧 多边形填充 扫描线填充 宽图元 复制像素画宽图元 移动画笔画宽图元 3D数学基础 坐标系 向量 矩阵 空间集合运算 集合形体的表达 几何体之间的关系 图形变换 二维及三维图形几何变换 二维图形几何变换 平移变换 比例变换 旋转变换 错

[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)

一.首先说明: 这是啥? —— 这是利用C#FORM写的一个用来演示计算机图形学中 ①Bresenham直线扫描算法(即:连点成线):②种子填充法(即:填充多边形):③扫描线填充法 有啥用? ——  无论是连点成线还是区域填充在高级编程中基本上都提供很高效的库函数来调用.这里拿出这些算法一方面有利于大家理解那些封装的函数底层是实现:另一方面是方便嵌入式TFT屏幕底层驱动开发时借鉴的. 是啥样? ——  如下面的操作,不言而喻. 二.进入正题: 2-1.直线的扫描转换 图形的扫描转换实质就是在光栅

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------