home *** CD-ROM | disk | FTP | other *** search
- REM name: ptsurf.cdl
-
- REM date: 030289 simon izraelevitz
-
- REM task: projects points onto a polygonal surface
-
- REM -----------------------------------------------
-
- CLEAR
- plevel = @LEVEL
-
- :get_level
- GETINT "Enter level number to store new points (%d) = ",plevel,newlevel
- ON (@KEY + 3) GOTO exit,exit,
- LEVELS 1,newlevel
-
- REM *** get point to project
- :ind_pt
- def = 2
- GETPOS "Indicate point to project...", def
- ON (@KEY + 3) GOTO exit,get_level,ind_pt,
- pwx = @XWORLD
- pwy = @YWORLD
- pwz = @ZWORLD
-
- REM *** map to present view
- CALL xfwv,pwx,pwy,pwz,pvx,pvy,pvz
-
- REM *** get polygon to intersect
- :ind_poly
- SET mask,6
- GETENT "Indicate polygon to project to ...", etype
- ON (@KEY + 3) GOTO exit,indln,indarc,
- IF (@INTDAT[10] > 3)
- GOTO error
- p1wx = @FLTDAT[0]
- p1wy = @FLTDAT[1]
- p1wz = @FLTDAT[2]
- p2wx = @FLTDAT[3]
- p2wy = @FLTDAT[4]
- p2wz = @FLTDAT[5]
- p3wx = @FLTDAT[6]
- p3wy = @FLTDAT[7]
- p3wz = @FLTDAT[8]
-
- REM *** map vertices to present view
- CALL xfwv,p1wx,p1wy,p1wz,p1vx,p1vy,p1vz
- CALL xfwv,p2wx,p2wy,p2wz,p2vx,p2vy,p2vz
- CALL xfwv,p3wx,p3wy,p3wz,p3vx,p3vy,p3vz
-
- REM *** compute vector normal to polygon
- v1x = p2vx - p1vx
- v1y = p2vy - p1vy
- v1z = p2vz - p1vz
- v2x = p3vx - p1vx
- v2y = p3vy - p1vy
- v2z = p3vz - p1vz
- CALL cross, v3x,v3y,v3z,v1x,v1y,v1z,v2x,v2y,v2z
-
- REM *** compute polygon plane coefficients
- magn = sqrt(v3x*v3x + v3y*v3y + v3z*v3z)
- a = v3x/magn
- b = v3y/magn
- c = v3z/magn
- d = -(a*p1vx + b*p1vy + c*p1vz)
-
- REM *** project arc point onto plane
- pvz = -(a*pvx + b*pvy + d)/c
-
- REM *** map projection point to world
- CALL xfvw,pvx,pvy,pvz,pwx,pwy,pwz
- POINT pwx,pwy,pwz,0,newlevel
- GOTO ind_pt
-
- :error
- PROMPT "Polygon has more than three vertices..."
- WAIT 2
- GOTO ind_pt
-
- :exit
- SET mask
- EXIT