1 综述
针对《计算机图形学》课程开发的几何图形处理系统实现的功能包括:在UI界面中通过鼠标点击拖拽等方式可视化地输入二维图形的功能;编辑最近输入的二维图形的功能;裁剪直线的功能,支持的图形包括任意涂鸦、直线、矩形、圆、椭圆、多边形、填充多边形、B样条曲线、Bezier 曲线;变换二维图形的功能;用文件/路径选择器将绘制出来的图形保存为图像以及选取载入显示图片文件的存储和读取二维图形的功能;载入并显示一个 OFF 格式的三维模型的功能;
此外,系统中还支持选择画笔的形状大小,颜色,选择多边形填充颜色,清理画板,并提供了一个美观的用户使用界面。
在实现算法时要考虑许多实际的问题,在图形系统的画布上建立坐标系,由于在画布上是以像素的形式呈现、编辑以及输入输出图形的,所以图形绘制算法的一个主要的任务是将图形的数学表达式尽可能准确地绘制成画布上的像素点。
2 算法介绍
2.1 二维图形的输入功能
2.1.1 直线
输入直线(或者线段)采用数值差分分析DDA算法,主要过程是,鼠标点击确定直线的起点,然后拖动鼠标实时改变直线的方向,对每一个时刻,鼠标起点与目前所在的点就确定了当前的直线。由两点坐标就可以求出直线方程。求出直线的斜率,对于具有不大于 1 的正斜率的直线,在 x 方向以单位间隔取样,以增量形式顺序计算每个 y 的值,依据该增量在 y 轴寻找最接近路径的整数值,这样选取坐标轴的目的是为了取较多的样本点,绘制出来的像素点不会过于稀疏.对于具有大于 1 的斜率的直线,在 y 方向以单位间隔取样算 x 方向的增量,在 x 方向取最接近直线的点;对于具有绝对值不大于 1 的负斜率的直线,在 x 方向取增量;对于具有绝对值大于 1 的负斜率的直线,在 y 方向取增量。
2.1.2 矩形
矩形的绘制只要确定对角的两个顶点就比较容易完成。在确定两顶点的坐标后,由于矩形的边都是水平或垂直的线,与像素点重合,故只需要单个坐标轴递增绘出即可。
2.1.3 圆/椭圆
圆和椭圆的绘制应用中点生成算法。中点生成算法可以避免平方根运算,直接采用像素与圆距离的平方作为判决依据,通过检验两个候选像素中点与圆周边界的相对位置关系,即圆周边界内或圆周边界外,来选择像素. 首先通过鼠标点击和拖动可以确定圆心和圆边界上的某个点,进而可以确定任意时刻的圆半径以及圆函数,以圆函数作为决策参数,将候选像素的中点位置的数据代入圆函数中,依据函数符号来判断其与圆的相对位置关系。若以圆心为原点建立坐标轴,考虑不同象限内圆弧的生成,结合候选像素中点在圆函数计算得的符号决定保留低像素还是高像素,椭圆也可以采用类似的算法。
由于圆和椭圆的对称性,椭圆可以只考虑一个象限内的生成,而圆可以只考虑 1/4 象限的生成,剩下的部分通过对称运算来节省计算量。
由圆的方程
得到判定函数 fcirc(x,y) < 0 时点 (x , y)