[vox-tech] [OT] Math question: help me make a rainbow
Jeff Newmiller
jdnewmil at dcn.davis.ca.us
Tue Mar 31 19:43:19 PDT 2009
Bill Kendrick wrote:
> Tux Paint has a magic tool called "Rainbow." It's not really, it's just
> a color-cycling circle-shaped paintbrush. A few years ago, a couple of
> the other TP developers joked that we need a tool to draw real rainbows.
> (Draw an arc, and the rainbow gradient appears over it.)
>
> So I've decided it might be fun to take a stab at it. My main problem is
> I'm rusty with math (trig., geometry, etc. ... you don't use those much in PHP
> or MySQL. ;) Heck, you don't use them much in most of the kinds of games I've
> worked on over the years.)
>
> Here's how I imagine the UI working. Click mouse to select one endpoint
> of the rainbow. Drag to where you want the other endpoint, and release
> mouse. Rainbow gets drawn.
>
> The rainbow would be an upside-down-"U" shape (with a 1:1 aspect, e.g.
> it'd be a portion of a perfect circle). I think for artistic purposes,
> it shouldn't always be a complete 180-degree arc, though. So here's
> how I complicate the UI :)
>
> P1 (aka x1,y1) is where you click. P2 (aka x2,y2) is where you release.
>
> 0,0 is the top left of the screen. Angles go from 0 (bottom/right of arc)
> thru 90 (top/center of arc) to 180 (bottom/left of arc).
>
> If y1 >= y2, then P1 represents the 180th degree of the arc
> (going counter-clockwise from the far right of the circle), and
> P2 represents the Nth degree of the arc (where 0 <= N < 180)
>
> If y1 < y2, then P1 represents the Nth degree of the arc,
> and P2 represents the 0th degree.
>
> This will let you draw, e.g. (bad ASCII ahead):
>
> /==P2
> /
> |
> P1
>
> as well as the full semi-circular arc:
>
> /==\
> / \
> | |
> P1 P2
>
> and of course, if P2 is lower, then:
>
>
> /==\
> P1 \
> |
> P2
>
> In both cases, there's an invisible P3, which is at 0 degrees or 180 deg.,
> depending on which point ended up being lower. The center of the circle
> is not necessarily exactly at (x1+((x2-x1)/2) , max(y1,y2)) which is where
> I'm getting stuck.
>
> My initial though was to find the vector V between P1 and P2.
> Going off at the normal of V, from its center, I believe I get a line
> that strikes the center of my would-be circle, when it crosses the
> max(y1,y2) height down the screen.
>
> But I was up late thinking about this, and worrying about atan() and
> intersect tests, and starting to think there's a simpler way.
>
>
> So, given two points on an arc of a circle, P1 and P2, how do I find
> the center and radius of the circle? (Then all I need to do is determine
> the angle (N) of one of the points (P1 or P2), while I know that the
> angle of the other (P2 or P1) is 0 or 180, depending on my UI rules above.
>
> Whew. Did I make ANY sense? :)
You seem to be trying to implement an algorithm that needs
three points with only two inputs... you are bound to fail.
One method I have seen is to click-drag-release to get the
two endpoints and then interactively pick up the mouse position
to track the height of the arc until a second click finishes
the input. You would have to back out the actual radius of
the circle if you needed it, but two inputs don't magically
become three.
--
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k
---------------------------------------------------------------------------
More information about the vox-tech
mailing list