help converting C code to Basic for use with BS2

General Robotics Forum - All aspects of robots and their applications. 

Bookmark this page:  YahooMyWeb Yahoo!  Google Google  Windows Live Favorites Windows Live  del.icio.us del.icio.us  digg digg  Add to Netscape Netscape
Subject Author Date
help converting C code to Basic for use with BS2 weg22 04-11-2006
If you were  Registered and logged in, you could reply and use other advanced thread options
Posted by on April 11, 2006, 2:05 pm
Hi all,

I am having trouble getting around the integer math limitations of the
BS2, but I know there are ways to do so. I was hoping someone (with a
lot more BS2 experience than me) can take a look at the C code below
and suggest modifications that would yield the same result in Basic (or
something close as I know there will be rounding errors). The values I
get when compiling the code below are: distance!44 and anglef. I
really appreciate everyone's time!!!

Thanks in advance!

// declare variables
float degrees_LAT1, minutes_LAT1, seconds_LAT1, degrees_LONG1,
minutes_LONG1, seconds_LONG1;
float degrees_LAT2, minutes_LAT2, seconds_LAT2, degrees_LONG2,
minutes_LONG2, seconds_LONG2;
float LAT_1, LAT_2, LONG_1, LONG_2;
float D=0, courseAngle=0;

// initialize variables
degrees_LAT1 = 33.0; minutes_LAT1 = 57.0; seconds_LAT1 = 30.0;
degrees_LONG1 = 118.0; minutes_LONG1 = 24.0; seconds_LONG1 = 50.0;
degrees_LAT2 = 40.0; minutes_LAT2 = 38.0; seconds_LAT2 = 55.0;
degrees_LONG2 = 73.0; minutes_LONG2 = 47.0; seconds_LONG2 = 35.0;

// code that needs to be converted to basic for use with BS2...
LAT_1 = (degrees_LAT1 + minutes_LAT1/60 + seconds_LAT1/3600) *
(Pi/180);
LONG_1 = (degrees_LONG1 + minutes_LONG1/60 + seconds_LONG1/3600) *
(Pi/180);
LAT_2 = (degrees_LAT2 + minutes_LAT2/60 + seconds_LAT2/3600) *
(Pi/180);
LONG_2 = (degrees_LONG2 + minutes_LONG2/60 + seconds_LONG2/3600) *
(Pi/180);

D = acos(sin(LAT_1)*sin(LAT_2) +
cos(LAT_1)*cos(LAT_2)*cos(LONG_1-LONG_2));
courseAngle = acos((sin(LAT_2)-sin(LAT_1)*cos(D))/(sin(D)*cos(LAT_1)));
D = D*60*180/Pi;
printf("distance = %f\n", D);
printf("angle = %f\n\n", courseAngle*180/Pi);


Posted by Gordon McComb on April 11, 2006, 3:26 pm
If you don't get a response here, keep in mind that Parallax sponsors a
very active user-to-user forum on their site. Someone may have already
written a routine for handling simple floating point math.

-- Gordon


weg22@drexel.edu wrote:
>
> Hi all,
>
> I am having trouble getting around the integer math limitations of the
> BS2, but I know there are ways to do so. I was hoping someone (with a
> lot more BS2 experience than me) can take a look at the C code below
> and suggest modifications that would yield the same result in Basic (or
> something close as I know there will be rounding errors). The values I
> get when compiling the code below are: distance!44 and anglef. I
> really appreciate everyone's time!!!
>
> Thanks in advance!
>
> // declare variables
> float degrees_LAT1, minutes_LAT1, seconds_LAT1, degrees_LONG1,
> minutes_LONG1, seconds_LONG1;
> float degrees_LAT2, minutes_LAT2, seconds_LAT2, degrees_LONG2,
> minutes_LONG2, seconds_LONG2;
> float LAT_1, LAT_2, LONG_1, LONG_2;
> float D=0, courseAngle=0;
>
> // initialize variables
> degrees_LAT1 = 33.0; minutes_LAT1 = 57.0; seconds_LAT1 = 30.0;
> degrees_LONG1 = 118.0; minutes_LONG1 = 24.0; seconds_LONG1 = 50.0;
> degrees_LAT2 = 40.0; minutes_LAT2 = 38.0; seconds_LAT2 = 55.0;
> degrees_LONG2 = 73.0; minutes_LONG2 = 47.0; seconds_LONG2 = 35.0;
>
> // code that needs to be converted to basic for use with BS2...
> LAT_1 = (degrees_LAT1 + minutes_LAT1/60 + seconds_LAT1/3600) *
> (Pi/180);
> LONG_1 = (degrees_LONG1 + minutes_LONG1/60 + seconds_LONG1/3600) *
> (Pi/180);
> LAT_2 = (degrees_LAT2 + minutes_LAT2/60 + seconds_LAT2/3600) *
> (Pi/180);
> LONG_2 = (degrees_LONG2 + minutes_LONG2/60 + seconds_LONG2/3600) *
> (Pi/180);
>
> D = acos(sin(LAT_1)*sin(LAT_2) +
> cos(LAT_1)*cos(LAT_2)*cos(LONG_1-LONG_2));
> courseAngle = acos((sin(LAT_2)-sin(LAT_1)*cos(D))/(sin(D)*cos(LAT_1)));
> D = D*60*180/Pi;
> printf("distance = %f\n", D);
> printf("angle = %f\n\n", courseAngle*180/Pi);

