c语言 绘制任意斜率的直线,计算机图形学 绘制任意斜率的直线(1)
计算机图形学 绘制任意斜率的直线(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)相关推荐
- line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法
[计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...
- 计算机图形学算法【1】——直线画法(数值微分法)
计算机图形学算法[1]--直线画法(数值微分法) 以下所有代码均在VS2010下的MFC框架下使用 DDA(数值微分法)介绍 一.基本原理 通过计算直线的斜率k和截距b,y = kx+b 1.计算起点 ...
- 计算机图形学代码3D太阳系,计算机图形学-绘制太阳系.doc
<计算机图形学-绘制太阳系.doc>由会员分享,提供在线免费全文阅读可下载,此文档格式为doc,更多相关<计算机图形学-绘制太阳系.doc>文档请在天天文库搜索. 1.实验名 ...
- 计算机图形学绘制多边形代码_《GPU编程与CG语言之阳春白雪下里巴人》- 第二章(GPU 图形绘制管线)...
第二章 GPU 图形绘制管线 万事开头难,每门科学都是如此. ------ 马克思 图形绘制管线描述 GPU 渲染流程,即"给定视点.三维物体.光源.照明模式,和纹理等元素,如何绘制一幅二维 ...
- 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...
PAGE 32 PAGE 7 计算机图形学 实验报告 班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其 ...
- 【计算机图形学】基本图形元素:直线的生成算法
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
- vb计算机图形学绘制钻石图案,Visual Basic 图形及图像处理 - 关于VB的经验之谈 - VB爱好者乐园(VBGood) - 关于VB的经验,电子教程,代码,控件,论坛,博客,微博等....
计算机图形学是计算机应用的一个重要方面,很多人固执的认为Visual C++是处理图形的首选工具,但实际上Visual Basic在图形显示,Flash图像处理上有其独到之处. API实现完美的图片出 ...
- 计算机图形学绘制图形的过程,计算机图形学13_图形绘制流水线的实现.pdf
您所在位置:网站首页 > 海量文档  > 计算机 > 图形图像 计算机图形学13_图形绘制流水线的实现.pdf6页 本 ...
- DDA算法画直线----计算机图形学
生成直线的DDA算法: 假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示: 令 , 斜率 , 则直线方程为 为方便起见,这里 假定 . 显然,对于每一个 xi ...
最新文章
- 生产环境实用的小脚本
- python argparse中action 的可选参数store_true
- 图像分割(Image Segmentation)
- sed在替换的时候,使用变量中的值?如何在sed实现变量的替换?获取到变量中的值?...
- 【数据结构与算法】之深入解析“解码方法”的求解思路与算法示例
- 审查指南 最新版本_代码审查-最终指南
- 阿里:千亿交易背后的0故障发布
- 文件字符输入流 FileReader java
- emacs org 日历_发送电子邮件并使用Emacs检查您的日历
- 3月4日见!Redmi Note 10系列屏幕升级:首次采用Super AMOLED屏
- JDBCUtils类测试
- 《浪潮之巅》吴军:特斯拉自动驾驶堪比中甲水平,全球5G看好华为
- 数据结构与算法python—14.排序之九种排序详解
- 收藏里的文档web service说明
- 宏杉MacroSan存储开局指导-流程
- SpringBoot下实现PDF转word(Maven项目)
- Excel 常用函数和公式
- 矩阵转置相关公式_透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵
- 3种顺序排序方法。简单排序是指时间复杂度为O(n^2)的排序方法。
- java通过API给企业微信用户发送微信消息
热门文章
- Android中Fragment知识点终极整理 避免多个Fragment加载重叠踩坑
- oracle 数据库-查询
- 从0开始教你三天完成毕业设计-前端之首页
- java上传文件限速_【面试题目】Java文件下载(限速、进度条)
- 如何彻底的删除hao123_彻底删除hao123导航主页以及桌面快捷方式
- 添加notepad为文件默认打开方式
- 【边学边记_03】——参数化设计实现模块重用
- 2009年经典到变态的语录100句
- 单色位图、16色位图、256色位图的含义
- Robotic Pick-and-Place of Novel Objects in Clutter with Multi-Affordance Grasping...