home *** CD-ROM | disk | FTP | other *** search
- REM name: lnptang.cdl
-
- REM date: 092987 simon izraelevitz
-
- REM task: creates a line thru a position at a given angle
- REM from a base line or the x axis
-
- REM -----------------------------------------------
-
- CLEAR
- ARRAY vm[9]
- PI = 3.1415926536
- radang = 180/PI
- accuracy = .00005
- posdef = 2
- ang = 30
-
- :ind_ln
- REM *** get base line
- noline = 0
- length = 5
- SET mask,2
- GETENT "Indicate line. Return defaults to the x axis", etype
-
- REM *** get present construction view
- CALL memcpy,vm,0,@CVIEWMAT,0,9
-
- ON (@KEY + 3) GOTO exit,exit,def_alpha,
- p1wx = @FLTDAT[0]
- p1wy = @FLTDAT[1]
- p1wz = @FLTDAT[2]
- p2wx = @FLTDAT[3]
- p2wy = @FLTDAT[4]
- p2wz = @FLTDAT[5]
- dx = p2wx - p1wx
- dy = p2wy - p1wy
- dz = p2wz - p1wz
- length = sqrt(dx*dx + dy*dy + dz*dz)
-
- REM *** map line to view coord.
- CALL xfmwv,vm,p1wx,p1wy,p1wz,p1vx,p1vy,p1vz
- CALL xfmwv,vm,p2wx,p2wy,p2wz,p2vx,p2vy,p2vz
-
- REM *** define line slope and coeffs.
- dx = p2vx - p1vx
- dy = p2vy - p1vy
- CALL atan3,dy,dx,alpha
- alpha = alpha*radang
- IF (alpha >= 180)
- alpha = alpha - 180
- a1 = dy
- b1 = -dx
- c1 = -(p1vy*b1 + p1vx*a1)
- GOTO ind_pt
-
- :def_alpha
- alpha = 0
- noline = 1
-
- :ind_pt
- REM *** get position
- GETPOS "Indicate base position",posdef
- ON (@KEY + 3) GOTO exit,ind_ln,ind_pt,
- posdef = @KEY
-
- p1wx = @XWORLD
- p1wy = @YWORLD
- p1wz = @ZWORLD
-
- REM *** map position to view
- CALL xfmwv,vm,p1wx,p1wy,p1wz,p1vx,p1vy,p1vz
-
- :get_ang
- REM *** get angle from base line
- GETFLT "Enter angle from base line (%f) = ",ang,ang
- ON (@KEY + 3) GOTO exit,ind_pt,
- IF noline
- GOTO from_pt
-
- REM *** solution line coeffs
- p2vx = p1vx + cos(alpha + ang)
- p2vy = p1vy + sin(alpha + ang)
- a2 = p2vy - p1vy
- b2 = -(p2vx - p1vx)
- c2 = -(p1vy*b2 + p1vx*a2)
-
- REM *** compute intersection point.
-
- det = a1*b2 - a2*b1
- IF (abs(det) <= accuracy)
- GOTO end_pt
- dinv = 1/det
- ipvx = (b1*c2 - b2*c1)*dinv
- ipvy = (a2*c1 - a1*c2)*dinv
- ipvz = p1vz
-
- :end_pt
- dx = p1vx - ipvx
- dy = p1vy - ipvy
- magn = sqrt(dx*dx + dy*dy)
- IF (abs(magn) <= accuracy)
- GOTO from_pt
- dx = dx/magn
- dy = dy/magn
- p2vx = ipvx + dx*length
- p2vy = ipvy + dy*length
- p2vz = p1vz
- GOTO map_sol
-
- :from_pt
- ipvx = p1vx
- ipvy = p1vy
- ipvz = p1vz
- p2vx = ipvx + cos(alpha + ang)*length
- p2vy = ipvy + sin(alpha + ang)*length
- p2vz = ipvz
-
- :map_sol
- REM *** map solution line to world coord.
- CALL xfmvw,vm,ipvx,ipvy,ipvz,ipwx,ipwy,ipwz
- CALL xfmvw,vm,p2vx,p2vy,p2vz,p2wx,p2wy,p2wz
-
- LINE ipwx,ipwy,ipwz,p2wx,p2wy,p2wz
- GOTO ind_ln
-
- :exit
- SET mask
- EXIT