Posted by on April 11, 2006, 3:53 pm
Yeah, I tried there first and am still waiting a reply :-(


Posted by Jim Hewitt on April 11, 2006, 6:05 pm
Ooh, fun.

I don't have acces to my code any more, but the last time I tried to solve
this type of problem in BS2 I used fixed point , not floating point. And I
used lookup tables for the trig functions.

I did a quick check: for the data values in your exanmple, I got the
identical results by rounding the seconds. This might allow you to use
word sized variables. Even though the degrees can range from 0..360, the
_difference_ between the two vectors will never be more than 180 degrees, so
this should fit OK in a word that can handle 32768 or 65536.

Fixed point means that you use integer values but you choose a location as
the decimal point and it's fixed at that point. Your distance can be an
integer and results of the forward trig functions are always between -1.0
and 1.0. The inverse trig functions can vary, but it is doable.

Not trivial, but doable.

Sorry, again, I don't have any access to any pre-written routines, but you
can do it if you're motivated.

Jim



> Hi all,
> I am having trouble getting around the integer math limitations of the
> BS2, but I know there are ways to do so. I was hoping someone (with a
> lot more BS2 experience than me) can take a look at the C code below
> and suggest modifications that would yield the same result in Basic (or
> something close as I know there will be rounding errors). The values I
> get when compiling the code below are: distance!44 and anglef. I
> really appreciate everyone's time!!!
> Thanks in advance!
> // declare variables
> float degrees_LAT1, minutes_LAT1, seconds_LAT1, degrees_LONG1,
> minutes_LONG1, seconds_LONG1;
> float degrees_LAT2, minutes_LAT2, seconds_LAT2, degrees_LONG2,
> minutes_LONG2, seconds_LONG2;
> float LAT_1, LAT_2, LONG_1, LONG_2;
> float D=0, courseAngle=0;
> // initialize variables
> degrees_LAT1 = 33.0; minutes_LAT1 = 57.0; seconds_LAT1 = 30.0;
> degrees_LONG1 = 118.0; minutes_LONG1 = 24.0; seconds_LONG1 = 50.0;
> degrees_LAT2 = 40.0; minutes_LAT2 = 38.0; seconds_LAT2 = 55.0;
> degrees_LONG2 = 73.0; minutes_LONG2 = 47.0; seconds_LONG2 = 35.0;
> // code that needs to be converted to basic for use with BS2...
> LAT_1 = (degrees_LAT1 + minutes_LAT1/60 + seconds_LAT1/3600) *
> (Pi/180);
> LONG_1 = (degrees_LONG1 + minutes_LONG1/60 + seconds_LONG1/3600) *
> (Pi/180);
> LAT_2 = (degrees_LAT2 + minutes_LAT2/60 + seconds_LAT2/3600) *
> (Pi/180);
> LONG_2 = (degrees_LONG2 + minutes_LONG2/60 + seconds_LONG2/3600) *
> (Pi/180);
> D = acos(sin(LAT_1)*sin(LAT_2) +
> cos(LAT_1)*cos(LAT_2)*cos(LONG_1-LONG_2));
> courseAngle = acos((sin(LAT_2)-sin(LAT_1)*cos(D))/(sin(D)*cos(LAT_1)));
> D = D*60*180/Pi;
> printf("distance = %f\n", D);
> printf("angle = %f\n\n", courseAngle*180/Pi);




The site map in XML format XML site map
other useful resources:
Official Robosapien Website
Lego Mindstorms Website

Contact Us | Privacy Policy