'*****************************************
'*       Programma B-spline              *
'*                         by G 1 M 1988 *
'*****************************************

DIM xn(30,1)
DIM v(30,1)
DIM C(4,4)
DIM a(30,30)
DIM y(4,1)
             
GOSUB disponi
ON MENU GOSUB scelta
ON MOUSE GOSUB nodo
MENU ON                 
MOUSE ON
WHILE (fl=0) 
  a=MOUSE(0)
  x=MOUSE(1) : y=MOUSE(2)
  LOCATE 1,1 : PRINT USING" x = ### ";x;
               PRINT USING" y = ### ";y
  LOCATE 2,1 : PRINT USING" n = ### ";n             
WEND
MENU RESET 

END
'-----------------------------------------   
disponi:
  fl=0       
  n=0
  tc=0
  FOR i=1 TO 4
    FOR j=1 TO 4
      READ C(i,j) 
    NEXT j
  NEXT i
  MENU 1,0,1,"B-spline"
  MENU 1,1,1,"ClrScr  "
  MENU 1,2,1,"New     " 
  MENU 1,3,1,"Aperta  " 
  MENU 1,4,0,"Trace   "
  MENU 1,5,1,"End     "
  DATA -1, 3,-3, 1
  DATA  3,-6, 3, 0
  DATA -3, 0, 3, 0
  DATA  1, 4, 1, 0
RETURN
'-----------------------------------------   
scelta:
  mid=MENU(1)
  IF mid=1 THEN CLS
  IF mid=2 THEN n=0
  IF mid=3 THEN 
    tc=(tc+1) MOD 2
    IF tc=0 THEN MENU 1,3,1,"Aperta  "            
    IF tc=1 THEN MENU 1,3,1,"Chiusa  "             
  END IF          
  IF mid=4 THEN 
     MENU 1,0,0 : MENU 1,4,0 : MOUSE OFF
     LOCATE 1,1 : PRINT "Mumble mumble ..."
     GOSUB trace
     n=0
     MENU 1,0,1 : MOUSE ON     
  END IF
  IF mid=5 THEN fl=1
RETURN
'-----------------------------------------   
nodo:
  a=MOUSE(0)
  x=MOUSE(1):y=MOUSE(2)
  n=n+1
  xn(n,0)=x:xn(n,1)=y
  LINE (x-2,y)-(x+2,y)
  LINE (x,y-2)-(x,y+2)       
  IF n>2 THEN MENU 1,4,1
RETURN
'-----------------------------------------       
trace:  
   '--------------------------------------
   prepara:
   FOR i=1 TO n
     FOR j=1 TO n
       a(i,j)=0
     NEXT j
   NEXT i
   IF tc=1 THEN ' curva chiusa
       a(1,1)=5 : a(1,2)=1  
       a(1,n-1)=a(1,n-1)+1 : a(1,n)=-1
       FOR i=2 TO n-1 
         a(i,i-1)=1 : a(i,i)=4 : a(i,i+1)=1 
       NEXT i
       a(n,1)=-1 : a(n,2)=1  
       a(n,n-1)=a(n,n-1)+1 : a(n,n)=5
       GOSUB risolvi
       FOR i=1 TO n
         v(i,0)=v(i,0)*6 : v(i,1)=v(i,1)*6
       NEXT i
       v(0,0)=v(1,0)+v(n-1,0)-v(n,0)
       v(0,1)=v(1,1)+v(n-1,1)-v(n,1)
       v(n+1,0)=v(n,0)+v(2,0)-v(1,0)    
       v(n+1,1)=v(n,1)+v(2,1)-v(1,1) 
     ELSE ' curva aperta
       a(1,1)=6   
       FOR i=2 TO n-1 
         a(i,i-1)=1 : a(i,i)=4 : a(i,i+1)=1 
       NEXT i        
       a(n,n)=6
       GOSUB risolvi
       FOR i=1 TO n
         v(i,0)=v(i,0)*6 : v(i,1)=v(i,1)*6
       NEXT i
       v(0,0)=2*v(1,0)-v(2,0)
       v(0,1)=2*v(1,1)-v(2,1)
       v(n+1,0)=2*v(n,0)-v(n-1,0)
       v(n+1,1)=2*v(n,1)-v(n-1,1)
   END IF
   '-------------------------------------- 
   traccia:
   FOR k=1 TO n-1
     FOR i=1 TO 4
       s0=0 : s1=0
       FOR j=1 TO 4
         s0=s0+C(i,j)*v(k+j-2,0)
         s1=s1+C(i,j)*v(k+j-2,1)  
       NEXT j
       y(i,0)=s0/6 : y(i,1)=s1/6
     NEXT i
     t=0
     WHILE t<=1
       t1=t
       s0=y(4,0) : s1=y(4,1)
       FOR i=3 TO 1 STEP -1
          s0=s0+t1*y(i,0) : s1=s1+t1*y(i,1) 
          t1=t1*t
       NEXT i
       hp=INT(s0) : vp=INT(s1)
       PSET (hp,vp)
       t=t+.01
     WEND
   NEXT k  
RETURN
   '--------------------------------------
   risolvi:
   FOR k=2 TO n
     FOR i=k TO n
       FOR j=k TO n
         a(i,j)=( a(k-1,k-1)*a(i,j)-a(i,k-1)*a(k-1,j) )/a(k-1,k-1)
       NEXT j
       xn(i,0)=( a(k-1,k-1)*xn(i,0)-a(i,k-1)*xn(k-1,0) )/a(k-1,k-1)
       xn(i,1)=( a(k-1,k-1)*xn(i,1)-a(i,k-1)*xn(k-1,1) )/a(k-1,k-1)
     NEXT i
   NEXT k
   v(n,0)=xn(n,0)/a(n,n) : v(n,1)=xn(n,1)/a(n,n)  
   FOR i=n-1 TO 1 STEP -1
     s0=xn(i,0) : s1=xn(i,1)
     FOR j=i+1 TO n
       s0=s0-v(j,0)*a(i,j) : s1=s1-v(j,1)*a(i,j) 
     NEXT j
     v(i,0)=s0/a(i,i) : v(i,1)=s1/a(i,i) 
   NEXT i
   RETURN
       
       
       
              
     
           
                 










