From: "JEFF" Newsgroups: comp.os.msdos.djgpp Subject: Re: Tank Movement Date: Sun, 4 Oct 1998 23:07:35 -0400 Organization: EarthLink Network, Inc. Lines: 49 Message-ID: <6v9bfd$i05$1@ash.prod.itd.earthlink.net> References: <36147a32 DOT 10039817 AT ct-news DOT iafrica DOT com> NNTP-Posting-Host: sdn-ar-002ohdaytp184.dialsprint.net X-Newsreader: Microsoft Outlook Express 4.72.3110.5 X-Posted-Path-Was: not-for-mail X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 X-ELN-Date: Sun Oct 4 19:38:37 1998 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Chris Brooker wrote in message <36147a32 DOT 10039817 AT ct-news DOT iafrica DOT com>... >Hi, >Sorry if my code sucks, I a mquite new to C. >I am busy writing a Real Time Strategy with DJGPP and allegro and have >hit a problem, here it is: > >I have a selected tank and would like to move it somewhere else by >clicking there, i do this and it either: moves there properly, moves >in the opposite direction or just sits and vibrates. >Can someone please tell me what is wrong. > >Here are the functions: > >double dir_degrees(int x1, int y1, int y2, int x2) >{ > int v1, v2; > double dir; > v1 = y1 - y2; > v2 = x1 - x2; > if (v2 == 0) > v2++; //Stops division by zero errors > dir = 57 * atan(v1 / v2); > return dir; >} The atan function can only return values between -90 and 90 degrees, which is two out of four quandrants. You need to check the signs of v1 and v2 to determine if the angle is between -180 and -90 or between 90 and 180 degrees and add or subtract 90 degrees accordingly. If x and y coordinates are standard cartesian, with "right" as positive x and "up" as positive y: if x>0 and y>0, the angle must be 0 to 90 degrees. No adjustment. if x>0 and y<0, angle is -90 to 0. No adjustment. if x<0 and y>0 angle is 90 to 180. Add 180 degrees to return value. if x<0 and y<0 angle is -180 to -90. Subtract 180 degrees from return value. You may need to experiment to get the right adjustment as I have not tested it. Good luck. -Jeff