[comp.sys.atari.st] Rubber Bands

Chris.Forker@newcastle.ac.uk (Chris Forker - Nav Arch-) (06/12/91)

From chris@uk.ac.ncl.wagner Tue Jun  4 15:02:47 1991
Received: from ncl.wagner (wagner.ncl) by uk.ac.newcastle.gershwin; Tue, 4 Jun 91 15:02:46 BST
From: Chris Forker - Nav Arch- <chris@uk.ac.ncl.wagner>
Date: Tue, 4 Jun 91 15:08:14 BST
Message-Id: <AA00873.9106041408.wagner@uk.ac.newcastle>
To: chris
Subject: post failed
Status: RO

/usr/local/lib/nn6.4/aux: /usr/local/lib/news/inews: not found
/usr/local/lib/news/inews failed

Your response has been saved in ~/dead.letter

Your article/letter follows:
Newsgroups: comp.sys.atari.st
Distribution: comp.sys.atari.st
Subject: Rubber Bands
Summary: 'C' code to draw rubber bands
Keywords: Rubber Bands

A short while ago someone asked about drawing rubber bands. I did reply to one person but perhaps not the original poster. The following code may be of use to those who want to draw rubber bands . The code lacks eloquence but works for me.

           ---------------------- Cut Here ------------------------------ 

void drag_line(short mx[], short my[], short no_pts, int k_line, 
               float scale)
{  
short i,oldx,oldy,xloc,yloc1,yloc2,neg,xorg,yorg ;
short xw,yw,ww,hw ;
short mbx,mby ;
short mb1, mb,              /*  mouse button state  */
      ks ;                  /*  keyboard state  */
short pts[4] ; 
char  message[5] ;          /*  v_pline x,y's  */
int   drop = FALSE ;

	oldx = 0 ;
	oldy = 0 ;

	vsl_type(screen_vhandle, SOLID) ;
	vsl_color(screen_vhandle, BLACK) ;
	vsl_width(screen_vhandle, 1) ;
	vsm_type(screen_vhandle, 4) ; 
	vst_point(screen_vhandle, 6, &i, &i, &i, &i) ;
	vst_effects(screen_vhandle, 1) ;
	
	wind_get(windows[cur_win].handle, WF_CXYWH, &xw, &yw, &ww, &hw) ;
                     
        wind_calc(WC_WORK, (NAME|CLOSE|MOVE), xw, yw, ww, hw, 
              &xw, &yw, &ww, &hw) ;
	
        xorg  = xw + 20 ;
        yorg  = yw + 30 + (20 * scale) ;
        neg= -1 ;
		
        hide_mouse() ;    /* Function which hides mouse  */
	
	for (i = 0; i <= no_pts; i++)
	{
           do
    	   {
              graf_mkstate(&mx[i], &my[i], &mb1, &ks) ; /*  x,y mouse co-ords  */  
             
              if (oldx != mx[i] || oldy != my[i]) /*  update screen if changed  */
              {
            	sprintf(message,"X : %6.2f", ((mx[i]-xorg)/scale)) ;
            	v_gtext(screen_vhandle, 500, 40, message) ;
            	sprintf(message,"Y : %6.2f", ((my[i]-yorg)/scale)*neg) ;
            	v_gtext(screen_vhandle, 500, 70, message) ;
            	vswr_mode(screen_vhandle, MD_XOR) ;
            
/*     set up mouse form  */           
            	pts[0] = oldx ;
            	pts[1] = oldy-5 ;
	        pts[2] = oldx ;
    	        pts[3] = oldy+5 ;
        	v_pline(screen_vhandle, 2, pts) ;
            	pts[0] = oldx-5 ;
	        pts[1] = oldy ;
    	        pts[2] = oldx+5 ;
        	pts[3] = oldy ;
            	v_pline(screen_vhandle, 2, pts) ;
                
                
	        pts[0] = mx[i] ;
    	        pts[1] = my[i] - 5 ;
        	pts[2] = mx[i] ;
            	pts[3] = my[i] + 5 ;
	        v_pline(screen_vhandle, 2, pts) ;
    	        pts[0] = mx[i] - 5 ;
        	pts[1] = my[i] ;
            	pts[2] = mx[i] + 5 ;
	        pts[3] = my[i] ;
    	        v_pline(screen_vhandle, 2, pts) ;
                
        	if (k_line && drop)
            	{
      	    		pts[0] = mx[i-1] ;
	                pts[1] = my[i-1] ;
    	                pts[2] = oldx ;
        	        pts[3] = oldy ;
            	        v_pline(screen_vhandle, 2, pts) ;
                	pts[0] = mx[i-1] ;
	                pts[1] = my[i-1] ;
    	                pts[2] = mx[i] ;
        	        pts[3] = my[i] ;
            	        v_pline(screen_vhandle, 2, pts) ;              
 
             	}  /*  if  */
             	vswr_mode(screen_vhandle, MD_REPLACE) ;
 	      }  /*  if  */
 		               
        	oldx = mx[i] ;
        	oldy = my[i] ;
            
           } while( mb1 <= 0 ) ;
        
           do
           {
               graf_mkstate(&mbx, &mby, &mb, &ks) ;
                        
           } while( mb != 0 ) ;
        
           drop = TRUE ;
        	
        }  /*  for  */
                
    vswr_mode(screen_vhandle, 3) ;
    pts[0] = oldx ;
    pts[1] = oldy-5 ;
    pts[2] = oldx ;
    pts[3] = oldy+5 ;
    v_pline(screen_vhandle, 2, pts) ;
    pts[0] = oldx-5 ;
    pts[1] = oldy ;
    pts[2] = oldx+5 ;
    pts[3] = oldy ;
    v_pline(screen_vhandle, 2, pts) ;
                 
    show_mouse()  ;    /*  Function to show mouse  */
}   /*   drag_line   */

              --------------- Cut Here ---------------

Hope this is of some help.....


+-=--=--=--=--=--=--=--=--=--=--=--=--=--+--=--=--=--=--=--=--=--=--=--=--=-+
|   mail: Chris.Forker@newcastle.ac.uk   |   Dept. Marine Technology        |
|  voice: +44 91 2226000 X 6218          |   Newcastle University           |
|    fax: +44 91 2611182                 |   Newcastle upon Tyne            |
|                                        |   NE1 7RU  ENGLAND               |
+-=--=--=--=--=--=--=--=--=--=--=--=--=--+--=--=--=--=--=--=--=--=--=--=--=-+