line划线计算机图像学,计算机图形学DDA画线法+中点画线法+Bresenham画线法(示例代码)...
简介这篇文章主要介绍了计算机图形学DDA画线法+中点画线法+Bresenham画线法(示例代码)以及相关的经验技巧,文章约9131字,浏览量322,点赞数4,值得参考!
#include
#include
#include
#include
void line1(){
line(100, 100, 200, 400);
line(100, 400, 200, 100);
line(0, 200, 300, 300);
line(0, 300, 300, 200);
}
void lineDDA(int x0, int y0, int x1, int y1, int color){
int x;
float dy, dx, y, m;
dx = x1 - x0;
dy = y1 - y0;
m = dy / dx;
y = y0;
for (x = x0; x <= x1; x++){
putpixel(x, (int)(y + 0.5), color);
y += m;
}
}
void lineDDA(){
lineDDA(100, 100, 200, 400, RED);
lineDDA(100, 400, 200, 100, RED);
lineDDA(0, 200, 300, 300, RED);
lineDDA(0, 300, 300, 200, RED);
}
void lineMidPoint(int x0, int y0, int x1, int y1, int color){
int x = x0, y = y0;
int a = y0 - y1, b = x1 - x0;
int cx = (b >= 0 ? 1 : (b = -b, -1));
int cy = (a <= 0 ? 1 : (a = -a, -1));
putpixel(x, y, color);
int d, d1, d2;
if (-a <= b) // 斜率绝对值 <= 1
{
d = 2 * a + b;
d1 = 2 * a;
d2 = 2 * (a + b);
while (x != x1)
{
if (d < 0)
y += cy, d += d2;
else
d += d1;
x += cx;
putpixel(x, y, color);
}
}
else // 斜率绝对值 > 1
{
d = 2 * b + a;
d1 = 2 * b;
d2 = 2 * (a + b);
while (y != y1)
{
if (d < 0)
d += d1;
else
x += cx, d += d2;
y += cy;
putpixel(x, y, color);
}
}
}
void lineMidPoint(){
lineMidPoint(100, 100, 200, 400, GREEN);
lineMidPoint(100, 400, 200, 100, GREEN);
lineMidPoint(0, 200, 300, 300, GREEN);
lineMidPoint(0, 300, 300, 200, GREEN);
}
void lineBresenham(int x0, int y0, int x1, int y1, int color)
{
int dx = x1 - x0;
int dy = y1 - y0;
int ux = dx >0 ? 1 : -1;//x伸展方向
int uy = dy >0 ? 1 : -1;//y伸展方向
int dx2 = dx << 1;//x偏移量乘2
int dy2 = dy << 1;//y偏移量乘2
if (abs(dx)>abs(dy))
{//以x为增量方向计算
int e = -dx; //e = -0.5 * 2 * dx,把e 用2 * dx* e替换
int x = x0;
int y = y0;//起点y坐标
for (x = x0; x < x1; x += ux)
{
putpixel(x, y, color);
e = e + dy2;//来自 2*e*dx= 2*e*dx + 2dy (原来是 e = e + k)
if (e > 0)//e是整数且大于0时表示要取右上的点(否则是右下的点)
{
y += uy;
e = e - dx2;//2*e*dx = 2*e*dx - 2*dx (原来是 e = e -1)
}
}
}
else
{//以y为增量方向计算
int e = -dy; //e = -0.5 * 2 * dy,把e 用2 * dy* e替换
int x = x0;
int y = y0;
for (y = y0; y < y1; y += uy)
{
putpixel(x, y, color);
e = e + dx2;//来自 2*e*dy= 2*e*dy + 2dy (原来是 e = e + k)
if (e > 0)//e是整数且大于0时表示要取右上的点(否则是右下的点)
{
x += ux;
e = e - dy2;//2*e*dy = 2*e*dy - 2*dy (原来是 e = e -1)
}
}
}
}
void lineBresenham1(int x0, int y0, int x1, int y1, long color)
{
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int x = x0;
int y = y0;
int stepX = 1;
int stepY = 1;
if (x0 > x1) //从右向左画
stepX = -1;
if (y0 > y1)
stepY = -1;
if (dx > dy) //沿着最长的那个轴前进
{
int e = dy * 2 - dx;
for (int i = 0; i <= dx; i++)
{
putpixel(x, y, color);
x += stepX;
e += dy;
if (e >= 0)
{
y += stepY;
e -= dx;
}
}
}
else
{
int e = 2 * dx - dy;
for (int i = 0; i <= dy; i++)
{
putpixel(x, y, color);
y += stepY;
e += dx;
if (e >= 0)
{
x += stepX;
e -= dy;
}
}
}
}
void lineBresenham(){
lineBresenham1(100, 100, 200, 400, YELLOW);
lineBresenham1(100, 400, 200, 100, YELLOW);
lineBresenham1(0, 200, 300, 300, YELLOW);
lineBresenham1(0, 300, 300, 200, YELLOW);
}
void showWord(int code){
outtextxy(200, 30, "单击右键退出");
switch (code){
case 1://原画
outtextxy(200, 10, "easyX系统画线算法");
break;
case 2://DDA算法
outtextxy(200, 10, "DDA算法");
break;
case 3://中点画线算法
outtextxy(200, 10, "中点画线算法");
break;
case 4://Bresenham算法
outtextxy(200, 10, "Bresenham算法");
break;
default:
line1();
break;
}
}
void drawLine(int code){
switch (code){
case 1://原画
line1();
break;
case 2://DDA算法
lineDDA();
break;
case 3://中点画线算法
lineMidPoint();
break;
case 4://Bresenham算法
lineBresenham();
break;
default:
line1();
break;
}
}
void drawLine(int x0,int y0,int x1,int y1,int code){
showWord(code);
switch (code){
case 1://原画
line(x0,y0,x1,y1);
break;
case 2://DDA算法
lineDDA(x0, y0, x1, y1,WHITE);
break;
case 3://中点画线算法
lineMidPoint(x0, y0, x1, y1, WHITE);
break;
case 4://Bresenham算法
lineBresenham1(x0, y0, x1, y1, WHITE);
break;
default:
line1();
break;
}
}
void showWORDXY(int x, int y, int showX, int showY,int flag){
char dintX[5] = { 0 };
char dintY[5] = { 0 };
_itoa_s(showX, dintX, 10);//把整数showX转成字符串dintX
_itoa_s(showY, dintY, 10);//把整数showY转成字符串dintY
char str1[100] = "第一个点的坐标:(";//此时数组没有定义长度 元素的个数应该为strlen +1 因为字符串末尾有 ‘\0‘结束
char str2[100] = "第二个点的坐标:(";
if (flag == 1){
// _countof(dintX)能够获取到数组中元素的个数 含‘\0’
strcat_s(str1, strlen(str1) + strlen(dintX)+1, dintX);
strcat_s(str1, strlen(str1) + strlen(",")+1, ",");
strcat_s(str1, strlen(str1) + strlen(dintY)+1, dintY);
strcat_s(str1, strlen(str1) + strlen(")")+1, ")");
outtextxy(x, y, str1);
}
else if (flag == 2){
strcat_s(str2, strlen(str2) + strlen(dintX)+1, dintX);
strcat_s(str2, strlen(str2) + strlen(",")+1, ",");
strcat_s(str2, strlen(str2) + strlen(dintY)+1, dintY);
strcat_s(str2, strlen(str2) + strlen(")")+1, ")");
outtextxy(x, y, str2);
}
}
//调用easyX
void easyX(int code){
initgraph(640, 480); //初始化
showWord(code);
MOUSEMSG m; // 定义鼠标消息
int n=0;//读取两个点
int exit = false;
int x0=0, y0=0,x1=0,y1=0;
while (n<2 && !exit)
{
m = GetMouseMsg();
switch (m.uMsg)
{
case WM_RBUTTONDOWN:
outtextxy(200, 300, "再次点击键退出");
exit = true;
break; // 按鼠标右键退出程序
}
while (m.uMsg != WM_LBUTTONDOWN){
m = GetMouseMsg();
switch (m.uMsg)
{
case WM_RBUTTONDOWN:
outtextxy(200, 300, "再次点击键退出");
exit = true;
break; // 按鼠标右键退出程序
}
}
while (m.uMsg != WM_LBUTTONUP){
m = GetMouseMsg();
cleardevice();
showWord(code);
if (n == 0){
showWORDXY(200, 430, x0, y0,1);
x0 = m.x;
y0 = m.y;
}
else{
showWORDXY(200, 430, x0, y0, 1);
showWORDXY(200, 450, x1, y1, 2);
x1 = m.x;
y1 = m.y;
}
}
n++;
if (n == 2){
//画线
drawLine(x0, y0, x1, y1, code);
//重置
n = 0;
}
}
//_getch(); //等待用户操作
closegraph(); //关闭图形
}
int main(){
int n = 1;
printf("请选择画线算法画线:\n");
printf("1.easyX系统画线函数.\n");
printf("2.DDA画线算法函数.\n");
printf("3.中点画线算法函数.\n");
printf("4.Bresenham画线算法函数.\n");
printf("0.退出.\n");
while (n != 0){
scanf_s("%d", &n);
if (n == 0){
exit(0);
}
easyX(n);
}
return 0;
}
效果图:
line划线计算机图像学,计算机图形学DDA画线法+中点画线法+Bresenham画线法(示例代码)...相关推荐
- line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法
[计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...
- 计算机图形学之画圆(中点画圆法、Bresenham画圆法)
参考学习了一些前辈的代码,总结了以下这个,感谢前人栽树,同时欢迎交流. 整个画圆利用了圆的八对称性,故只需画出八分之一圆就可利用对称性就可以画出整个圆. 专门写了一个函数来画圆的点,其中(x0,y0) ...
- 【计算机图形学|直线生成算法】中点画线法
文章目录 概述 一.基本思想 二.构造判别式: 三.递推出增量 优化: 总结: 四.例题分析 五.伪代码 概述 中点画线法(Midpoint Line Algorithm)是一种画线(Line Dra ...
- [计算机图形学算法]直线扫描转换算法-中点画线法
DDA算法用斜截式表示直线方程,简化了乘法运算,但任存在浮点运算. 我们猜想,用别的方式表示直线,是否能把浮点运算也简化为整数运算. 在中点画线法中,我们用Ax+By+C=0的一般式方程来表示直线,即 ...
- 计算机图形动画处理实训报告,西安石油大学计算机图形学 实验报告.doc
文档介绍: 西安石油大学计算机图形学_实验报告实验报告 -计算机图形学实验大作业 课程名称计算机图形学 实验名称二维绘图系统与计算机动画 姓名 学号 专业班级 成绩 指导教师爨莹 实验报告 课程名称计 ...
- [转载]一个图形爱好者的书架/白话说学计算机图形学
1.一个图形爱好者的书架 原文地址:http://blog.csdn.net/nhsoft/archive/2004/06/23/22992.aspx 早几天看到有人把自己在大学四年 ...
- 计算机图形学画直线程序豆丁网,计算机图形学DDA生成直线画法程序.doc
计算机图形学DDA生成直线画法程序 实验一.直线的生成 一.实验目的 掌握DDA直线画法.中点画线法和Bresenham画线法 掌握VC++简单程序设计方法 二.实验内容 根据提供的程序框架,修改部分 ...
- 计算机图形学---DDA直线画法c#实现
计算机图形学-DDA直线画法c#实现 DDA直线画法,即数值微分法,是计算机图形学中直线段扫描转换的经典算法之一,本篇文章将简单介绍DDA算法,并给出c#实现的代码. 一.DDA直线画法 设直线的斜截 ...
- 华北电力大学计算机图形学实验报告,华北电力大学计算机图形学实验报告分析.doc...
华北电力大学计算机图形学实验报告分析 科 技 学 院 课程设计(综合实验)报告 ( 2013 -- 2014 年度第 2 学期) 实验名称 OpenGL基本图元绘制实验 课程名称 计算机图形学 | | ...
- 动画都要用计算机图形学吗,计算机图形学在电影和动画中的应用.pdf
计算机图形学在电影和动画中的应用.pdf SoftwareApplication ·软件应用 计算机图形学在电影和动画中的应用 文/费立伟 工学院毕业论文课题是关于三维交互式图形系 计算机软硬件和图形 ...
最新文章
- 拥抱AI技术,赋能智慧工业
- AI量身定制:如何打造符合“中国特色教育”的内容推荐体系?
- 日期类对象与整数之间的加法运算
- scala dynamics 示例
- 依赖注入容器Unity Application Block快速入门
- Oracle数据类型(转)
- TOJ 4095: love168yk的选美大赛
- cocos2dx基础篇(29)——屏幕适配
- Django(part26)--修改及删除记录
- C++中的各种预处理的表示
- java核心面试_Java核心面试问题
- c# sizeof_C#程序演示sizeof()运算符的示例
- 安卓dalvik和art区别
- 网络编程模型综述 之 成熟的IO框架介绍
- 云计算三重奏:SAAS、PAAS和IAAS
- Navicat for oracle 提示 cannot load oci dll,193的解决方法
- C语言基础函数(二)
- javascrip语言精髓与编程实践pdf_C/C 编程推荐学习顺序和书籍
- python进行数据抽取_python中的数据抽取
- 保证线程安全的三种方式
热门文章
- bootstrapValidator.js文件里的提示语:设置为中文
- 对话Oneledger联合创始人Edwin Zhang
- 第三部分 数据结构 -- 第四章 图论算法1374:铲雪车(snow)
- linux与windows笔记本连线共享wifi
- 2022年安全员-C证上岗证题目及在线模拟考试
- gwas snp 和_GWAS,SNP,和疾病
- mayapython常用模块_Maya入门之在Maya 中使用 Python 的基础知识有那些
- html个人主页实验报告,HTML个人主页实验报告.docx
- [转]再分析资料整理
- 如何在phpstudy设置多站点和二级域名