REM Start of BASIC! Program FN.DEF det(a1,b1,c1,a2,b2,c2, a3,b3,c3) FN.RTN a1*b2*c3+a2*b3*c1+a3*b1*c2- a3*b2*c1-a2*b1*c3-a1*b3*c2 FN.END FN.DEF ellipse(mx,my,px,py,qx,qy) !This draws an ellipse, !fitted into a parallelogram !calculated with !Rytz's construction. !turn p around m with 90 degrees !result is p2 l1=HYPOT(px-mx,py-my) w1=(ATAN2(py-my,px-mx)+PI()/2) p2x=(mx+COS(w1)*l1) p2y=(my+SIN(w1)*l1) !Middle between p2 and q nx=((p2x+qx)/2) ny=((p2y+qy)/2) !radius r=HYPOT(nx-mx,ny-my) !Direction vector p2-q, rvnx=p2x-qx rvny=p2y-qy !normalized l3=HYPOT(rvnx,rvny) rvnx/=l3 rvny/=l3 !Point a ax=nx+rvnx*r ay=ny+rvny*r !Point b bx=nx-rvnx*r by=ny-rvny*r !Direction vector a-m, rvax=ax-mx rvay=ay-my !normalized l4=HYPOT(rvax,rvay) !l4=SQR(rvax*rvax+rvay*rvay+rvaz*rvaz) rvax/=l4 rvay/=l4 !Direction vector b-m, rvbx=bx-mx rvby=by-my !normalized l5=HYPOT(rvbx,rvby) rvbx/=l5 rvby/=l5 !Distance a-q r1=HYPOT(ax-qx,ay-qy) !Distance b-q r2=HYPOT(bx-qx,by-qy) w2=TODEGREES(ATAN2(rvay,rvax)) GR.ROTATE.START w2,mx,my GR.OVAL vd,(mx-r2),(my-r1),(mx+r2),(my+r1) GR.ROTATE.END FN.RTN go FN.END !back face np !READ.DATA -250, 150,-150 !READ.DATA -250,-150,-150 !READ.DATA -200,-150,-150 READ.DATA -300,-200,100 READ.DATA 300,-200,100 !READ.DATA 200,-150,-150 !READ.DATA 250,-150,-150 !READ.DATA 250, 150,-150 !READ.DATA 200, 150,-150 READ.DATA 300, 200,100 READ.DATA -300, 200,100 !READ.DATA -200, 150,-150 !front face np !READ.DATA -250, 150,150 !READ.DATA -250,-150,150 !READ.DATA -200,-150,150 !READ.DATA -200,-100,100 !READ.DATA 200,-100,100 !READ.DATA 200,-150,150 !READ.DATA 250,-150,150 !READ.DATA 250, 150,150 !READ.DATA 200, 150,150 !READ.DATA 200, 100,100 !READ.DATA -200, 100,100 !READ.DATA -200, 150,150 !center data np !READ.DATA 0, 0, 0 !READ.DATA 300, 0, 0 !READ.DATA 0, 300, 0 !READ.DATA 0, 0, 300 !knee bone connected to thigh bone, what order to make lines nlz READ.DATA 5,1,2,3,4,1 np=4 DIM px[np],py[np],pz[np] DIM qx[np],qy[np],qz[np] DIM rx[np],ry[np],rz[np] ! all twenty points being added into a "px" dimensional array FOR i=1 TO np READ.NEXT px[i],py[i],pz[i] NEXT i ! casting the points into a particular order nlz=1 DIM lz[nlz] FOR i=1 TO nlz LIST.CREATE n,llz lz[i]=llz READ.NEXT cnt FOR j=1 TO cnt READ.NEXT lin LIST.ADD llz,lin NEXT j NEXT i !scales the size o the elements 500 increases makes smaller both eoz = goz all objects disappear erx=0 ery=0 erz=1 eox=0 eoy=0 eoz=-500 !scales the size of the elements 1000 decreases makes smaller gox=0 goy=0 goz=-1000 ! invokes the graphics GR.OPEN 255,0,0,0,0,0 GR.SCREEN sx,sy !GR.COLOR 255,255,255,255,1 GR.COLOR 255,0,255,0,1 GOSUB rotate GOSUB draw GR.RENDER ! where your finger is on the screen DO GR.CLS GR.TOUCH tt,tx,ty IF tt&!ott THEN otx=tx oty=ty ELSEIF tt&ott THEN wx+=(ty-oty) wy+=(tx-otx) GOSUB rotate GOSUB draw GOSUB draw2 GR.RENDER ELSE PAUSE 100 ENDIF ott=tt otx=tx oty=ty UNTIL 0 END !Region cut Straight plane wts: l=SQR(grx*grx+gry*gry+grz*grz) grx/=l gry/=l grz/=l l=SQR(erx*erx+ery*ery+erz*erz) erx/=l ery/=l erz/=l !Lot in the normal direction of the plane ! set a value to 0, swap the other two and change the sign in one IF erx=0 THEN er1x=0 er1y=erz er1z=-ery ELSEIF ery=0 THEN er1x=erz er1y=0 er1z=-erx ELSE er1x=ery er1y=-erx er1z=0 ENDIF !1. Normalize solder l=SQR(er1x*er1x+er1y*er1y+er1z*er1z) er1x/=l er1y/=l er1z/=l !2. Lot on normal direction level and 1st lot (cross product) er2x=ery*er1z-erz*er1y er2y=erx*er1z-erz*er1x er2z=erx*er1y-ery*er1x !Is automatically normalized l=SQR(er2x*er2x+er2y*er2y+er2z*er2z) er2x/=l er2y/=l er2z/=l !For straight = Ov-a * Rv den ! Calculate parameter a d1=det(gox-eox,goy-eoy,goz-eoz, er1x,er1y,er1z, er2x,er2y,er2z) d2=det(grx,gry,grz,er1x,er1y,er1z, er2x,er2y,er2z) a=d1/d2 !Intersection on the line: x=gox-grx*a y=goy-gry*a z=goz-grz*a RETURN !EndRegion !Region Array mit Matrix rotate: a=wx*PI()/180 ca=COS(a) sa=SIN(a) !Rotations matrix x x1=1 y1=0 z1=0 x2=0 y2=ca z2=-sa x3=0 y3=sa z3=ca FOR i=1 TO np !Multiply vector with matrix qx[i]=px[i]*x1+py[i]*y1+pz[i]*z1 qy[i]=px[i]*x2+py[i]*y2+pz[i]*z2 qz[i]=px[i]*x3+py[i]*y3+pz[i]*z3 NEXT i a=wy*PI()/180 ca=COS(a) sa=SIN(a) !Rotations matrix y x1=ca y1=0 z1=-sa x2=0 y2=1 z2=0 x3=sa y3=0 z3=ca FOR i=1 TO np !Multiply vector with matrix rx[i]=qx[i]*x1+qy[i]*y1+qz[i]*z1 ry[i]=qx[i]*x2+qy[i]*y2+qz[i]*z2 rz[i]=qx[i]*x3+qy[i]*y3+qz[i]*z3 NEXT i RETURN !EndRegion draw: FOR i=1 TO nlz LIST.SIZE lz[i],nlin LIST.GET lz[i],1,p1 grx=rx[p1]-gox gry=ry[p1]-goy grz=rz[p1]-goz GOSUB wts x2=x y2=y FOR j=2 TO nlin LIST.GET lz[i],j,p2 grx=rx[p2]-gox gry=ry[p2]-goy grz=rz[p2]-goz GOSUB wts GR.LINE vd,x+sx/2,y+sy/2,x2+sx/2,y2+sy/2 elx = x elx2 = x2 ely = x ely2 = x2 x2=x y2=y NEXT j NEXT i GR.RENDER RETURN draw2: z1 = rz[1] z2 = rz[2] z3 = rz[3] zav = (z1+z2+z3)/3 adjust = zav/(elx2+sx/2) factor = 1 - adjust GR.GET.POSITION vd,fx,fy if mx < fx + elx2+sx/2 & px < fx + elx2+sx/2 & qx < fx + elx2+sx/2 &~ my < fy + ely2+sy/2 & py < fy + ely2+sy/2 & qy < fy + ely2+sy/2 then m1x= ((rx[1]+rx[3])*factor) mx =(sx+(m1x)*0.5)/2 m1y= ((ry[1]+ry[3])*factor) my =(sy+(m1y)*0.5)/2 px1= ((rx[1]+rx[2])*factor) px =(sx+(px1)*0.5)/2 py1= ((ry[1]+ry[2])*factor) py =(sy+(py1)*0.5)/2 q1x= ((rx[2]+rx[3])*factor) qx =(sx+(q1x)*0.5)/2 q1y= ((ry[2]+ry[3])*factor) qy =(sy+(q1y)*0.5)/2 endif vd=ellipse(mx,my,px,py,qx,qy) elx2 = x2 RETURN