tdinit
Defines eye position, line of sight, up direction, and stereo flag for selected TDPACK routines.
Available in version 4.3.1 and later.
Prototype
procedure tdinit ( eye [3] : float, origin [3] : float, orient [3] : float, otep [1] : float )
Arguments
eyeArray of X, Y, Z values defining the position of the eye, (if a single view is being drawn), or of a point midway between the two eyes (if a stereo view is being drawn).
originArray of X, Y, Z values defining the position of the point the eye is looking at. That point defines the origin of the XY projection plane.
orientArray of X, Y, Z values defining the position of the third point needed to completely specify the orientation of the projection plane.
otep("Offset To Eye Position") a float scalar which should be set to non-zero if and only if a stereo view is desired.
Description
This initialization routine is part of the low-level TDPACK package, which is a group of Fortran and C callable routines for projecting objects from a 3-dimensional coordinate system having U, V, and W axes to a 2-dimensional projection plane having X and Y axes and/or for drawing the projections of those objects. This can be referred to somewhat loosely as "drawing objects in three dimensions".
Please see the documentation on TDINIT for a full description of this procedure.
See Also
Initialization routines: tdpara, tdclrs
Parameter access routines: tdgetp, tdgtrs, tdsetp, tdstrs
Point transforming routines: tdprpt, tdprpa, tdprpi
Line drawing routines: tdline, tdlndp, tdlnpa, tdlpdp, tdcurv, tdcudp
Grid drawing routines: tdgrds, tdgrid
Label drawing routines: tdlbls, tdlbla, tdlblp, tdplch
Surface drawing routines: tddtri, tdstri, tditri, tdmtri, tdttri, tdctri, tdotri, tdsort
Simplified interface routines: tdez2d, tdez3d
Examples
The following code produces a sample 3D scatter plot:
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
;
; Function for generating random data.
;
function dsrnd1(ifrst,nextn)
begin
MPLIER = 16807
MODLUS = 2147483647
MOBYMP = 127773
MOMDMP = 2836
JSEED = 123456789
if (ifrst .eq. 0) then
nextn = JSEED
ifrst = 1
end if
hvlue = nextn / MOBYMP
lvlue = nextn % MOBYMP
testv = MPLIER*lvlue - MOMDMP*hvlue
if (testv .gt. 0) then
nextn = testv
else
nextn = testv + MODLUS
end if
return((1.*nextn)/(1.*MODLUS))
end
begin
N = 1331
NEAREST = 500
MTRI = 150000
FARTHER = N - NEAREST
;
; Create our input and work arrays.
;
x = new(N,float)
y = new(N,float)
z = new(N,float)
rtri = new((/MTRI,10/),float)
rtwk = new((/MTRI,2/),float)
;
; Fill up the dummy input arrays.
;
ifrst = 0
nextn = 0
do i = 0,N-1
x(i) = dsrnd1(ifrst,nextn)
y(i) = dsrnd1(ifrst,nextn)
z(i) = dsrnd1(ifrst,nextn)
end do
;
; Specify the reference point from which we want to find the NEAREST
; nearest points.
;
px = 0.5
py = 0.5
pz = 0.5
wks = gsn_open_wks("ps","scatter")
;
; Set some TDPACK parameters and initialize. These four are viewport
; specifiers.
;
tdsetp("VPB", 0.09)
tdsetp("VPT", 0.99)
tdsetp("VPL", 0.11)
tdsetp("VPR", 1.00)
tdinit((/4.6, 3.0, 3.3/), (/0.5, 0.5, 0.5/), (/0.5, 0.5, 2.7/), 0.)
;
; Set up some colors using the standard TDPACK entry for that.
;
tdclrs(wks, 1, 0., 0.8, 8, 37, 8)
;
; Define style indices for shades of gray, green, and red.
;
tdstrs(1, 8, 37, 8, 37, 1, 1, 0, 0.05, 0.05, 0.)
tdstrs(3, 8, 37, 68, 97, 1, 1, 0, 0.05, 0.05, 0.)
tdstrs(4, 8, 37, 98, 127, 1, 1, 0, 0.05, 0.05, 0.)
;
; Store the indices of the nearest points in npts and the complement
; of that set (with respect to the entire input dataset) in mpts.
;
npts = new(NEAREST,integer)
mpts = new(FARTHER,integer)
npts(0) = shgetnp(px,py,pz,x,y,z,0)
do i=2,N
if (i .le. NEAREST) then
npts(i-1) = shgetnp(px,py,pz,x,y,z,1)
else
mpts(i-1-NEAREST) = shgetnp(px,py,pz,x,y,z,1)
end if
end do
;
; Plot the near points in green.
;
ntri = 0
dotsize = 0.02
do i = 0, NEAREST-1
tdmtri(-5, (/x(npts(i)-1), y(npts(i)-1), z(npts(i)-1)/), dotsize, \
rtri, ntri, 4, (/0.,0.,0./),(/1.,1.,1./))
end do
;
; Plot the farther points in gray.
;
do i = 0, FARTHER-1
tdmtri(-5, (/x(mpts(i)), y(mpts(i)), z(mpts(i))/), dotsize, \
rtri, ntri, 1, (/0.,0.,0./),(/1.,1.,1./));
end do
;
; Mark the reference point in red.
;
tdmtri(-5,(/px,py,pz/),1.2*dotsize,rtri,ntri,3,(/0.,0.,0./),(/1.,1.,1./))
;
; Order and draw triangles.
;
itwk = tdotri(rtri, ntri, rtwk, 0)
tddtri(wks,rtri, ntri, itwk)
;
; Draw a box around the perimeter.
;
tdgrds(wks,(/0., 1., 0./), (/1., 0., 1./), (/-1., -1., -1./),11,0)
tdgrds(wks,(/0., 1., 0./), (/1., 0., 1./), (/-1., -1., -1./),11,1)
frame(wks)
end
Also, see the examples on the three-dimensional graphics
applications page.