? Epicycloids ● SmileBASIC Source

Sign In

Register
*Usernames are case-sensitive
Forgot my password

Epicycloids

EPICYCLOID OriginX, OriginY, CentralRadius, TangentialRadius, ScaleFactor, Color DEF EPICYCLOID X%,Y%,R0#,R1#,SF#,COL% DIM I#, RR# = R0#+R1#, S# = 1/3/R0#/SF# FOR I# = 0 TO PI()*2 STEP S# DIM X0# = RR#*COS(I#) - R1#*COS((RR#*I#)/R1#) DIM Y0# = RR#*SIN(I#) - R1#*SIN((RR#*I#)/R1#) GPSET X0#*SF#+X%, Y0#*SF#+Y%, COL% NEXT I% END Epicycloids This is really more of a gimmick than anything practical. As you can see from the Wikipedia page, an epicycloid is a shape drawn by a circle as it rolls around another circle. To get something which looks pretty, try drawing epicycloids where R0 is a multiple of R1 by some arbitrary K value, such that R0 == R1*K is true. An example of this may be EPICYCLOID 200,120,(5),(1),6,#RED Where R0=(5) and R1=(1), and R0 == R1*K is satisfied because 5 == 1*(K=5). In other words, make it so that the first (larger) radii value is an integer multiple of the second (smaller) radii value. Edit: Thanks to 12Me21 for being a math wizard.
Author
MZ952
Updated
Rating
4 votes
Categories
Keywords
7 Comment(s) 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website You shouldn't make X0 and Y0 integers, otherwise it'll get messed up if the scale factor isn't 1 MZ952 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Drawing I like to draw! Hobbies Reading I like to read books! Hobbies Sorry, but I ninja-edited it before you commented. Realized as soon as I put it to the test. 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website You can actually calculate the step value as (1/3)/R0, (I guess it's less descriptive, but it's not entirely obvious how the current method works either) Also, it's more efficient to use FOR I=0 TO 2*PI() ... instead of FOR I=0 TO T ..., because 2*PI() is evaluated during compilation. MZ952 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Drawing I like to draw! Hobbies Reading I like to read books! Hobbies Huh, how did you find (1/3)/R0? I plugged the value in, and it appears to disregard the scale factor involved with plotting the curve. Edit: By also dividing by the scale factor (1/3)/R0/SF, it can plot most of the pixels, but it's still very holey. I just don't really know where the math is coming from, so it's hard to modify. 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website oh, forgot about the scale factor. That should be (1/3)/(R0*SF) (What you tried *should* have worked, maybe calculating it that way is less precise, I'm not sure) You calculate the step value as (2*PI()) / (R1*2*PI()*(R0/R1)*SF*3), and if you divide both sides by 2*PI(), you get 1/(R1*(R0/R1)*SF*3) (R0/R1)*R1 is just R0, so you end up with 1/(R0*SF*3), and rewriting this as (1/3)/(R0*SF) uses 1 fewer operation since 1/3 is calculated during compilation. EDIT: I tried 1/3/R0/SF and it seems to work fine... Oh, I almost forgot. You should have a rotation parameter in your function MZ952 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Drawing I like to draw! Hobbies Reading I like to read books! Hobbies Oh, what the heck. Yeah, 1/3/R0/SF works perfectly now. I'm no math wizard, so I just approximated the perimeter as best I could. Thanks! Lumage Lumage Head Admin nice