计算机图形学-算法总结

news2024/11/26 4:52:54

文章目录

  • 计算机图形学-算法总结
    • 一、直线转换
      • 1、DDA算法
      • 2、中点法
      • 3、Bresenhan算法
    • 二、圆
      • 1、中点Bresenham画圆算法
      • 2、椭圆的中点Bresenham算法

计算机图形学-算法总结

一、直线转换

1、DDA算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FCiPCOl-1669624453862)(D:\Photo\typora-user-images\image-20221127104323055.png)]

Δ y = y n − y 0 Δ x = x n − x 0 ε = 1 m a x ( ∣ Δ x ∣ , ∣ Δ y ∣ ) \Delta y=y_n-y_0 \\ \Delta x=x_n-x_0\\ \varepsilon=\frac{1}{max(|\Delta x|,|\Delta y|)} Δy=yny0Δx=xnx0ε=max(Δx,Δy)1
把区间分成 M a x ( ∣ Δ x ∣ , ∣ Δ y ∣ ) Max(|\Delta x|,|\Delta y|) Max(Δx,Δy)个,需要循环这么多次。

每次算出的x,y都需要+0.5,进行向下取整运算。(因为在显示屏上,都是整数,没有小数)。

int x0,y0,xn,yn;
cin>>x0>>y0>>xn>>yn;

double k,x=x0,y=y0;
int dx=xn-x0;
int dy=yn-y0;
k=max(dx,dy);

for(int i=0;i<k;i++){
cout<<x<<" "<<y<<" ";
    x+=(dx/k);
    y+=(dy/k);
 //进行取整运算
    x=int(x+0.5);
    y=int(y+0.5);
}


2、中点法

假设,最大位移方向为x方向,直线方程如下图所示。

在这里插入图片描述

假设,红色点是我们现在位置,那么我们下一步,只能是走到蓝色点或者紫色点。紫色点 ( x + 1 , y ) (x+1,y) (x+1,y),蓝色点 ( x + 1 , y + 1 ) (x+1,y+1) (x+1,y+1)。把紫色与蓝色中间的坐标 ( x + 1 , y + 0.5 ) (x+1,y+0.5) (x+1,y+0.5)带入,再得解ym,判断ym的大小,ym>=0,下一个点为紫色点,否则为蓝色点。就这样算下去,直到结束。
y m > = 0 时 , y m i + 1 = y m i + 1 − k y m < 0 时 , y m i + 1 = y m i − k y m 0 = 0.5 − k 用 2 Δ x y m i 替 换 y m i y m > = 0 , y m = y m + 2 Δ x − 2 Δ y y m < 0 , y m = y m − 2 Δ y ym>=0时,ym_{i+1}=ym_i+1-k\\ ym<0时,ym_{i+1}=ym_i-k\\ ym_0=0.5-k\\ 用2\Delta x ym_i 替换ym_i\\ ym>=0, ym=ym+2\Delta x-2\Delta y\\ ym<0,ym=ym-2\Delta y ym>=0ymi+1=ymi+1kym<0ymi+1=ymikym0=0.5k2Δxymiymiym>=0,ym=ym+2Δx2Δyym<0,ym=ym2Δy

int dx,dy,d,up,dow,x,y;
if(x0>xn){ //说明是第三象限
    //交换一下x0与xn即可,
    x=xn;
    xn=x0;
    x0=xn;
    
    y=yn;
    yn=y0;
    y0=y;  
}
dx=xn-x0;
dy=yn-y0;
x=x0;
y=y0;

d=dx-2*dy;
up=2*dx-2*dy;
dow=-2*dy;

//进行打印点
while(x<=xn){
    cout<<x<<y<<" ";
    ++x;
    if(d<0){  //说明是蓝色点
        ++y;
        d+=up;
    }else{  //说明是紫色点
        d+=dow;
    }
}

3、Bresenhan算法

这个算法是对中点法的优化。令e= y m i − 0.5 ym_i-0.5 ymi0.5,如果 e > 0 e>0 e>0说明下一个坐标是 ( x + 1 , y + 1 ) (x+1,y+1) (x+1,y+1)否则就是 ( x + 1 , y ) (x+1,y) (x+1,y)。为了除去小数(0.5),用2e Δ x \Delta x Δx来替换e。
e i + 1 = { e i + 2 Δ y − 2 Δ x e i > 0 e i + 2 Δ y e i ≤ 0 e 的 初 始 值 为 − Δ x e_{i+1}=\begin{cases} e_i +2\Delta y -2\Delta x & e_i>0\\ e_i + 2\Delta y& e_i\leq 0 \end{cases}\\ e的初始值为-\Delta x ei+1={ei+2Δy2Δxei+2Δyei>0ei0eΔx

int x,y,dx,dy,e;
dx=xn-x0;
dy=yn-y0;
e=-dx;
x=x0;y=y0;
while(x<=xn){
    cout<<x<<" "<<y<<" ";
    x++;
    e+=2*dy;
    if(e>0){
        y++;
        e-=2*dx;
    }
}

二、圆

1、中点Bresenham画圆算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F34ubybT-1669624453863)(D:\Photo\typora-user-images\image-20221128134831896.png)]

对于圆心不在原点的圆,可以通过平移,让它圆心变成原点。

由图可知,圆有4条对称轴,把圆分成了完全相同的8个圆,我们只需要画出1/8,就能画出完整的圆。

假设圆的方程
x 2 + y 2 = R 2 x^2+y^2=R^2\\ x2+y2=R2
构造函数 F ( x , y ) = x 2 + y 2 − R 2 F(x,y)=x^2+y^2-R^2 F(x,y)=x2+y2R2,

  1. 对于圆上的点 F ( x , y ) = 0 F(x,y)=0 F(x,y)=0
  2. 圆外的点 F ( x , y ) > 0 F(x,y)>0 F(x,y)>0
  3. 圆内的点 F ( x , y ) < 0 F(x,y)<0 F(x,y)<0

在这里插入图片描述

对于下一个点,在 ( x + 1 , y ) , ( x + 1 , y − 1 ) (x+1,y),(x+1,y-1) (x+1y),(x+1,y1)里面选一个,通过中点 ( x + 1 , y + 0.5 ) (x+1,y+0.5) (x+1,y+0.5)的符合判断选择哪一个。
d i = F ( x + 1 , y + 0.5 ) > 0 , 选 择 ( x + 1 , y − 1 ) ; d i = F ( x + 1 , y + 0.5 ) ≤ 0 , 选 择 ( x + 1 , y ) ; d_i=F(x+1,y+0.5)>0,选择(x+1,y-1);\\ d_i=F(x+1,y+0.5)\leq0,选择(x+1,y);\\ di=F(x+1,y+0.5)>0,(x+1,y1);di=F(x+1,y+0.5)0,(x+1,y);

d i + 1 = { d i + 2 x i + 3 , d < 0 d i + 2 ( x i − y i ) + 5 , d ≥ 0 d 初 始 值 为 1 − R d_{i+1}= \begin{cases} d_i+2x_i+3,&d<0\\ d_i+2(x_i-y_i)+5, &d \geq 0\\ \end{cases}\\ d初始值为1-R di+1={di+2xi+3,di+2(xiyi)+5,d<0d0d1R

int x,y,d;
x=0;
y=r;
d=1-r;
while(x<=r){
    cout<<x<<y<<" ";
    if(d<0){
        d+=2*x+3;
    }else{
        --y;
        d+=2(x-y)+5;
    }
    ++x;
}

2、椭圆的中点Bresenham算法

椭圆方程
F ( x , y ) = b 2 x 2 + a 2 y 2 − a 2 b 2 = 0 F(x,y)=b^2x^2+a^2y^2-a^2b^2=0 F(x,y)=b2x2+a2y2a2b2=0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLyPx7Qm-1669624453865)(D:\Photo\typora-user-images\image-20221128154320607.png)]

由图可知,椭圆关于y=0,x=0对称,把椭圆分成了4个完全相等的部分。我们只需要画出1/4个即可,再利用对称性,就可画出全部。

把第一象限的椭圆分成2部分,如绿色和翠绿色,绿色最大位移方向为x方向,翠绿色最大位移方向为y方向。采用中点来判断下一个点在哪。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLca1SxD-1669624453866)(D:\Photo\typora-user-images\image-20221128154707760.png)]

上部分(绿色),下一个点是 ( x + 1 , y ) 或 者 ( x + 1 , y − 1 ) (x+1,y)或者(x+1,y-1) (x+1,y)(x+1,y1).

下部分(翠绿色),下一个点是 ( x , y − 1 ) 或 者 ( x + 1 , y − 1 ) (x,y-1)或者(x+1,y-1) (x,y1)(x+1,y1)
构 造 判 别 式 d i = F ( x + 1 , y + 0.5 ) 构造判别式 d_i=F(x+1,y+0.5) di=F(x+1,y+0.5)
上部分

