=============================================================================================
20130806_第二次修改                         ccb_warlock
=============================================================================================
测试平台:VC++6.0
操作系统:64位win7
暑假的课程设计老师再使用MFC画点时提到了一点,让我们课后思考则样能使得画线时是一个一个点连续缓慢的画出来。我觉得这个技术点在我之后的数据结构里做构建树的程序里很有用(即能直观的看出先画哪些点,后画哪些点),于是我开始思考并测试我认为可行的办法。由于我的技术能力所限,现在有两个办法去实现这个功能,如果将来还有别的方法再进行本文的修改。
方法1:(思路:通过占用资源的方式)
该方法也是我最先涌入脑子的一个思路,因为想到画点需要消耗CPU等硬件的资源(虽然现在GPU的出现已经使图像处理的速度大大加快,可是程序内部实现点亮像素点的工作还是相对消耗资源的),通过一定的操作减慢程序走的速度。而这个操作我也首先想到通过多次循环画无用点使得每画一个有用点画的时间增加(换句话说就是当画了一个有用点后,程序在画下一个有用点之前画N个无用点)。由于这些无用点不是我们需要的,所以将这些点画的坐标与前一个有用点坐标一致我们认为是合理的。将该循环语句加在需要的位置,通过不断运行测试来确定哨兵位合理的值。
提醒在组建前仔细检查相关sentry的赋值有没有过大,因为如果sentry赋予的值过大,在做循环时很可能会出现程序的未响应,甚至是该程序卡死(可以将这个情况视为危害不大的死循环)。
增加的循环源码部分:
while(sentry)
{
pDC->SetPixel(x,y,color);//此处的x,y根据情况修改
sentry--;
}

画线源码部分:
//中点画线函数
void CTest01Dlg::MidpointLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
int a,b,delta1,delta2,d,x,y;
int sentry;
//传入端点坐标x值相等
if (x0 == x1)
{
if (y0 < y1)
{
for (int i=y0;i<=y1;i++)
{
pDC->SetPixel(x0+5,i,color);
sentry=500;
while(sentry)
{
pDC->SetPixel(x0+5,i,color);
sentry--;
}
}
}
else
{
for (int i=y1;i<=y0;i++)
{
pDC->SetPixel(x0+5,i,color);
sentry=500;
while(sentry)
{
pDC->SetPixel(x0+5,i,color);
sentry--;
}
}
}
return;
}
//斜率判断,斜率绝对值大于1,则m为false,否则为true
BOOL m = (fabs(y1-y0)<=fabs(x1-x0));
//如果传入的x0大于x1,将坐标值互换
if (x0>x1)
{
d=x0+5;x0=x1+5;x1=d;
d=y0+3;y0=y1+3;y1=d;
}
a = y0 - y1;
b = x1 - x0;
x = x0+5;
y = y0+3;
pDC->SetPixel(x,y,color);
//斜率绝对值小于等于1
if (m)
{
//第一种情况,y值递增
if (y0 <= y1)
{
d = 2 * a +b;
delta1 = 2 * a;
delta2 = 2 * (a + b);
while (x < x1)
{
if (d < 0)
{x++;y++;d+=delta2;}
else
{x++;d+=delta1;}
pDC->SetPixel(x,y,color);
sentry=500;
while(sentry)
{
pDC->SetPixel(x,y,color);
sentry--;
}
}
}
//第三种情况,y值递减
else
{
d = 2 * a -b;
delta1 = 2 * a;
delta2 = 2 * (a - b);
while (x < x1)
{
if (d < 0)
{x++;d+=delta1;}
else
{x++;y--;d+=delta2;}
pDC->SetPixel(x,y,color);
sentry=500;
while(sentry)
{
pDC->SetPixel(x,y,color);
sentry--;
}
}
}
}
//斜率绝对值大于1
else
{
//第二种情况,y值递增
if (y0 <= y1)
{
d =  a + 2 * b;
delta1 = 2 * b;
delta2 = 2 * (a + b);
while (y < y1)
{
if (d < 0)
{y++;d+=delta1;}
else
{y++;x++;d+=delta2;}
pDC->SetPixel(x,y,color);
sentry=500;
while(sentry)
{
pDC->SetPixel(x,y,color);
sentry--;
}
}
}
//第四种情况,y值递减
else
{
d =  a - 2 * b;
delta1 = -2 * b;
delta2 = 2 * (a - b);
while (y > y1)
{
if (d < 0)
{y--;x++;d+=delta2;}
else
{y--;d+=delta1;}
pDC->SetPixel(x,y,color);
sentry=500;
while(sentry)
{
pDC->SetPixel(x,y,color);
sentry--;
}
}
}
}
}

