【计算机图形学】中点画线法实现任意斜率直线的绘制

一、中点画线法原理简介

1.建立基础

  • 中点画线法的建立基础是数值微分画线法(DDA),其作为改进算法,沿用了DDA算法的增量思想,针对影响DDA算法效率的两点:(1)采用了浮点加法(2)浮点数在显示输出时需要取整;进行了改进,即中点画线法直接采用了整数的加法、比较。

2.具体分析

  • 这里具体分析直线斜率 k ∈[0,1] 的情况,其他情况可以类推。
    对于起始点(x0,y0)、结束点(x1,y1),有A=y0-y1、B=x1-x0、C=(x1-x0)(x0-x1)、k=(y1-y0)/(x1-x0)
    设函数F(x,y) = Ax+By+C,则F(x,y)将平面分为三部分:
    1)F(x,y) = 0,点在直线上
    2)F(x,y) > 0,点在直线的上方
    3)F(x,y) < 0,点在直线的下方

  • 在画线过程中,对于每个当前像素点(xi,yi),每次在最大位移方向,即x方向上前进一步,在y方向上是否前进取决于前一格中点和直线的位置关系。

    如上图所示,可判断中点Mid和直线的位置关系,来确定下一点的选取,令d为判别式:
    1)d=F(xi+1,yi+0.5) = 0,Mid在直线上,可选取Pu/Pd,这里我们统一规定选取Pd
    2)d=F(xi+1,yi+0.5) > 0,Mid在直线的上方,直线离Pd较近,选取Pd,则下一点y方向上不变
    3)d=F(xi+1,yi+0.5) < 0,Mid在直线的下方,直线离Pu较近,选取Pu,则下一点y方向上前进

  • 利用增量思想,每下一步的d的判别可以基于本步d的正负情况,分本步d<0和d>=0两种情况讨论。
    1)d < 0: 本步选取Pu(xi+1,yi+1),则下一步中点(xi+2,yi+1.5):
    dnew=F(xi+2,yi+1.5)
    dnew=A(xi+2)+B(yi+1.5)+C
    dnew=[A(xi+1)+B(yi+0.5)+C]+A+B
    dnew=d+A+B
    2)d >= 0: 本步选取Pd(xi+1,yi),则下一步中点(xi+2,yi+0.5):
    dnew=F(xi+2,yi+0.5)
    dnew=A(xi+2)+B(yi+0.5)+C
    dnew=[A(xi+1)+B(yi+0.5)+C]+A
    dnew=d+A

  • 在画线过程中每一点的情况都分析完了,也易得结束画线的条件。接下来只要确定初始值就能顺利地画线了。对于起始点(x0,y0),下一步中点为(x0+1,y0+0.5):
    d0=F(x0+1,y0+0.5)
    d0=A(x0+1)+B(y0+0.5)+C
    d0=[Ax0+By0+C]+A+0.5B
    d0=A+0.5B

  • 可以发现d0的计算中涉及到了浮点数0.5,为了改进我们可以用2d0代替d0,因为后续计算中只考虑d的正负,则扩大两倍不会对结果有所影响。此时的新d0为:
    d0=2F(x0+1,y0+0.5)
    d0=2A(x0+1)+2B(y0+0.5)+2C
    d0=2[Ax0+By0+C]+2A+B
    d0=2A+B

    对于k值的其他情况也可以照此分析,注意在k>1和k<-1时,每一步的最大位移方向是y方向,即每次在y方向上前进一步,在x方向上需要判断中点和直线关系。

3.分析总结

k∈[0,1] k ∈(1,+∞) k∈[-1,0) k∈(-∞,-1)
d0=2A+B d0=A+2B d0=2A-B d0=A-2B
d<0:d+=2(A+B);x+=1;y+=1; d<0:d+=2B;y+=1; d<0:d+=2A;x+=1; d<0:d+=2(A-B);y-=1;x+=1;
d>=0:d+=2A;x+=1; d>=0:d+=2(A+B);y+=1;x+=1 d>=0:d+=2(A-B);x+=1;y-=1; d>=0:d-=2B;y-=1;

二、代码实现

/*
程序:中点画线法画任意斜率直线
编译环境:Visual C++ 6.0 EasyX_20200109(beta)
作者ID:weixin_43536824
邮箱:changye303@163.com
*/
#include <easyx.h>
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
//初始参数double A = y0-y1;double B = x1-x0;double k = -1*A/B;int x,y,d,t;
//要求x1>=x0,若x1<x0则互换两点if(x1<x0){t=x1;x1=x0;x0=t;t=y1;y1=y0;y0=t;}
//分四种情况,x,y,d均为整型
//情况1:if(k >= 0 && k <= 1){d = (int)(2*A+B);x = x0;y = y0;moverel(x,y);while(x != x1){if(d <= 0){x++;y++;d+=(int)(2*(A+B));lineto(x,y);}else{x++;d+=(int)(2*A);lineto(x,y);}}}
//情况2:
if(k>1){d = (int)(A+2*B);x = x0;y = y0;moverel(x,y);  while(y != y1){if(d < 0){y+=1;d+=(int)(2*B);lineto(x,y);}else{y+=1;x+=1;d+=(int)(2*(A+B));lineto(x,y);}}
}
 //情况3:if(k >= -1 && k < 0){d = (int)(2*A-B);x = x0;y = y0;moverel(x,y);while(x != x1){if(d < 0){x+=1;d+=(int)(2*A);lineto(x,y);}else{x+=1;y-=1;d+=(int)(2*(A-B));lineto(x,y);}    }}