d i + 1 = { d i + b 2 ( 2 x i + 3 ) , d < 0 d i + b 2 ( 2 x i + 3 ) + a 2 ( − 2 y i + 2 ) , d ≥ 0 d_{i+1}= \begin{cases} d_i+b^2(2x_i+3),&d<0\\ d_i+b^2(2x_i+3)+a^2(-2y_i+2), &d \geq 0 \end{cases}\\ di+1={di+b2(2xi+3),di+b2(2xi+3)+a2(2yi+2),d<0d0
d 初 始 值 为 b 2 + a 2 ( − b + 0.25 ) d初始值为b^2+a^2(-b+0.25) db2+a2(b+0.25)
下部分
d i + 1 = { d i + b 2 ( 2 x i + 2 ) + a 2 ( − 2 y i + 3 ) , d < 0 d i + a 2 ( − 2 y i + 3 ) , d ≥ 0 d_{i+1}= \begin{cases} d_i+b^2(2x_i+2)+a^2(-2y_i+3),&d<0 \\ d_i+a^2(-2y_i+3), &d \geq 0\\ \end{cases} di+1={di+b2(2xi+2)+a2(2yi+3),di+a2(2yi+3),d<0d0
d 初 始 值 为 b 2 ( x + 0.5 ) 2 + a 2 ( y − 1 ) 2 − a 2 b 2 d初始值为b^2 (x+0.5 )^2+a ^2 (y-1) ^2 - a ^2 b^2 db2(x+0.5)2+a2(y1)2a2b2

int x,y;
double d1,d2;
x=0;
y=b;
d1=b*b+a*a*(-b+0.25);
cout<<x<<y<<" ";
cout<<-x<<-y<<" ";
cout<<-x<<y<<" ";
cout<<x<<-y<<" ";

//上半部分
while(b*b*(x+1)<a*a*(y-0.5)){
    if(d1<=0){
        d1+=b*b*(2*x+3);
        ++x;
    }else{
        d1+=b*b*(2*x+3)+a*a*(-2*y+2);
        ++x;
        --y;
    }
cout<<x<<y<<" ";
cout<<-x<<-y<<" ";
cout<<-x<<y<<" ";
cout<<x<<-y<<" ";  
}

//下半部
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);
        ++y;
        --y;
    }else{
        d2+=a*a*(-2*y+3);
        --y;
    }
cout<<x<<y<<" ";
cout<<-x<<-y<<" ";
cout<<-x<<y<<" ";
cout<<x<<-y<<" ";    
}


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

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

相关文章

小杨哥陷入打假风波,会变成下一个辛巴吗?

最近&#xff0c;网红疯狂小杨哥频繁登上热搜。最初的起因是他花了1亿元在合肥一家高科技公司购买了5万多平方米的房产&#xff0c;作为他名下公司的全球总部&#xff0c;由此带来了争议。 据了解&#xff0c;该物业总建筑面积为53874.33平方米&#xff0c;包括1个生产综合体、…

一步一步带你深入源码看Spring是如何加载XML配置文件的

Spring 的在实际开发过程中都是以XML 配置文件注解的形式进行使用,那么XML配置文件的读取是Spring中重要的功能, 在Spring中,加载XML配置文件的语句如下: 使用ClassPathXmlApplicationContext类的构造函数加载XML配置文件,代码如下: ClassPathXmlApplicationContext()方法调…

蓝桥杯控制PCF8591

目录 一、AD转换 &#xff08;1&#xff09;PCF8591初始化 &#xff08;2&#xff09;获取PCF8591ADC转换结果 &#xff08;3&#xff09;实例程序​编辑 二、DA转换 &#xff08;1&#xff09;PCF8591初始化 &#xff08;2&#xff09;写入数模转换的值 &#xff08;3&am…

一个快速切换浏览器搜索引擎的小技巧(在地址栏搜索B站、书签等的方法)

一、背景 Chrome谷歌浏览器的地址栏是可以搜索的&#xff0c;我们怎么能临时切换到别的搜索引擎呢&#xff1f;&#xff08;注意不是改地址栏默认的搜索引擎&#xff09; 改搜索引擎&#xff1a;谷歌浏览器默认谷歌搜索引擎&#xff0c;很多人估计都会改成百度。我虽然能用谷歌…

四、nginx负载均衡[轮询]

一、负载均衡 解释&#xff1a;负载均衡分为两部分&#xff08;应用集群和负载均衡器&#xff09;。应用集群&#xff1a;将同一应用部署到多台机器上&#xff0c;组成处理集群&#xff0c;接收负载均衡设备分发的请求&#xff0c;进行处理并返回响应的数据。负载均衡器:将用户…

C语言库函数— qsort () 详解

目录 1. qsort()函数简介 1.1 函数原型 1.2 函数参数 2. 比较函数简介 2. 1 比较函数参数 2.2 比较函数使用 3. qsort()函数使用 3.1 整形数组排序 3.2 字符数组排序 3.3 浮点型数组排序&#xff08;double类型为例&#xff09; 3. 4 字符串数组排序 3.5 结构体…

Spring Security(十八)--OAuth2:实现授权服务器(上)--环境准备以及骨架代码搭建

一、前言 本节大家如果一直从一开始看过来的话&#xff0c;就会巧妙发现我们将之前的实践代码全部连接起来&#xff0c;本节将会使用到之前的短信/验证码登录相关的逻辑代码&#xff0c;如果大家没有看的感兴趣可以回到https://editor.csdn.net/md/?articleId127617691先将这…

【pdf翻译中文】免费自用日语pdf转中文、韩语pdf转中文(也可以转英文)或者其他小语种法语、德语pdf转中文

不是很精确、有点慢&#xff0c;但是也够用&#xff0c;胜在免费free 效果图&#xff1a; 一些对比&#xff1a; 模型来自于&#xff1a; https://huggingface.co/models 文件目录 调用模型的代码&#xff1a; 运行此段代码&#xff0c;执行翻译 一些简单的设置在这里…

【LeetCode每日一题】——557.反转字符串中的单词 III

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 557.反转字符串中的单词 III 四【题目描述】 给…

DPU1.1S—高性能、低功耗4口高速USB2.0HUB控制器芯片

DPU1.1S是一款高性能、低功耗4口高速 USB2.0 HUB 控制器&#xff0c;上行端口兼容高速 480MHz和全速12MHz两种模式&#xff0c;4个下行端口兼容高速480MHz、全速12MHz、低速1.5MHz三种模式。 DPU1.1S采用状态机单事务处理架构&#xff0c;而非单片机架构&#xff0c;多个事务缓…

沃通CA证书支持多所高校招投标文件电子签名

招投标电子化是国家大力推行的战略性工作&#xff0c;为贯彻落实电子招投标工作&#xff0c;各政企单位、高校均启动采购与招投标系统&#xff0c;自行组织的招标、单一来源等采购活动都通过该类系统在线进行。近期&#xff0c;沃通CA证书打通与多所高校采购与招投标系统的应用…

C语言深度解析:函数的形参和实参与传值和传址(多角度分析,让你有一种相见恨晚的感觉!!!!)

目录 一、前言 二、函数的形参和实参 &#x1f351;实参 &#x1f34e;形参 &#x1f347;形参与实参之间的区别 &#x1f350;形参与实参之间的联系&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 三、函数的传值和传址&#xff08;超…

[附源码]计算机毕业设计JAVA网上宠物商店

[附源码]计算机毕业设计JAVA网上宠物商店 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

【html5期末大作业】基于HTML仿QQ音乐官网网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Xcode 中设置APP的图标(Icon)和启动页面(Launch Screen)

设置图标&#xff08;Icon&#xff09; 首先&#xff0c;要准备4组图标&#xff08;如果是发布在 iOS 平台上&#xff09;&#xff0c;这4组分别是 120 x 120 px&#xff0c;152 x 152 px&#xff0c;167 x 167 px&#xff0c;1024 x 1024 px 的尺寸&#xff0c;要 PNG 格式。…

使用EL表达式时,PropertyNotFoundException异常的解决过程

一. 业务场景 最近&#xff0c;杨哥的一个班级正在做基于JSPJSTL/EL Servlet JavaBean JDBC MySQL技术方案的阶段项目。其中有一个需求是根据多条件动态搜索商品信息&#xff0c;最终分页显示出商品列表。这个功能可以在dao层采用多分支条件组合&#xff0c;显示页面使用JST…

2022王道OS 1.3 操作系统运行环境

2022王道OS 1.3 操作系统运行环境 文章目录2022王道OS 1.3 操作系统运行环境1.3_1 操作系统的运行机制知识总览知识点预备知识&#xff1a;程序是如何运行的&#xff1f;两种程序&#xff1a;内核程序 VS 应用程序两种指令&#xff1a;特权指令 VS 非特权指令两种状态&#xff…

二、【React脚手架】组件化编码(TodoList案例)

文章目录1、组件化编码流程&#xff08;通用&#xff09;2、样式覆盖问题3、DEMO3.1、需要实现的效果3.2、前期须知3.3、项目结构3.4、CODE3.4.1、App.js3.4.2、App.css3.4.3、Header3.4.4、List3.4.5、Item3.4.6、Footer1、组件化编码流程&#xff08;通用&#xff09; 拆分组…

Python 面向对象简介

什么是面向对象&#xff1f; 面向对象是一种编程思想&#xff0c;在开发过程中关注的不是解决问题的步骤和过程&#xff0c;而是参与解决问题的对象和它们具备的行为。 01 面向过程和面向对象的区别 1、面向过程 面向过程在开发过程中关注的是解决问题的步骤和过程&#xf…

《计算机体系结构量化研究方法第六版》1.6 成本趋势

1.6.1 时间、产量和大众化的影响 即便没有技术进步&#xff0c;计算机组件的制造成本也会随着时间的推移而降低。这背后有着学习曲线的因素。 【学习曲线&#xff08;from百度&#xff09;】 学习曲线的定义为"在一定时间内获得的技能或知识的速率"&#xff0c;又称…