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) 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 -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 !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 4,1,2,14,13 READ.DATA 9,4,16,17,5,10,22,23,11,4 READ.DATA 2,16,23 READ.DATA 2,4,5 READ.DATA 2,10,11 READ.DATA 2,17,22 READ.DATA 9,1,2,14,15,3,12,24,13,1 READ.DATA 2,2,3 READ.DATA 2,1,12 READ.DATA 2,15,24 READ.DATA 2,14,13 READ.DATA 9,9,6,18,19,7,8,20,21,9 READ.DATA 2,6,7 READ.DATA 2,9,8 READ.DATA 2,19,20 READ.DATA 2,18,21 np=28 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 n=1 TO np READ.NEXT px[n],py[n],pz[n] NEXT n ! casting the points into a particular order nlz=16 DIM lz[nlz] for n=1 TO nlz LIST.CREATE n,llz lz[n]=llz READ.NEXT cnt FOR j=1 TO cnt READ.NEXT lin LIST.ADD llz,lin NEXT j NEXT n !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 GOSUB draw3 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 n=1 TO np !Multiply vector with matrix qx[n]=px[n]*x1+py[n]*y1+pz[n]*z1 qy[n]=px[n]*x2+py[n]*y2+pz[n]*z2 qz[n]=px[n]*x3+py[n]*y3+pz[n]*z3 NEXT n 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 n=1 TO np !Multiply vector with matrix rx[n]=qx[n]*x1+qy[n]*y1+qz[n]*z1 ry[n]=qx[n]*x2+qy[n]*y2+qz[n]*z2 rz[n]=qx[n]*x3+qy[n]*y3+qz[n]*z3 NEXT n RETURN !EndRegion draw: for n=1 TO nlz LIST.SIZE lz[n],nlin LIST.GET lz[n],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[n],j,p2 grx=rx[p2]-gox gry=ry[p2]-goy grz=rz[p2]-goz GOSUB wts LIST.CREATE n,vdlin GR.LINE vd,x+sx/2,y+sy/2,x2+sx/2,y2+sy/2 LIST.ADD vdlin,vd LIST.TOARRAY vdlin,vd[] x2=x y2=y LIST.SIZE vdlin, vdsize NEXT j NEXT n GR.RENDER RETURN draw2: z1 = rz[1] z2 = rz[2] z3 = rz[14] zav = (z1+z2+z3)/3 adjusty = (zav*0.35/(ely2+sy/2)) factory = 1 - adjusty adjustx = (zav*0.1*elx2/40/(elx2+sx/2)) factorx = 1 - adjustx factor = (factorx + factory)/2 elx2 = x ely2 = y m1x= ((rx[1]+rx[14])*factor) mx =(sx+(m1x)*0.5)/2 m1y= ((ry[1]+ry[14])*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[14])*factor) qx =(sx+(q1x)*0.5)/2 q1y= ((ry[2]+ry[14])*factor) qy =(sy+(q1y)*0.5)/2 vd=ellipse(mx,my,px,py,qx,qy) RETURN draw3: z1 = rz[7] z2 = rz[8] z3 = rz[20] zav = (z1+z2+z3)/3 adjusty = (zav*0.35/(ely2+sy/2)) factory = 1 - adjusty adjustx = (zav*0.1*elx2/40/(elx2+sx/2)) factorx = 1 - adjustx factor = (factorx + factory)/2 elx2 = x ely2 = y m1x= ((rx[7]+rx[20])*factor) mx =(sx+(m1x)*0.5)/2 m1y= ((ry[7]+ry[20])*factor) my =(sy+(m1y)*0.5)/2 px1= ((rx[7]+rx[8])*factor) px =(sx+(px1)*0.5)/2 py1= ((ry[7]+ry[8])*factor) py =(sy+(py1)*0.5)/2 q1x= ((rx[8]+rx[20])*factor) qx =(sx+(q1x)*0.5)/2 q1y= ((ry[8]+ry[20])*factor) qy =(sy+(q1y)*0.5)/2 vd=ellipse(mx,my,px,py,qx,qy) RETURN