rem L_PtC.cdl rem Copy Right by International Technology Transfer Corp. rem revision 1.0-7/30/99 rem Line tangent to Circle clear defopt = 2 array mtx[9] acc = 0.00001 :start getcur "Select Circle", 1, 0 on (@key + 3) goto exit, start, start, x = @xview y = @yview getentxy x, y, enttype if (enttype!=3) goto start vnum = @intdat[8] vx0 = @fltdat[0] vy0 = @fltdat[1] vz0 = @fltdat[2] r = @fltdat[3] getview vnum, mtx :pos getpos "Indicate Point",defopt on (@key + 3) goto exit, start, pos, defopt=@key wx1 = @xworld wy1 = @yworld wz1 = @zworld call xfmwv, mtx, wx1, wy1, wz1, vx1, vy1, vz1 if (abs(vz0-vz1)-acc) goto next2 pause "Point is inside of Circle" redraw goto start :next2 if (ref2>acc) goto next3 a = - r * x01 / ref1 b = - r * y01 / ref1 c = - (a * vx1 + b * vy1) x1 = vx1 + b * r y1 = vy1 - a * r x2 = vx1 - b * r y2 = vy1 + a * r view vnum, mtx[0], mtx[1], mtx[2], mtx[3], mtx[4], mtx[5], mtx[6], mtx[7], mtx[8] vline x1, y1, vz1, x2, y2, vz1, vnum redraw goto start :next3 ref2 = sqrt(ref2) a1 = (-y01 * ref2 - r * x01) / ref1 b1 = (x01 * ref2 - r * y01) / ref1 a2 = (y01 * ref2 - r * x01) / ref1 b2 = (-x01 * ref2 - r * y01) / ref1 x1 = vx0 + a1 * r y1 = vy0 + b1 * r x2 = vx0 + a2 * r y2 = vy0 + b2 * r call xfmvw, mtx, x1, y1, vz0, dummyx1, dummyy1, dummyz1 call xfmvw, mtx, x2, y2, vz0, dummyx2, dummyy2, dummyz2 call xfwv, dummyx1, dummyy1, dummyz1, dummyx1, dummyy1, dummyz1 call xfwv, dummyx2, dummyy2, dummyz2, dummyx2, dummyy2, dummyz2 r1 = (dummyx1 - x) * (dummyx1 - x) + (dummyy1 - y) * (dummyy1 - y) r2 = (dummyx2 - x) * (dummyx2 - x) + (dummyy2 - y) * (dummyy2 - y) view vnum, mtx[0], mtx[1], mtx[2], mtx[3], mtx[4], mtx[5], mtx[6], mtx[7], mtx[8] if (r1 - r2<=0) vline vx1, vy1, vz1, x1, y1, vz1, vnum if (r1 - r2>0) vline vx1, vy1, vz1, x2, y2, vz1, vnum redraw goto start :exit clear mtx