tags:

views:

310

answers:

1

While making a little Pong game in C++ OpenGL, I decided it'd be fun to create arcs (semi-circles) when stuff bounces. I decided to skip Bezier curves for the moment and just go with straight algebra, but I didn't get far. My algebra follows a simple quadratic function (y = +- sqrt(mx+c)).

This little excerpt is just an example I've yet to fully parameterize, I just wanted to see how it would look. When I draw this, however, it gives me a straight vertical line where the line's tangent line approaches -1.0 / 1.0.

Is this a limitation of the GL_LINE_STRIP style or is there an easier way to draw semi-circles / arcs? Or did I just completely miss something obvious?

void Ball::drawBounce()
{   float piecesToDraw = 100.0f;
    float arcWidth = 10.0f;
    float arcAngle = 4.0f;

    glBegin(GL_LINE_STRIP);
        for (float i = 0.0f; i < piecesToDraw; i += 1.0f)  // Positive Half
        {   float currentX = (i / piecesToDraw) * arcWidth;
            glVertex2f(currentX, sqrtf((-currentX * arcAngle)+ arcWidth));
        }
        for (float j = piecesToDraw; j > 0.0f; j -= 1.0f) // Negative half (go backwards in X direction now)
        {   float currentX = (j / piecesToDraw) * arcWidth;
            glVertex2f(currentX, -sqrtf((-currentX * arcAngle) + arcWidth));
        }
    glEnd();
}

Thanks in advance.

+1  A: 

What is the purpose of sqrtf((-currentX * arcAngle)+ arcWidth)? When i>25, that expression becomes imaginary. The proper way of doing this would be using sin()/cos() to generate the X and Y coordinates for a semi-circle as stated in your question. If you want to use a parabola instead, the cleaner way would be to calculate y=H-H(x/W)^2

SigmaXiPi
Yeah, there's the idiocy. Not sure why I decided to use parabolas instead of remembering my unit circle in retrospect.I guess I got hung up on why there was a vertical line going through my line draw.Thanks
rpgFANATIC