rem C_2Ln.cdl rem Copy Right by International Technology Transfer Corp. rem revision 1.0-7/30/99 rem 1. Select 2 Lines rem 2. Specify Radius rem 3. Draw circle tangent to 2 Lines rem ******************************************************************** clear array mtx[9] array mtx1[9] acc = 0.00001 rem If need higher accuracy, decrease acc value. rad=1.0 :start getent "Select First Line",enttype on (@key + 3) goto exit, start, if (enttype!=2) goto start x1 = @fltdat[0] y1 = @fltdat[1] z1 = @fltdat[2] x2 = @fltdat[3] y2 = @fltdat[4] z2 = @fltdat[5] cx1 = @xcursor cy1 = @ycursor :second getent "Select Second Line",enttype on (@key + 3) goto exit, start, second, if (enttype!=2) goto second x3 = @fltdat[0] y3 = @fltdat[1] z3 = @fltdat[2] x4 = @fltdat[3] y4 = @fltdat[4] z4 = @fltdat[5] cx2 = @xcursor cy2 = @ycursor dx1 = x2 - x1 dy1 = y2 - y1 dz1 = z2 - z1 dx2 = x4 - x3 dy2 = y4 - y3 dz2 = z4 - z3 if (abs(dx1-dx2)>acc || abs(dy1-dy2)>acc || abs(dz1-dz2)>acc) goto getrad pause "Two Lines Are Parallel" redraw goto start :getrad getflt "Enter Radius", rad ,rad on (@key + 3) goto exit, second, , rem *********************************************************************** rem define view by 3 points rem *********************************************************************** :view dx=x2-x1 dy=y2-y1 dz=z2-z1 r=sqrt(dx * dx + dy * dy + dz * dz) if (r@lastvw) goto loop2 getview vnum,mtx1 if (mtx[0]!=mtx1[0] || mtx[1]!=mtx1[1] || mtx[2]!=mtx1[2]) goto loop2 if (mtx[3]!=mtx1[3] || mtx[4]!=mtx1[4] || mtx[5]!=mtx1[5]) goto loop2 if (mtx[6]!=mtx1[6] || mtx[7]!=mtx1[7] || mtx[8]!=mtx1[8]) goto loop2 goto loop1 :loop2 view vnum,mtx[0],mtx[1],mtx[2],mtx[3],mtx[4],mtx[5],mtx[6],mtx[7],mtx[8] call xfmwv,mtx,x1,y1,z1,vx1,vy1,vz1 call xfmwv,mtx,x3,y3,z3,vx3,vy3,vz3 call xfmwv,mtx,dx1,dy1,dz1,vdx1,vdy1,vdz1 call xfmwv,mtx,dx2,dy2,dz2,vdx2,vdy2,vdz2 vr1 = sqrt( vdx1 * vdx1 + vdy1 * vdy1 ) vr2 = sqrt( vdx2 * vdx2 + vdy2 * vdy2 ) i=0 flag1=1 flag2=1 min=999999999.0 :loop vxx1 = vx1 + flag1 * vdy1 / vr1 * rad vyy1 = vy1 - flag1 * vdx1 / vr1 * rad vxx3 = vx3 + flag2 * vdy2 / vr2 * rad vyy3 = vy3 - flag2 * vdx2 / vr2 * rad bunbo = vdx2 * vdy1 - vdx1 * vdy2 t = (vdx2 * (vyy3 - vyy1) - vdy2 * (vxx3 - vxx1)) / bunbo x = vxx1 + vdx1 * t y = vyy1 + vdy1 * t if (i==0) flag1=-1 if (i==1) flag2=-1 if (i==2) flag1=1 call xfmvw,mtx,x,y,vz1,tx,ty,tz call xfwv,tx,ty,tz,tx,ty,tz dist = sqrt((cx1-tx)*(cx1-tx)+(cy1-ty)*(cy1-ty))+sqrt((cx2-tx)*(cx2-tx)+(cy2-ty)*(cy2-ty)) if (dist>=min) goto minchk vx = x vy = y vz = vz1 min = dist rem Compare 4 circles :minchk if ((i=i+1)<4) goto loop circle vx,vy,vz,rad,vnum :exit clear mtx clear mtx1