计算机图形学 第3章 圆的扫描转换-第三章结束

news2024/11/16 5:30:22

书用的是

书名:计算机图形学基础教程(VisualC++版)(第二版)

定价:44.5元

作者:孔令德

出版社:清华大学出版社

出版日期:2013-03-01

ISBN:9787302297529

目录

  • 习题3(续)
    • 知识点
      • 第3章 圆的扫描转换
      • 八分法画圆算法
      • 中点误差项的递推公式
      • 椭圆的扫描转换
    • 椭圆中点Bresenham算法
    • 四分法画椭圆子函数
  • Wu反走样算法
    • 算法原理
      • 代码
    • 彩色直线段的反走样

习题3(续)

知识点

第3章 圆的扫描转换

仅包含加减运算的顺时针绘制1/8圆的中点Bresenham算法原理,根据对称性可以绘制整圆 。

提出问题:

  • 默认的圆是圆心位于坐标系原点,半径为R的圆。
    屏幕设备坐标系的原点位于左上角,绘制结果为1/4圆,需要进行圆心平移或使用自定义坐标系可以绘制整圆。
  • 圆是椭圆的特例,使用椭圆中点Bresenham算法也可绘制。

在这里插入图片描述
在这里插入图片描述

圆将平面划分成三个区域:对于圆上的点,F(x,y)=0;对于圆外的点,F(x,y)>0;对于圆内的点,F(x,y)<0。

根据圆的对称性,可以用四条对称轴x=0,y=0,x=y,x=-y将圆分成8等份。
在这里插入图片描述

八分法画圆算法

只要绘制出第一象限内的1/8圆弧,根据对称性就可绘制出整圆。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
构造中点误差项
在这里插入图片描述
在这里插入图片描述
对应了上面三种弧的情况。

中点误差项的递推公式

分两种情况讨论
在这里插入图片描述
在这里插入图片描述
中点误差项的初始值
在这里插入图片描述
代码:

//圆中点Bresenham算法
void CTestView::MBCircle(double R,CDC *pDC )
{
	double x,y,d;	 
	d=1.25-R;x=0;y=R;
	for(x=0;x<=y;x++)
	{
		CirclePoint(x,y,pDC);//调用八分法画圆子函数
        if (d<0)
			d+=2*x+3;
        else
		{
			d+=2*(x-y)+5;
			y--;
		} 
     }
}

void CTestView::CirclePoint(double x, double y,CDC *pDC)//八分法画圆子函数
{
	 //圆心坐标
            CP2 pc=CP2((p0.x+p1.x)/2.0,(p0.y+p1.y)/2.0);        
	 //定义圆的边界颜色 
            COLORREF  clr=RGB(0,0,255);                         
	pDC->SetPixelV(Round(x+pc.x),Round(y+pc.y),clr); //x,y
	pDC->SetPixelV(Round(y+pc.x),Round(x+pc.y),clr); //y,x
	pDC->SetPixelV(Round(y+pc.x),Round(-x+pc.y),clr);//y,-x
	pDC->SetPixelV(Round(x+pc.x),Round(-y+pc.y),clr);//x,-y
	pDC->SetPixelV(Round(-x+pc.x),Round(-y+pc.y),clr);//-x,-y
	pDC->SetPixelV(Round(-y+pc.x),Round(-x+pc.y),clr);//-y,-x
	pDC->SetPixelV(Round(-y+pc.x),Round(x+pc.y),clr);//-y,x
	pDC->SetPixelV(Round(-x+pc.x),Round(y+pc.y),clr);//-x,y
}

CP2的定义在课本P95页。

椭圆的扫描转换

顺时针绘制1/4椭圆的中点Bresenham算法原理,根据对称性可以绘制完整椭圆。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在部分Ⅰ椭圆的中点Bresenham的原理:每次在主位移x方向上走一步,y方向上退不退步取决于中点误差项的值。在部分Ⅱ:每次在主位移方向y上退一步,x方向上走不走步取决于中点误差项的值。
在这里插入图片描述

构造上半部分Ⅰ的中点误差项

在这里插入图片描述
在这里插入图片描述

上半部分Ⅰ中点误差项的递推公式
分两种情况:
在这里插入图片描述
在这里插入图片描述

构造下半部分Ⅱ的中点误差项
在这里插入图片描述

在这里插入图片描述
下半部分Ⅱ的递推公式
现在如果考虑主位移方向再走一步,应该选择哪个中点代入中点误差项以决定应该选取的像素。分两种情况讨论。

在这里插入图片描述
中点误差项的初始值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

椭圆中点Bresenham算法

