# The MASM Forum

## General => The Laboratory => Topic started by: Albert_redditt on August 09, 2012, 03:24:38 PM

Title: BANDIT Formula
Post by: Albert_redditt on August 09, 2012, 03:24:38 PM
I'm still learning ASM and trying to convert Basic programs i wrote, to ASM.

Heres one of my hilariuos Trig Formulas.

Code: [Select]
`setup all the progs vars to single or double precision , radius of 125 is for 640X480radian = ATN(1) / 45radius = 125FOR deg1 = 0 TO 360    c1 = COS(deg1 * radian)    s1 = SIN(deg1 * radian)    x1 = radius * c1    y1 = radius * s1    FOR deg2 = 0 TO 360 STEP 1        c2 = COS(deg2 * radian)        s2 = SIN(deg2 * radian)        x2 = radius * c2 * c2 * COS(COS(deg2 * s1 * c2 * radian) * c1) * c2 * c2 / c1 * s1 * COS(deg2 * radian * c1)        y2 = radius * s2 * s2 * SIN(COS(deg2 * c1 * s2 * radian) * s1) * s2 * s2 / s1 * s1 * SIN(deg2 * radian * s1)        PSET (xctr + x1 + x2 , yctr + y1 + y2), 9    NEXTNEXT`
Title: Re: BANDIT Formula
Post by: dedndave on August 09, 2012, 07:40:51 PM
try a Bresenham algo   :t
http://en.wikipedia.org/wiki/Midpoint_circle_algorithm (http://en.wikipedia.org/wiki/Midpoint_circle_algorithm)

at any rate....
the FPU has intrinsic trig functions which should be reasonably fast
Title: Re: BANDIT Formula
Post by: MichaelW on August 09, 2012, 10:16:09 PM
It's not going to be easy. The attachment contains the compiled FreeBASIC app.
Title: Re: BANDIT Formula
Post by: qWord on August 09, 2012, 11:40:58 PM
looks interesting :biggrin:
Is this shape intended? Using my macros, the conversion is very easy - see attachment.
Title: Re: BANDIT Formula
Post by: MichaelW on August 10, 2012, 01:32:32 AM
qWord,

The shape that your code produces does look somewhat like a cartoon version of a Mexican bandit:

http://fc02.deviantart.net/fs6/i/2005/030/f/4/Mexican_bandit_mascot_by_pas_designs.jpg (http://fc02.deviantart.net/fs6/i/2005/030/f/4/Mexican_bandit_mascot_by_pas_designs.jpg)

(http://fc02.deviantart.net/fs6/i/2005/030/f/4/Mexican_bandit_mascot_by_pas_designs.jpg)
Title: Re: BANDIT Formula
Post by: jj2007 on August 10, 2012, 02:23:20 AM
qWord,

I can echo that :t
Title: Re: BANDIT Formula
Post by: qWord on August 10, 2012, 04:00:00 AM
thx  :biggrin:

The shape that your code produces does look somewhat like a cartoon version of a Mexican bandit:
that explains the name  :lol:
Title: Re: BANDIT Formula
Post by: Albert_redditt on August 10, 2012, 06:16:40 AM
@QWord
Your formula is not the correct height, its flat on the vertical.

ldl deg1 = 180 , radian = 0.01745329252 ; = Pi/180°

.while deg1 <= 360

ldl deg1=180 should be ldl deg1=0

ldl radius = 50  ; should be ~y_resolution / (somewhere betwen 5 to 7)

invoke BANDIT,ps.hdc,radius,150,150  ;  the (150,150)  should be  x_resolution / 2  ,  y_resolution/2

Title: Re: BANDIT Formula
Post by: dedndave on August 10, 2012, 03:34:25 PM
i thought it was 1 radian = 180 degrees/pi ~ 57.3 degrees
Title: Re: BANDIT Formula
Post by: FORTRANS on August 10, 2012, 10:35:22 PM
Hi Dave,

Yes, a radian is an arc length on the circle equal to
the radius of the circle.  There are two pi radians in the
circumference of a circle.  So, about 57.3 degrees.

Cheers,

Steve N.
Title: Re: BANDIT Formula
Post by: dedndave on August 10, 2012, 11:46:17 PM
(http://l.yimg.com/us.yimg.com/i/mesg/emoticons7/18.gif)
Title: Re: BANDIT Formula
Post by: Albert_redditt on August 11, 2012, 09:16:14 AM
In my trig formulas instead of looping -PI to PI   or  0 to PI*2

I loop 0 to 360 degrees and multiply the degree by 1 degree worth or radians (.01745).
1 degree worth of radians is the ArcTangent of 1 (45 degrees) divided by 45.

I usually just call the "ATN(1)/45" a "rad" or "radian" or "r1 or r2" . but its not actually a radian, its 1 degree of radians.
and then do a

Most everybody else uses radians or what they call theta.
loop 0 to PI*2 step theta  (.01745)
c = cos(theta)
s = sin(theta)

I just use degrees , because i'm an untrained mathematician and probably a moron as well.
Title: Re: BANDIT Formula
Post by: dedndave on August 11, 2012, 10:33:56 AM
that is the fundamental flaw in your method

rather than stepping by degrees or radians....
step by pixels

for all the "orthogonals", it does not matter whether you step by X or by Y
the orthogonals are 0, 45, 90, 135, 180, 225, 270, 315, and 360

but - in between these angles, step by X if the slope of the tangent is between -1 and 1
otherwise, step by Y

you will be much happier with your circle   :t
Title: Re: BANDIT Formula
Post by: dedndave on August 11, 2012, 10:54:14 AM
to expand on that a little.....

make 2 loops - one that steps by X, one that steps by Y

for 315 to 45 degrees, step by X
for 45 to 135 degrees, step by Y
for 135 to 225 degrees, step by X
for 225 to 315 degrees, step by Y
Title: Re: BANDIT Formula
Post by: FORTRANS on August 11, 2012, 10:37:10 PM
Hi,

To elaborate on Dave's comment; you should not step
by a degree because with a large circle you will be plotting
dots rather than a continuous circle.  And with a small circle,
you will be plotting the pixels on the circle multiple times.

If you increment by pixels you end up with a continuous
line/circle.  And you don't overplot pixels.  This is one of
the ideas behind Bresenham's circle algorithm.

HTH,

Steve N.
Title: Re: BANDIT Formula
Post by: dedndave on August 12, 2012, 02:39:17 AM
yes - it will make a circle that can be filled   :P

the main advantage of using Bresenham is that integer calculations are performed between steps
the circle algo was derived from the Bresenham Line algo
i have adapted the same idea to other things with good results
Title: Re: BANDIT Formula
Post by: dedndave on August 12, 2012, 10:32:56 AM
i happened to catch this photo on MSN
it is supposed to be a perseid meteor
but, it looks to me like Bresenham may have had a hand in it   :lol:

(http://col.stb01.s-msn.com/i/E7/BF959D817C59911A59A248982D3CF.jpg)