原型 extern int far d3project (int points, ProjParameters far *params, D3Point far *inary, D2Point far *outary)
輸入 numpoints - 被投影的點數
params - 包含投影參數的ProjParameters型指針
eyex, eyey, eyez - 取景器的三維位置
scrd - 從取景器到投影屏的距離
theta - 從三維坐標X軸正向到取景器方向的角度
phi - 從三維坐標Z軸正向到取景器方向的角度
inary - 指向包含投影點的D3Point型指針
輸出 成功返回1,任何一點失敗返回0
outary - 指向投影后的D2Point型點數組
用法
D3PROJECT將inary中指定數目(numpoints)的三維點按照params指定的參數投影成二維點(存儲在outary)。此函式假定outary已合適分配。三維空間取景器的位置通過ProjParameters結構中的eyex, eyey,eyez給出。取景器面向的方向由套用球坐標系的ProjParameters結構中的scrd,theta,phi確定。一個平行於實坐標系的虛坐標系位於取景器的位置。scrd為從取景器到投影螢幕(也就是當前定義的顯示器上的視口)中心的距離。Theta為從虛軸X到投影螢幕在X-Y平面上的角度。正的角度表示在X-Y平面上順時針旋轉。最後,相對於X-Y平面的俯仰角通過phi給出。正的角度表示在平面以上,負的表示在平面以下。
如果有一個點投影到取景器的後面,也就是取景器背向投影螢幕的一側,D3PROJECT返回0表示有一個或更多的操作失敗點。失敗點的X、Y返回值最大可達到32768個以使得他們很容易被識別出來。
另查 D3ROTATE, D3TRANSLATE, D3SCALE, SETVIEW
例子
/* shows d3project works */
#include <stdlib.h>
#include <conio.h>
#include "svgacc.h"
D2Point plot[8];
void drwcube(void);
void main(void)
{
int vmode,i,dummy;
ProjParameters proj;
D3Point cube[8] = { { 100,-100, 100},
{ 100,-100,-100},
{ 100, 100,-100},
{ 100, 100, 100},
{-100,-100, 100},
{-100,-100,-100},
{-100, 100,-100},
{-100, 100, 100}};
vmode = videomodeget();
if (!whichvga())
exit(1);
if (whichmem()<512)
exit(1);
res640();
proj.eyex = -1040;
proj.eyey = -600;
proj.eyez = -1200;
proj.scrd = 1700;
proj.theta = 30;
proj.phi = 45;
dummy = d3project(8,&proj,cube,plot);
drwcube();
getch();
videomodeset(vmode);
}
void drwcube(void)
{
int i;
for(i=0;i<=2;i++)
DRWLINE(1,10,plot[i].x,plot[i].y,plot[i+1].x,plot[i+1].y);
drwline(1,10,plot[3].x,plot[3].y,plot[0].x,plot[0].y);
for(i=4;i<=6;i++)
drwline(1,10,plot[i].x,plot[i].y,plot[i+1].x,plot[i+1].y);
drwline(1,10,plot[7].x,plot[7].y,plot[4].x,plot[4].y);
for(i=0;i<=3;i++)
drwline(1,10,plot[i].x,plot[i].y,plot[i+4].x,plot[i+4].y);
return;
}