void CTestView::MBEllipse(CDC *pDC)//椭圆中点Bresenham算法
{
	double x,y,d1,d2,a,b;
	a=fabs(p1.x-p0.x)/2;
	b=fabs(p1.y-p0.y)/2;
	x=0;y=b;
	d1=b*b+a*a*(-b+0.25);
	EllipsePoint(x,y,pDC);
	while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段
	{
		if (d1<0)
		{
			d1+=b*b*(2*x+3);
		}
		else
		{
			d1+=b*b*(2*x+3)+a*a*(-2*y+2);
			y--;
		}
		x++;
		EllipsePoint(x,y,pDC);
	}
//椭圆CB弧段
	d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
	while(y>0)
	{
		if (d2<0)
		{
			d2+=b*b*(2*x+2)+a*a*(-2*y+3);
			x++;
		}
		else
		{
			d2+=a*a*(-2*y+3);
		}
		y--;
		EllipsePoint(x,y,pDC);
	}
}

四分法画椭圆子函数

void CTestView::EllipsePoint(double x, double y,CDC *pDC)//四分法画椭圆子函数
{
	//椭圆中心坐标
           CP2 pc=CP2((p0.x+p1.x)/2.0,(p0.y+p1.y)/2.0); 	
           //定义椭圆的颜色
           COLORREF  clr=RGB(0,0,255); 
	pDC->SetPixelV(Round(x+pc.x),Round(y+pc.y),clr);
	pDC->SetPixelV(Round(-x+pc.x),Round(y+pc.y),clr);
	pDC->SetPixelV(Round(x+pc.x),Round(-y+pc.y),clr);
	pDC->SetPixelV(Round(-x+pc.x),Round(-y+pc.y),clr);
	pDC->MoveTo(Round(p0.x),Round(p0.y));
}

Wu反走样算法

算法原理

在这里插入图片描述
Wu反走样算法是采用空间混色原理来对走样进行修正。

空间混色原理指出,人眼对某一区域颜色的识别是取这个区域颜色的平均值。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

void CTestView::ALine(CDC *pDC)
{
	CPoint p0(-100,-50),p1(200,50),p;
	int dx,dy;
	dx=p1.x-p0.x;
	dy=p1.y-p0.y;
	double k=(double)dy/dx,e;
           for(p=p0,e=0;p.x<p1.x;p.x++)//不包括终点p1
	{
		pDC->SetPixelV(p.x, p.y,RGB(e*255,e*255,e*255));
                       pDC->SetPixelV(p.x, p.y+1,RGB((1-e)*255,
                                              (1-e)*255,(1-e)*255));	           
                       e+=k;
                       if(e>=1.0)
		{
	                    p.y++;
	                    e--;
		}				     
             }
}

彩色直线段的反走样

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】8.3 交换排序

文章目录1. 冒泡排序冒泡排序算法冒泡排序算法分析2. 快速排序快速排序算法快速排序算法分析基本思想 每两个元素之间互相比较&#xff0c;如果发现大小关系相反&#xff0c;则将他们交换过来&#xff0c;直到所有记录都排好序为止。假设希望是从小到大来排序&#xff0c;结果…

Nginx-反向代理配置学习总结

Nginx-反向代理配置学习总结 正向代理&#xff1a;指的是通过代理服务器 代理浏览器/客户端去重定向请求访问到目标服务器 的一种代理服务&#xff0c;正向代理服务的特点是代理服务器 代理的对象是浏览器/客户端&#xff0c;也就是对于目标服务器 来说浏览器/客户端是隐藏的。…

文件的IO

一、文件的定义狭隘的文件:指你的硬盘上的文件和目录.广义的文件:泛指计算机中的硬件资源,操作系统中,把很多硬件设备和软件资源都抽象成了文件,按照文件的形式统一管理.比如网卡,操作系统也是把网卡抽象成了文件资源,所以说操作网卡其实和操作文件的方式是基本一样的.而我们本…

初识流计算框架Spark

Spark简介 Spark最初由美国加州伯克利大学&#xff08;UCBerkeley&#xff09;的AMP&#xff08;Algorithms, Machines and People&#xff09;实验室于2009年开发&#xff0c;是基于内存计算的大数据并行计算框架&#xff0c;可用于构建大型的、低延迟的数据分析应用程序。Sp…

一刷代码随想录——链表

1.理论基础链表节点的定义&#xff1a;struct ListNode {int val;ListNode* next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode* next) : val(x), next(next) {} };根据卡哥提示&#xff0c;由于力扣中已经给出如…

C++中拷贝构造函数、拷贝赋值运算符、析构函数、移动构造函数、移动赋值运算符(三/五法则)

1、介绍 三五法则是针对C中类的成员和类对象的操作函数。 三法则是指&#xff1a;拷贝构造函数、拷贝赋值运算符、析构函数。 五法则是在三法则的基础上增加了&#xff1a;移动构造函数、移动赋值运算符。 2、拷贝构造函数 定义&#xff1a;如果构造函数的第一个参数是自身…

Postman前置脚本

位置&#xff1a;作用&#xff1a;调用脚本之前需要执行的代码片段一、产生随机数字生成0-1之间的随机数&#xff0c;包括0&#xff0c;不包括1&#xff1b;var random Math.random();console.log("随机数",random);获取最小值到最大值之前的整数随机数function Get…

2019-ICML-Graph U-Nets

2019-ICML-Graph U-Nets Paper: https://arxiv.org/abs/1905.05178 Code: https://github.com/HongyangGao/Graph-U-Nets 图U-Nets 作者将CNN上的U-Net运用到了图分类上&#xff0c;因为我们主题是图分类&#xff0c;就不对U-Net进行论述了&#xff0c;只对其中的gPool&#…

eureka 读写锁的一点思考

读写锁 读写锁一般实现 读读不互斥 读写互斥 写写互斥 读写锁的好处是&#xff0c;面对读多写多的场景会拥有比较好的表现 一般我们会在读操作加上读锁&#xff0c;写操作加上写锁。但是最近我发现eureka 在使用读写锁的时候是相反的&#xff0c; 也就是说在读操作加上了读锁&…

2023最值得入手的运动耳机是哪款、口碑最好的运动蓝牙耳机推荐

不知道有没有和我一样的小伙伴&#xff0c;在运动时特别喜欢听音乐&#xff0c;每次听到一首合适的音乐&#xff0c;感觉运动起来都更有激情和活力了。所以这时候就需要挑选一款舒适的耳机了。别看市面上各种各样的运动耳机很多&#xff0c;但实际上能真正适合运动的少之又少&a…

oss服务端签名后直传分析与代码实现

文章目录1.简介1.1 普通上传方式1.2 服务端签名后直传3.服务端签名后直传文档3.1 用户向应用服务器请求上传Policy和回调。3.2 应用服务器返回上传Policy和签名给用户。3.3 用户使用Post方法向OSS发送文件上传请求。4.实战开发-后端4.1 pom.xml核心配置4.2 application.yml核心…

Java两大工具库:Commons和Guava(2)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客。值此新春佳节&#xff0c;我给您拜年啦&#xff5e;祝您在新的一年中所求皆所愿&#xff0c;所行皆坦途&#xff0c;展宏“兔”&#xff0c;有钱“兔”&#xff0c;多喜乐&#xff0c;常安宁&#xff01;开发中有一类应…

如何在es中查询null值

文章目录1、背景2、需求3、准备数据3.1 创建mapping3.2 插入数据4、查询 name字段为null的数据5、查询address不存在或值直接为null的数据6、参考链接1、背景 在我们向es中写入数据时&#xff0c;有些时候数据写入到es中的是null&#xff0c;或者没有写入这个字段&#xff0c;…

离散数学与组合数学-08谓词逻辑

文章目录离散数学与组合数学-08谓词逻辑8.1 谓词的引入8.1.1 引入谓词逻辑8.1.2 个体词与谓词8.2 量词的引入8.2.1 量词引入8.2.2 个体域符号化8.2.3 量词真值确定8.3 谓词符号化举例8.3.1 示例一8.3.2 示例二8.3.3 示例三8.3.4 示例四8.4 谓词合式公式8.4.1 四类符号8.4.2 项8…

MySQL运维(一)MySQL中的日志、Mysql主从复制

MySQL运维(一)MySQL中的日志、Mysql主从复制 1、MySQL日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#…

Elasticsearch 需要了解的都在这

ES选主过程&#xff1f;其实ES的选主过程其实没有很高深的算法加持&#xff0c;启动过程中对接点的ID进行排序&#xff0c;取ID最大节点作为Master节点&#xff0c;那么如果选出来的主节点中存储的元信息不是最新的怎么办&#xff1f;其实他是分了2个步骤做这件事&#xff0c;先…

react 项目 中使用 Dllplugin 打包优化技巧

目录 0.React和DLLPlugin 前言 使用步骤 结果截图 主要说明 0.React和DLLPlugin React 是一个用于构建用户界面的 JavaScript 库。它由 Facebook 开发&#xff0c;现在由 Facebook 和一个由个人开发者和公司组成的社区维护。React 允许开发人员构建可重用的 UI 组件并有…

“回文子串、最长回文子序列”总结,动态规划再显神通(Java实现)

目录 一、回文子串 1.1、dp定义 1.2、递推公式 1.3、初始化 1.4、遍历顺序 1.5、解题代码 二、最长回文子序列 2.1、dp定义 2.2、递推公式 2.3、初始化 2.4、遍历顺序 2.5、解题代码 一、回文子串 题目描述&#xff1a; 题目来源&#xff1a;647. 回文子串 1.1、dp定…

解决使用copy.deepcopy()拷贝Tensor或model时报错只支持用户显式创建的Tensor问题

模型训练过程中常需边训练边做validation或在训练完的模型需要做测试&#xff0c;通常的做法当然是先创建model实例然后掉用load_state_dict()装载训练出来的权重到model里再调用model.eval()把模型转为测试模式&#xff0c;这样写对于训练完专门做测试时当然是比较合适的&…

ssm学生心理健康测评网的规划与设计

摘 要 1 Abstract 1 1 绪论 1 1.1 课题背景 1 1.2 课题研究现状 1 1.3 初步设计方法与实施方案 2 1.4 本文研究内容 2 2 系统开发环境 4 2.1 JSP技术介绍 4 2.2 B/S模式 4 2.3 MySQL环境配置 5 3 系统分析 6 3.1 系统可行性分析 6 3.1.…