计算机图形学 绘制任意斜率的直线(1)

本文演示,通过自己编写绘制直线函数(像素点填充),绘制任意斜率的直线。

1)创建CP2类

头文件:p2.h

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

//

//

#if !defined(AFX_P2_H__85E77AD6_0704_4E12_8E74_5BE1744B3154__INCLUDED_)

#define AFX_P2_H__85E77AD6_0704_4E12_8E74_5BE1744B3154__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__85E77AD6_0704_4E12_8E74_5BE1744B3154__INCLUDED_)

实现文件:p2.cpp

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

//

//

#include stdafx.h

#include DrawLine.h

#include P2.h

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//

// Construction/Destruction

//

CP2::CP2()

{

x=0.0;

y=0.0;

}

CP2::CP2(double x,double y)

{

this->x=x;

this->y=y;

}

CP2::~CP2()

{

}

2)创建CLine类

头文件:Line.h

// Line.h: interface for the CLine class.

//

//

#if !defined(AFX_LINE_H__8A91E283_F40D_4086_8BB8_7A9D9A6DB4D5__INCLUDED_)

#define AFX_LINE_H__8A91E283_F40D_4086_8BB8_7A9D9A6DB4D5__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include P2.h

class CLine

{

public:

CLine();

virtual ~CLine();

void MoveTo(CP2 p0); //移动到指定位置

void MoveTo(double x, double y);

void LineTo(CP2 p1, CDC *pDC); //绘制直线,不含终点

void LineTo(double x, double y, CDC *pDC);

private:

CP2 P0; //起点

CP2 P1; //终点

};

#endif // !defined(AFX_LINE_H__8A91E283_F40D_4086_8BB8_7A9D9A6DB4D5__INCLUDED_)

实现文件:Line.cpp

// Line.cpp: implementation of the CLine class.

//

//

#include stdafx.h

#include DrawLine.h

#include Line.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

//

CLine::CLine()

{

}

CLine::~CLine()

{

}

void CLine::MoveTo(CP2 p0) //记录直线起点函数

{

P0=p0;

}

void CLine::MoveTo(double x, double y)

{

P0.x = x;

P0.y = y;

}

void CLine::LineTo(double x, double y, CDC *pDC) //绘制

{

CP2 p;

p.x = x;

p.y = y;

LineTo(p, pDC);

}

void CLine::LineTo(CP2 p1, CDC *pDC)

{

P1=p1;

CP2 p,t;

COLORREF clr = RGB(0,0,0); //黑色像素点

if(fabs(P0.x-P1.x)<1e-6) //绘制垂线

{

if(P0.y>P1.y) //交换顶点,使得起始点低于终点

{

t=P0;P0=P1;P1=t;

}

for(p=P0;p.ySetPixelV(Round(p.x),Round(p.y),clr);

}

}

else

{

double k,d;

k=(P1.y-P0.y)/(P1.x-P0.x); //斜率

if(k>1.0) //绘制k>1(y为主方向)

{

if(P0.y>P1.y)

{

t=P0;P0=P1;P1=t;

}

d=1-0.5*k; //中点初始值

for(p=P0;p.ySetPixelV(Round(p.x),Round(p.y), clr);

if(d>=0) //中点位于将绘制点上方,填充下方点

{

p.x++;

d=d+1-k; //递推公式:当d>=0时,d(i+1)=d(i)+1-k;

}

else

d+=1;

}

}

if(0.0<=k && k<=1.0) //绘制0<=k<=1(x为主方向)

{

if(P0.x>P1.x)

{

t=P0;P0=P1;P1=t;

}

d=0.5-k; //中点初始值

for(p=P0;p.xSetPixelV(Round(p.x),Round(p.y), clr);

if(d<0) //中点位于将绘制点下方,填充上方点

{

p.y++;

d=d+1-k; //递推公式:当d<0时,d(i+1)=d(i)+1-k;

}

else

d-=k;

}

}

if(k>=-1.0 && k<0.0)//绘制-1<=k<0(x为主方向)

{

if(P0.x>P1.x)

{

t=P0;P0=P1;P1=t;

}

d=-0.5-k; //中点初始化

for(p=P0;p.xSetPixelV(Round(p.x),Round(p.y), clr);

if(d>0) //中点位于将绘制点上方,填充下方点

{

p.y--;

d=d-1-k; //递推公式:当d>0时,d(i+1)=d(i)-1-k;

}

else

d-=k;

}

}

if(k

{

if(P0.yP1.y;p.y--)

{

pDC->SetPixelV(Round(p.x),Round(p.y), clr);

if(d<0) //中点位于将绘制点下方,填充上方点

{

p.x++;

d=d-1-k;//递推公式:当d>0时,d(i+1)=d(i)-1-k;

}

else

d-=1;

}

}

}

P0=p1; //将终点赋值给起点

}

3)OnDraw函数