//情况4:if(k < -1){d = (int)(A-2*B);x = x0;y = y0;moverel(x,y);while(y != y1){if(d < 0){y-=1;x+=1;d+=(int)(2*(A-B));lineto(x,y);}else{y-=1;d-=(int)(2*B);lineto(x,y);}}}

【计算机图形学】中点画线法实现任意斜率直线的绘制相关推荐

  1. 图形学---中点画线法---opengl中实现

    目的: 为了优化DDA算法中的浮点数运算(DDA中每次+k运算,|k|<1,所以存在浮点数运算),达到整数运算,提高效率. 基本思想: 当前像素点为(xp,yp),下一像素点为P1或P2.设P1 ...

  2. java实现计算机图形学中点画线算法

    代码:DrawLine.java: import javax.swing.*; import java.awt.*;public class DrawLine extends JPanel {publ ...

  3. 中点画线算法(任意斜率)

    基本原理 在画直线段的过程中,当前像素点为(xp ,yp ),下一个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1).若M=(xp +1,yp +0.5)为P1与P2之中 ...

  4. 中点画线完整算法c语言,中点画线算法(任意斜率)

    基本原理 在画直线段的过程中,当前像素点为(xp ,yp ),下一个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1).若M=(xp +1,yp +0.5)为P1与P2之中 ...

  5. 【计算机图形学】中点画线法实现焦点在x、y轴上的椭圆绘制

    [计算机图形学]中点画线法实现焦点在x.y轴上的椭圆绘制 一.中点画线法原理简介 1.建立基础 中点画线法的原理介绍见直线绘制的博文中点画线法实现任意斜率直线的绘制.基本思路是以下一点在椭圆外/内的位 ...

  6. 图形学--(中点画线法+Bresenham画线算法)

    编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...

  7. [计算机图形学算法]直线扫描转换算法-中点画线法

    DDA算法用斜截式表示直线方程,简化了乘法运算,但任存在浮点运算. 我们猜想,用别的方式表示直线,是否能把浮点运算也简化为整数运算. 在中点画线法中,我们用Ax+By+C=0的一般式方程来表示直线,即 ...

  8. 【计算机图形学|直线生成算法】中点画线法

    文章目录 概述 一.基本思想 二.构造判别式: 三.递推出增量 优化: 总结: 四.例题分析 五.伪代码 概述 中点画线法(Midpoint Line Algorithm)是一种画线(Line Dra ...

  9. 中点画线法c语言程序,计算机图形学 :中点画圆法

    由于安装了easyx的vc6.0只能用initgraph(x,y)初始化一个x*y的第一象限的画板.所以对于书上的画圆法我们需要稍微进行一点改变.这个算法只能画1/8的圆,其它7/8的圆只能通过对称关 ...

最新文章

  1. FastAdmin扩展PHPEXCEL,PHP7.3高版本兼容问题
  2. curl 升级 php,将命令行cURL转换为PHP cURL
  3. 大工14秋《计算机应用基础》在线测试2,2017大工《计算机应用基础》在线测试2答案.doc...
  4. 数据可视化怎么完成的_完成期望后会发生什么:可视化育儿数据
  5. Tensorflow学习笔记---1--Python基本操作
  6. 医学专业失业率最高 三类相关行业人才紧缺
  7. SparkSession对象
  8. 国内电视台播出的日本动画大盘点
  9. JS方法 数组倒序排列
  10. java个人博客源码ssm_基于SSM的个人博客系统源代码
  11. java怎么实现分享链接_分享Java
  12. 中文输入法无论如何都要占用Ctrl+Space快捷键终极解决!
  13. outer apply的用法
  14. Kubernetes容器云平台技术方案
  15. 二建代报名 2022年二级建造师什么时候报名
  16. 检索 国家自然科学基金
  17. 墨画子卿第一章第3节:挑衅
  18. 量化评价和质化评价举例_课程评价中的量化评价与质性评价
  19. Win10家庭版 开启Hyper-V
  20. CSDN大会后参观微软亚洲研究院

热门文章

  1. 华为荣耀android,速来围观!华为、荣耀将升级Android10名单流出,你手机在其中没...
  2. Ecstore 中数据表结构定义 dbschema 详解
  3. ORB_SLAM2 代码分析及介绍(视觉VO及重定位,Tracking)第一部分
  4. strcasecmp函数
  5. JAVA设计模式--七大原则之单一职责(01)
  6. Android Q settings 模块简介
  7. iPhone短信迁移到安卓(华为)
  8. 为什么推荐网页翻译工具?这一强大插件,让你办公速度提升很多
  9. host key for (ip地址) has changed and you have requested strict checking
  10. packer插件_如何使用Packer和Terraform轻松部署应用程序