特别注明:一开始测试时,该方法没有实现我所需要的功能,因为我将哨兵位sentry的赋值与函数最前面的定义(int a,b,delta1,delta2,d,x,y;)放在了一起,结果导致在画某一条线的循环时使得仅仅只在画完第一个有用点后进行循环画无用点的操作(换句话说就是在画这条线的第一点后调用了一次画无用点的while循环,之后由于sentry被置为了0,while循环不被调用),所以前面测试时一直没有缓慢画点的效果。
经过后来查看源码,我发现了错误的地方,并在调用该while循环前,对增加对sentry的赋值以保证接下来的循环能正常进行。再次组建运行测试程序的,缓慢画点的功能终于实现了。
方法2:(思路:通过暂停程序运行的方式)
根据这个思路,我们可以使用系统自带的sleep函数来实现这个功能。
(windows中Sleep函数的“S”大写,具体内容见本博客《关于sleep函数的一些问题和资料》)。
sleep函数的功能让系统暂停这个应用的运行(使用CPU),所以通常用于延时应用。我个人觉得这个函数功能比方法1通过占用资源(使用CPU)来的好,毕竟一台计算机的资源是有限的。
增加的sleep函数部分:
Sleep(5);
画线源码部分:
//中点画线函数
void CTest01Dlg::MidpointLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
int a,b,delta1,delta2,d,x,y;
int sentry;
//传入端点坐标x值相等
if (x0 == x1)
{
if (y0 < y1)
{
for (int i=y0;i<=y1;i++)
{
pDC->SetPixel(x0+5,i,color);
        Sleep(5);
}
}
else
{
for (int i=y1;i<=y0;i++)
{
pDC->SetPixel(x0+5,i,color);
        Sleep(5);
}
}
return;
}
//斜率判断,斜率绝对值大于1,则m为false,否则为true
BOOL m = (fabs(y1-y0)<=fabs(x1-x0));
//如果传入的x0大于x1,将坐标值互换
if (x0>x1)
{
d=x0+5;x0=x1+5;x1=d;
d=y0+3;y0=y1+3;y1=d;
}
a = y0 - y1;
b = x1 - x0;
x = x0+5;
y = y0+3;
pDC->SetPixel(x,y,color);
//斜率绝对值小于等于1
if (m)
{
//第一种情况,y值递增
if (y0 <= y1)
{
d = 2 * a +b;
delta1 = 2 * a;
delta2 = 2 * (a + b);
while (x < x1)
{
if (d < 0)
{x++;y++;d+=delta2;}
else
{x++;d+=delta1;}
pDC->SetPixel(x,y,color);
        Sleep(5);
}
}
//第三种情况,y值递减
else
{
d = 2 * a -b;
delta1 = 2 * a;
delta2 = 2 * (a - b);
while (x < x1)
{
if (d < 0)
{x++;d+=delta1;}
else
{x++;y--;d+=delta2;}
pDC->SetPixel(x,y,color);
        Sleep(5);
}
}
}
//斜率绝对值大于1
else
{
//第二种情况,y值递增
if (y0 <= y1)
{
d =  a + 2 * b;
delta1 = 2 * b;
delta2 = 2 * (a + b);
while (y < y1)
{
if (d < 0)
{y++;d+=delta1;}
else
{y++;x++;d+=delta2;}
pDC->SetPixel(x,y,color);
        Sleep(5);
}
}
//第四种情况,y值递减
else
{
d =  a - 2 * b;
delta1 = -2 * b;
delta2 = 2 * (a - b);
while (y > y1)
{
if (d < 0)
{y--;x++;d+=delta2;}
else
{y--;d+=delta1;}
pDC->SetPixel(x,y,color);
        Sleep(5);
}
}
}
}

即使有一天在技术上我已经是个能手,请记住自己应有的责任和保持一个真诚交流、始终渴望追求技术的心。                                                                     ----------ccb_warlock

转载于:https://www.cnblogs.com/straycats/p/5248733.html