void CDrawLineView::OnDraw(CDC* pDC)

{

CDrawLineDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

//绘制直线

CLine *line=new CLine;//动态创建直线绘制类对象

line->MoveTo(100,100);

line->LineTo(500,500, pDC);

}

4)绘制效果如下

c语言 绘制任意斜率的直线,计算机图形学 绘制任意斜率的直线(1)相关推荐

  1. line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法

    [计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...

  2. 计算机图形学算法【1】——直线画法(数值微分法)

    计算机图形学算法[1]--直线画法(数值微分法) 以下所有代码均在VS2010下的MFC框架下使用 DDA(数值微分法)介绍 一.基本原理 通过计算直线的斜率k和截距b,y = kx+b 1.计算起点 ...

  3. 计算机图形学代码3D太阳系,计算机图形学-绘制太阳系.doc

    <计算机图形学-绘制太阳系.doc>由会员分享,提供在线免费全文阅读可下载,此文档格式为doc,更多相关<计算机图形学-绘制太阳系.doc>文档请在天天文库搜索. 1.实验名 ...

  4. 计算机图形学绘制多边形代码_《GPU编程与CG语言之阳春白雪下里巴人》- 第二章(GPU 图形绘制管线)...

    第二章 GPU 图形绘制管线 万事开头难,每门科学都是如此. ------ 马克思 图形绘制管线描述 GPU 渲染流程,即"给定视点.三维物体.光源.照明模式,和纹理等元素,如何绘制一幅二维 ...

  5. 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...

    PAGE 32 PAGE 7 计算机图形学 实验报告 班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其 ...

  6. 【计算机图形学】基本图形元素:直线的生成算法

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  7. vb计算机图形学绘制钻石图案,Visual Basic 图形及图像处理 - 关于VB的经验之谈 - VB爱好者乐园(VBGood) - 关于VB的经验,电子教程,代码,控件,论坛,博客,微博等....

    计算机图形学是计算机应用的一个重要方面,很多人固执的认为Visual C++是处理图形的首选工具,但实际上Visual Basic在图形显示,Flash图像处理上有其独到之处. API实现完美的图片出 ...

  8. 计算机图形学绘制图形的过程,计算机图形学13_图形绘制流水线的实现.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp图形图像 计算机图形学13_图形绘制流水线的实现.pdf6页 本 ...

  9. DDA算法画直线----计算机图形学

    生成直线的DDA算法: 假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示: 令  , 斜率  , 则直线方程为  为方便起见,这里 假定  . 显然,对于每一个 xi  ...

最新文章

  1. 生产环境实用的小脚本
  2. python argparse中action 的可选参数store_true
  3. 图像分割(Image Segmentation)
  4. sed在替换的时候,使用变量中的值?如何在sed实现变量的替换?获取到变量中的值?...
  5. 【数据结构与算法】之深入解析“解码方法”的求解思路与算法示例
  6. 审查指南 最新版本_代码审查-最终指南
  7. 阿里:千亿交易背后的0故障发布
  8. 文件字符输入流 FileReader java
  9. emacs org 日历_发送电子邮件并使用Emacs检查您的日历
  10. 3月4日见!Redmi Note 10系列屏幕升级:首次采用Super AMOLED屏
  11. JDBCUtils类测试
  12. 《浪潮之巅》吴军:特斯拉自动驾驶堪比中甲水平,全球5G看好华为
  13. 数据结构与算法python—14.排序之九种排序详解
  14. 收藏里的文档web service说明
  15. 宏杉MacroSan存储开局指导-流程
  16. SpringBoot下实现PDF转word(Maven项目)
  17. Excel 常用函数和公式
  18. 矩阵转置相关公式_透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵
  19. 3种顺序排序方法。简单排序是指时间复杂度为O(n^2)的排序方法。
  20. java通过API给企业微信用户发送微信消息

热门文章

  1. Android中Fragment知识点终极整理 避免多个Fragment加载重叠踩坑
  2. oracle 数据库-查询
  3. 从0开始教你三天完成毕业设计-前端之首页
  4. java上传文件限速_【面试题目】Java文件下载(限速、进度条)
  5. 如何彻底的删除hao123_彻底删除hao123导航主页以及桌面快捷方式
  6. 添加notepad为文件默认打开方式
  7. 【边学边记_03】——参数化设计实现模块重用
  8. 2009年经典到变态的语录100句
  9. 单色位图、16色位图、256色位图的含义
  10. Robotic Pick-and-Place of Novel Objects in Clutter with Multi-Affordance Grasping...