数与图(2)
在上一篇文章『数与图(1)』中我们遗留下一个问题,当坐标轴的原点不在画布范围内时,程序会报错,现在我们就来解决这个问题。
“原点不在画布范围内”可能有三种不同的情况:
(1)x轴原点不在画布范围内,而y轴原点在画布范围内;
(2)y轴原点不在画布范围内,而x轴原点在画布范围内;
(3)x轴和y轴的原点都不在画布范围内。
我们需要针对不同的情况分别加以处理。
一、代码变化
在上一篇文章中,我们创建了两个有返回值过程、五个无返回值过程,还有两个事件处理程序,如图1所示,图中左侧的代码将保持不变,右侧上面是新增代码——两个无返回值过程:“画无原点横线”及“画无原点竖线”。在符合条件时,这两个过程将替代左侧的“画横线”、“画竖线”过程。另外,还要修改两个无返回值过程“标注坐标轴”及“绘制坐标系”,如图1右下角所示。
图1 实现新功能所需的代码
下面我们逐一加以解释。
二、新增过程
1、画无原点横线
注意:无原点横线,发生在“y”轴原点在画布之外时。此时,x轴位于画布绘图区的底部边界,对应画布上的y坐标等于“绘图区高度+边距”。与“画横线”过程最大的不同是两个循环语句,其中循环变量的起始值、终止值分别为“0”和“最大Y-最小Y”,相应的,画横线时采用的y坐标,其计算方法也有所不同,从绘图区底部以“辅间距”或“主间距”的高度向上递增,具体代码如图2所示。
图2 无返回值过程——画无原点横线
2、画无原点竖线
与“画无原点横线”不同的是,“画无原点竖线”发生在x轴原点不在画布范围内时。此时,y轴位于画布绘图区的左侧边界,其对应的画布x坐标等于“边距”。同样,循环语句中循环变量的起始值、终止值分别为“0”和“最大X-最小X”,循环变量的增量为“辅间距”及“主间距”,代码如图3所示。
图3 无返回值过程——画无原点竖线
三、修改现有过程
1、标注坐标轴
这项修改相对简单,只要为过程添加一个参数“有原点”,该参数的取值为逻辑值“真”或“假”,仅当x轴和y轴的原点都不在画布范围内时,该值为“假”,其余情况其值为“真”。解读代码可以知道,当两个坐标轴的原点都在画布之外时,不标注原点的“0”,代码如图4所示。
图4 修改过程——标注坐标轴
2、绘制坐标系
对这一过程的修改稍显复杂,但其中的道理并不复杂,只要搞清楚其中的条件语句即可。条件语句的四个分支,按照自上而下的顺序,分别对应以下四种情况:
(1)两个坐标轴的原点均在画布内;
(2)x轴原点在画布内,y轴原点在画布外,此时x轴位于绘图区底部,用“画无原点横线”过程替代“画横线”过程;
(3)x轴原点在画布外,y轴原点在画布内,此时y轴位于绘图区左边界,用“画无原点竖线”过程替代“画竖线”过程;
(4)两个坐标轴的原点均在画布以外,用两个新创建的过程替代“画横线”、“画竖线”过程。
此外,针对不同的情况,分别调用“标注坐标轴”过程。注意修改原有调用“标注坐标轴”语句块的参数顺序,由于该过程添加了新的参数,因此原有参数自动向前移动,因此位置是错的。具体代码如图5所示。考虑到图片的尺寸,图中部分代码被折叠起来。
图5 修改过程——绘制坐标系
五、测试
选择三组不同的数据对程序进行测试,测试结果如图6所示。其中左图中x轴原点不在画布内,中图y轴原点不在画布内,右图两轴的原点均不在画布内。
图6 程序的测试结果
通过以上两篇文章,我们介绍了绘制坐标系的一般方法,其中部分代码尚有进一步优化的可能性,希望有兴趣的读者自行加以改进。下一篇文章将介绍在坐标系中绘制函数图像,敬请期待。