缓慢画点功能实现的两个方法相关推荐

  1. JS实现星星评分功能实例代码(两种方法)

    转载自   JS实现星星评分功能实例代码(两种方法) 一.方法1 1.用到图片 2.结构和样式 <!DOCTYPE html> <html lang="en"&g ...

  2. python matplotlib在一张画布上画多个图的两种方法,plt.subplot(),plt.subplots()。

    Matplotlib在一张画布上画多个图的两种方法,plt.subplot,plt.subplots. 目录 回顾 plt.subplots()画法 plt.subplot()画法 保存 回顾 之前也 ...

  3. hexo博客文章置顶功能实现的两种方法

    写在前面 本文主要描述了如何实现hexo文章置顶功能,讲述了通过修改源码和通过更改插件两种方式实现,以及如何添加置顶显示.文章可能还有很多不足,请大家谅解,欢迎大佬提意见. 本文使用的东西 win10 ...

  4. java实现星级评分功能_JS实现星星评分功能实例代码(两种方法)

    一.方法1 1.用到图片 2.结构和样式 Document ul { padding-left: 0; overflow: hidden; } ul li { float: left; list-st ...

  5. 【巨人的肩膀上制造世界】——10——Unity3D实用插件之Vectrosity,轻松便捷的实现2D/3D画线功能

    [巨人的肩膀上制造世界]--10--Unity3D实用插件之Vectrosity,轻松便捷的实现2D/3D画线功能 目录 1.博客介绍 2.内容 (1)编辑器预制线条 (2)编辑器修改线条 (3)线条 ...

  6. VC++ 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能

    目录 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能 接上:VC+ ...

  7. TapTap物理画线游戏,使用Unity实现2D物理画线功能

    实现效果如下: 本工程已上传到GitHub,感兴趣的同学可自行下载学习. GitHub地址:https://github.com/linxinfa/UnityPhysicsDrawLine 物理画线的 ...

  8. 【游戏开发实战】TapTap物理画线游戏,教你使用Unity实现2D物理画线功能,看到我为你画的彩虹了吗

    文章目录 一.前言 二.思考 三.验证我们的思考 1.创建物体挂组件 2.设置组件参数 3.运行测试 4.结论 四.撸起袖子写代码 1.Line.cs 2.LinesDrawer.cs 五.场景 六. ...

  9. JAVA美颜相机入门(兼具图像处理和画图板功能)

    美颜相机已经成为当代年轻人不可或缺的自拍神器,其具有自动美肌,完美保留细节,让照片告别模糊等功能.或许我们会觉得编写这样一个具有如此强大功能的美颜相机一定需要庞大而且复杂的代码段,其实不然,即使对于初 ...

最新文章

  1. 一个完整的mybatis项目,包含增删改查
  2. 大数据如何促进经济增长?中国优势及应对 | 互联网经济学
  3. m.2接口和nvme区别_M.2接口硬盘当真速度就快吗?这些不懂就别乱买!今天再说一遍...
  4. 2021亳州高考成绩查询,2021年亳州高考状元名单公布,亳州文理科状元是谁多少分...
  5. A股收盘:深证区块链50指数涨0.33%,惠程科技等7股涨停
  6. 办公室网络域控制器管理方案
  7. vue中把table导出表格excel
  8. selenium chromedriver 下载地址
  9. PHP - 经典面试题大全,看这一篇就够了
  10. 利用Chrome浏览器的开发者工具控制网速
  11. PHP计算中文文字个数
  12. Java8--20道关于Stream流的题目练习
  13. 实战:k8s中网络策略实验(成功测试-博客输出)-20211005
  14. 使用递归函数计算1到n之和
  15. win10笔记本外接屏幕不清晰的解决方法
  16. 关于论坛、博客、SNS三者之间的区别
  17. IOS证书制作,最简单的在线制作流程
  18. 易观国际葛惟颖:中国移动支付行业发展前景分析
  19. 帆软报表列表_帆软入门与报表设计
  20. PowerMILL 2018四五轴编程后处理宏制作

热门文章

  1. webrtc 中的scoped_refptr
  2. android 九宫格带删除,Android--选择多张图片,支持拖拽删除、排序、预览图片
  3. 【EMGU CV】油管一个视频合集学习笔记
  4. 苹果手机屏幕上有白点怎么办
  5. 高考加油的c语言程序,2020祝高三高考加油的句子 高考加油一句话
  6. linux 隔行添加字符,EXCEL 隔行插入空白行、批量添加字符 等技巧备份
  7. Android自定义圆角矩形图片ImageView
  8. 移动跨平台ReactNative动画组件Animated【14】
  9. 用Burg法估计AR模型并绘制功率谱曲线的python实现
  10. rimraf 命令快速删除 node_modules 包