『算法原理』绘制&填充几何图形

文中列举demo下载: (右键点击另存)

  1. point.cpp
  2. line.cpp
  3. triangle0.cpp
  4. triangle1.cpp
  5. triangle_color.cpp

本文内容尽量通俗, 避免生僻术语, 主要偏重于原理, 里面的算法尽量简单, 建议先下载列举demo运行尝试

Demo 运行之后会在可执行文件工作目录下生成一张结果图(bmp格式)

1. 绘制一个点

把屏幕比喻成一个画布, 我们把画布上的某个点设置为某个颜色, 就达到目的了.

绘制一个点的核心代码:

Demo 查看: point.cpp 里面用到一个 叫 void saveWithBMP_RGBA(const void* bitmapData, int w, int h, const char* filename);  的函数将绘制结果保存到一个bmp 文件中方便查看绘制结果, 下面的Demo 也是如此, 不在赘述

2. 绘制一条线

 

瞎思考:

  • 如果两个点在一条水平线或者竖直线上, 一次循环画点即可完成
  • 如果这条直线y方向上的增量小于x方向上的增量, 是否可以在循环画点的时候给 y 乘以一个系数
  • 同上, 如果这条直线y方向上的增量小于x方向上的增量, 是否可以以y方向循环画点, x 乘以一个系数
  • 参考某些经典算法如 DDA Bresenham  等

代码样例1:

代码样例2:

上面的瞎写的代码稍微优化一下得到:

Demo 查看: line.cpp. 有兴趣的同学可以网上另外找一些经典算法, 会有很多优化手段, 这里随意写的, 看看效果就行.

3. 绘制&填充三角形

瞎思考:

  • 如果我们要画一个不旋转的矩形, 我们会怎么画呢? 是否几个循环画一下线就完事?
  • 如果一个三角形是标准的上三角或者下三角呢 ?

是否有一个大胆的想法:

在有限的画布像素中, 我们从上往下可以把它看成一堆直线连接起来的图形?

根据这个方法可以写出代码如下:

示例代码: triangle0.cpp

  • 如果一个三角形不是上三角或者下三角呢 ?

    我们可以将这类三角形分成上下两个部分, 然后就形成了两个满足条件的三角形
    示例代码: triangle1.cpp

    示例图:

4. 绘制&填充多边形

通常一个平面包含很多个顶点, 例:

如上图, 总共有十个顶点 A,B,C,D,E, a,b,c,d,e (对应索引 0 ~ 9)

我们根据这十个顶点, 然后给定索引就可以让它们以三角形的形式连接成我们想要的几何形状了.

比如上图, 我们只需要给定索引如下即可

 

之后根据索引给出的顺序, 绘制上面列举的所有三角形, 即可完成多边形的绘制, 这里就不单独撸demo了. 请发散思维, 根据前面给出的demo实现多边形填充

 


5. 颜色填充

 

5.1 点和线 颜色填充

  • 单个像素点颜色填充: 上面例子已经有了, 直接把那个像素设置为给定的颜色即可
  • 线颜色填充: 纯色填充上面已经有例子了, 如果是渐变色填充, 取两边顶点的颜色按距离进行插值即可

5.2 三角形颜色填充

瞎思考:

  • 如果一个三角形是标准的上三角或者下三角呢 ?如图描述, 我们依然可以转换为直线上的颜色计算, 我们可以通过 A、B 的颜色 算出 c 的颜色 同理可以计算得到 b 的颜色 有了 c 和 b 的颜色就够了 ! 有没有发现 c, D, b  在一条水平线上? 是不是又转换成了一个已知问题 ? 于是对于 △ABC 内的任意一点像素的颜色, 就这样算出来了.
  • 如果是任意三角形呢 ?

    参考上面任意三角形绘制原理哦

关键部分代码:

完整代码: triangle_color.cpp
运行结果示例图:

 

文中列举demo下载:

  1. point.cpp
  2. line.cpp
  3. triangle0.cpp
  4. triangle1.cpp
  5. triangle_color.cpp

本文链接:  http://xege.org/draw_geometry_and_fill_colors.html

Author: wysaid

文章分类 教程 标签: ,