本文所讲的内容已经开源,你可以在 这里 找到源代码。
前面我们介绍了三维图形的轴测投影画法,以及使用斜二测图画常见的三维多面体。本文介绍使用正等测图画常见的三维带圆弧的图形。
圆台
在圆柱、圆锥、圆台中,我们从圆台开始,因为圆柱、圆锥其实是圆台的一种特例。
这里,我们规定圆台上下两个面的半径(r,R)存在固定的比例,比如(r = R * 0.5)。
在输入的两点 A、B 中,我们以 A 点作为小圆的圆心,规定 B 点作为大圆最右(左)侧点,假设圆台高为 h,那么显然有:
那么,三维空间的圆,映射到二维平面,应该是什么图形呢?
根据正等测投影变换,有:
这里 (X,Y) 是圆的二维映射上的点坐标,所以有:
对于平行于x、y 平面的圆,有 ,所以:
所以在正等测投影变换下,平行于x、y 平面的圆的二维映射是一个椭圆,且其长轴(平行于 x 轴)半径与圆的半径 r 相等,短轴半径为 。
圆锥
当圆台上下两个面的半径(r,R)的比例为 0 时,即 r = 0 时,就变成圆锥。此时,小圆退化为一个顶点,。其他计算完成沿用圆台的过程就行了。
圆柱
圆柱则更简单,将圆台上下两个面的半径(r,R)的比例设置为 1 即可。
球
在输入的两点 A、B 中,我们以 A 点作为球心,两点距离作为半径(依据在下面说明)。
在画球时,实际上是是画了三个圆心、半径都一样的圆。
在上面我们已经证明 x,y 平面的圆(用平面 切球),其正等测投影是一个椭圆。
我们再取平面,用这个面切取球形成的圆,我们来看看它的正等测投影是什么?
结合投影变换、球方程:
去掉 z,则:
上面第一个式子平方求和,有:
所以这个切面圆的正等测投影其实也是一个圆,并且半径与球的半径相等。
这就是为什么我们在画球时,一般会先直接画一个圆的原因了。另外可以规定输入的 B 点也在这个投影上,所以有“A、B 两点距离就是球的半径”这样的结论。
椭球
椭球有三个轴,分别平行于 x、y、z轴,确定了球心和半径,就可以作图了。
在三个轴中,我们规定有两个轴长是相等的,三个半径分别为:(w, h, h) 。所以椭圆方程为:
在输入的两点 A、B 中,我们以 A 点作为球心,B 点作为切平面 所切椭圆的包围矩形的一个顶点。