📄 base8.htm
字号:
s=SinD(Theta); <br>
//求用度指定的角的正弦 <br>
A[m1,m1]=c;<br>
A[m1,m2]=s;<br>
A[m2,m2]=c;<br>
A[m2,m1]=-s;<br>
} <br>
Rotate3D函数为实现一个向量的旋转生成一个矩阵。我们可以看到在定义此函数时,用到了函数库中前面定义的更简单的函数,使得函数定义十分容易。可见建立一个完备的函数库使用起来会非常方便,而且通过函数由简单到复杂的逐步建立,生成一个函数库并不是一件难事。读者可参照上面讲到的步骤,根据自己绘图的需要,由简单的数学函数、矩阵生成开始,通过这些很小的函数去堆积成具有很强功能的函数。<br>
<br>
上一节我们介绍了数学函数库的建立方法,这里,让我们再来看一下如何建立图形函数库。<br>
图形函数库的建立要比数学函数库的建立复杂一些,它不但要求包括画点画线的函数,还要解决信息的存储问题,颜色的调用和对平面作复杂的数学模型转换。<br>
建立图形函数库也主要应从以下几个方面入手:<br>
预置一个数组,确定转换信息存储地址所需要的偏移量。这样可以减少绘图时的计算量。<br>
预制调色板数组,并在寄存器中指定合适的显示内存地址。并结合显示硬件编制合适的色彩调用程序。还应注意屏幕的初始化。<br>
定义一些最基本的图形绘制函数,如画点、画线、画矩形、圆形等。<br>
最复杂的是最后一步,你可能需要建立基于复杂的数学公式的图形转换,对前面提到过的那些图形特殊处理,甚至需要构造复杂的数学曲面。当然这样,你在建立数学函数库时也要费一番功夫。<br>
当然,如果你只是做一个很简单的图形设计,则完全没必要这么麻烦,你可以不必下大功夫去管信息的合理存储,色彩的调用(注意,屏幕的初始化却是必不可少的)。你只需构造几个简单的画图函数,其余工作在主函数中以简练的语言来实现。<br>
这里,我们来看一个初始化屏幕的例子:<br>
void InitGrapics( )<br>
{kk1}<br>
Xres=MaxXres;<br>
Yres=MaxYres;<br>
PreCalc( ); <br>
//预制信息存储偏移量的数组<br>
SetMode(19); <br>
//设置显示方式<br>
ClearPalette(Color); <br>
//将调色板中红、绿、蓝的值清零<br>
InitPalette(Color); <br>
//调整颜色强度,设置颜色标志<br>
SetPalette(Color); <br>
//将定义颜色传送到寄存器 <br>
}<br>
对于简单图形的实现,在图像编程一章中已作了介绍,这里不再另外讲解。<br>
以上我们介绍了三维图形设计的基本概念和常用方法,下面我们将以几个程序来看一下绘制三维图形常用的一些语句和算法等。首先我们来看一下这个小程序,运行下面这个程序将绘出一个具有立体感的网状图形:<br>
include<graphics.h><br>
main()<br>
{kk1}<br>
int graphdriver=DETECT,graphmode;<br>
int a=100;<br>
int b=10;<br>
int x,y;<br>
int i;<br>
initgraph(&graphdriver,&graphmode,"");<br>
x=y=a;<br>
for(i=0;i<11;i++)<br>
{kk1}<br>
asteroid(x,y);<br>
x+=b;<br>
y-=b;<br>
}<br>
x=y=a;<br>
for(i=0;i<11;i++)<br>
{kk1}<br>
asteroid(x,y);<br>
x-=b;<br>
y+=b;<br>
}<br>
getch();<br>
closegraph();<br>
asteroid(x,y)<br>
int x,y;<br>
{kk1}<br>
line(320,100-y/2,320-x,100);<br>
line(320-x,100,320,100+y/2);<br>
line(320,100+y/2,320+x,100);<br>
line(320+x,100,320,100-y/2);<br>
} <br>
下面我们再来看一下这个椭圆子程序的设计,根据数据关系式,用C语言编写椭圆子程序,清单如下:<br>
#define rad 3. 1415926/180<br>
void elipse (x0,y0,a,b,start,bfe,efe,inc)<br>
int inc;<br>
float x0,y0,a,b,start,bfe,efe;<br>
{kk1}<br>
float sta,bf,ef,dt,t,ang,sum,xb,yb,x,y;<br>
int i;<br>
sta=start*rad; // 角度化为弧度<br>
ef = efe*rad;<br>
bf=bfe*rad;<br>
dt=(ef-bf)/(float)inc; //dt为分段间隔角<br>
t=sta+bf;<br>
xb=x0+a*cos(t)+(a-b)*sin(bf)*sin(sta);<br>
//计算起点坐标<br>
yb=yo+a*sin(t)-(a-b)*sin(bf)*cos(sta);<br>
move(xb,yb); //移到起点处<br>
for (i=1;i<=inc;i++)<br>
{kk1}<br>
ang=bf+i*dt;<br>
sum=sta+ang; //计算椭圆上动点的坐标<br>
x=xo+a*cos(sum)+(a-b)*sin(ang)*sin(sta);<br>
y=yo+a*sin(sum)-(a-b)*sin(ang)*cos(sta);<br>
drawto(x,y); }} //分段画椭圆<br>
当start=0度时,画水平椭圆;<br>
当start=60度时,画正面椭圆;<br>
当start=120度时,画侧面椭圆;<br>
<br>
这一章里,我们以C语言三维图形设计为主,介绍了三维图形设计的基本概念,各种造型技巧以及C语言实现方法。由于三维图形在转换过程中要用到大量的数学模型记公式,我们可以看到用编程的方法实现起来,并不是一件易事。虽然,在建立了完备的图形程序库后,对于一个实体建模,可以用很少的语句在主函数中实现。但构造程序库的工作量也不小,而且,若要实现更复杂的图形处理,就需要增加程序库中的函数。可见,用编程来建立三维世界,不但费时费力,也极不方便。<br>
随着计算机图形技术的发展,三维图形处理软件越来越多,功能也越来越强。通过这些可视化软件,我们可以很方便的做出各种各样的三维物体,并对其随心所欲的进行移动、旋转、变形。你也可以把更多的时间花在图形效果的处理,制做出精美的三维立体图像。在下一章里,我们就会看到如何用这些软件制作动人的计算机艺术画像。</p>
<p>
<a href = "#top">返回到上面</a>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -