From: "Michael Stewart" Newsgroups: comp.os.msdos.djgpp References: <8gp59t$h8n$1 AT lure DOT pipex DOT net> Subject: Re: help a semi-newbie with some graphics.... Lines: 96 X-Newsreader: Microsoft Outlook Express 5.00.2014.211 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2014.211 X-Original-NNTP-Posting-Host: 212.188.150.76 Message-ID: <3930621b@news.server.worldonline.co.uk> Date: Sun, 28 May 2000 01:04:33 +0100 NNTP-Posting-Host: 212.49.224.15 X-Trace: server12-lon1.london1.l3.net 959472156 212.49.224.15 (Sun, 28 May 2000 01:02:36 BST) NNTP-Posting-Date: Sun, 28 May 2000 01:02:36 BST To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com DeepBlack (Murray Evans) wrote in message news:8gp59t$h8n$1 AT lure DOT pipex DOT net... > void line(int scr_buff, int start_x, int start_y, int end_x, int end_y, int > col) > { > int x,y,dx,dy; > float m; > > /*this first part will draw straight lines, and take account of any > divide by zero's which may crop up.*/ > > if((end_x - start_x) == 0) if (end_x == start_x) // bit pedantic, but I think neater :-) > {if(end_y > start_y) > { > v_line(scr_buff,start_x,start_y,(end_y-start_y),col); > } > if(start_y > end_y) > { > v_line(scr_buff,start_x,start_y,(start_y-end_y),col); > } > } > if((end_y - start_y)==0) if (end_y == start_y) // ditto > { > if(end_x > start_x) > { > h_line(scr_buff,start_x, start_y, (end_y-start_y), col); > } > if(start_x > end_x) > { > h_line(scr_buff,start_x, start_y, (start_y-end_y), col); > } > } > > dx = sqrt((end_x - start_x)*(end_x - start_x)); dx = abs (end_x - start_x); > dy = sqrt((end_y - start_y)*(end_y - start_y)); dy = abs (end_y - start_y); > any suggestions as to what is wrong? I can't see any problems but the code you presented is very inefficient. Perhaps you would be better using an implementation of the Bresenham line routine (as used in practically every line drawing routine in practically every graphics library, including Allegro). You should be able to adapt the following code to fit your library. void line (int x1, int y1, int x2, int y2, int col) { int i, steep = 0, sx, sy, dx, dy, e; dx = abs (x2 - x1); sx = ((x2 - x1) > 0) ? 1 : -1; dy = abs (y2 - y1); sy = ((y2 - y1) > 0) ? 1 : -1; if (dy > dx) { int temp = x1; x1 = y1; y1 = temp; temp = dx; dx = dy; dy = temp; temp = sx; sx = sy; sy = temp; steep = 1; } e = 2 * dy - dx; i = 0; while (i < dx) { if (steep) put_pixel (y1, x1, col); else put_pixel (x1, y1, col); while (e >= 0) { y1 += sy; e -= 2 * dx; } x1 += sx; e += 2 * dy; i++; } put_pixel (x2, y2, col); } Hope this helps Mike