【计算机图形学】实验二 · 绘制任意斜率的直线段

阅读: 评论:0

【计算机图形学】实验二 · 绘制任意斜率的直线段

【计算机图形学】实验二 · 绘制任意斜率的直线段

直线段的扫描转换算法【理论知识,学习必看】 

一、实验任务

  • 掌握任意斜率直线段的中点Bresenham扫描转换算法。
  • 掌握CLine直线类的设计方法。
  • 掌握状态栏编程方法。

二、实验要求

  • 设计CLine直线类,其数据成员为直线段的起点坐标P0和终点坐标P1,成员函数为MoveTo()和LineTo()函数。

  • CLine类的LineTo()函数使用中点Bresenham算法绘制任意斜率k的直线段,包括k=±∞、k>1、0≤k≤1、-1≤k<0和k<-1五种情况。
  • 在屏幕客户区按下鼠标左键选择直线的起点,保持鼠标左键按下并移动鼠标到另一位置,弹起鼠标左键绘制任意斜率的直线段。
  • 在状态栏动态显示鼠标光标移动时的位置坐标。

 三、实验环境

  • Visual Studio 2017
  • C++ MFC

四、效果展示

 

 四、核心代码


void CLine::MoveTo(CDC *, CPoint P)
{P0 = P;
}void CLine::LineTo(CDC *pDC, CPoint tP)
{P1 = tP;double eps = 1e-6;CPoint p, t;if (fabs(P0.x - P1.x) < eps){if (P0.y > P1.y){t = P0;P0 = P1;P1 = t;}for (p = P0; p.y < P1.y; p.y++){pDC->SetPixel(round(p.x), round(p.y), RGB(0.0, 0.0, 0.0));}}else{double k, d;k = (P1.y - P0.y)*1.0 / (P1.x - P0.x);if (k > 1.0){if (P0.y > P1.y){t = P0;P0 = P1;P1 = t;}d = 1 - 0.5*k;for (p = P0; p.y < P1.y; p.y++){pDC->SetPixel(round(p.x), round(p.y), RGB(0.0, 0.0, 0.0));if (d >= 0){p.x++;d += 1 - k;}else{d += 1;}}}else if (k >= 0 && k <= 1.0){if (P0.x > P1.x){t = P0;P0 = P1;P1 = t;}d = 0.5 - k;for (p = P0; p.x < P1.x; p.x++){pDC->SetPixel(round(p.x), round(p.y), RGB(0.0, 0.0, 0.0));if (d >= 0){d -= k;}else{p.y++;d += 1 - k;}}}else if (k < 0 && k >= -1.0){if (P0.x > P1.x){t = P0;P0 = P1;P1 = t;}d = -0.5 - k;for (p = P0; p.x < P1.x; p.x++){pDC->SetPixel(round(p.x), round(p.y), RGB(0.0, 0.0, 0.0));if (d > 0){p.y--;d -= 1 + k;}else{d -= k;}}}else if (k < -1.0){if (P0.y < P1.y){t = P0;P0 = P1;P1 = t;}d = -1 - 0.5*k;for (p = P0; p.y > P1.y; p.y--){pDC->SetPixel(round(p.x), round(p.y), RGB(0.0, 0.0, 0.0));if (d >= 0){d -= 1;}else{p.x++;d -= 1 + k;}}}}P0 = tP;
}

五、完整代码

下载链接,程序可直接运行

本文发布于:2024-02-02 12:15:59,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170684736043733.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:斜率   线段   计算机   图形学
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23