Brieg Brieg - 2 months ago 33
C++ Question

OpenGL How fix direction draw circle/semi circle/arc from start to end point giving center, r start and end angle

How to draw circle or semi circle or arc from start(B) to end(C) point giving:

  • A(Ax,Ay) - polyline

  • B(Bx,By) - start point

  • C(Cx,Cy) - end point

  • M(Mx,My) - center of circle or semi circle or arc

  • r - radius

  • startAngle = atan2(B.y - M.y, B.x - M.x) - in radians

  • endAngle = atan2f(C.y - M.y, C.x - M.x) - in radians

  • segments = 80

Unknow values:

  • clockwise or anticlockwise direction


  • Arc must be drawing from point B to C

Can someone please provide me equation for drawing an arc in OpenGL?


Will it be a circle, a semicircle or arc it depends on the position of the center of the circle and the start and end points.

Please give me a some light to solve this.


I wrote this, issuse is now:
Wrong draw direction. Please see picture. Semi circle have to be bottom of the line and not on the top.
In the case of 1 everything is fine.
In the case of 2 draw direction should be bottom(CCW)

enter image description here

float startAngle = atan2(B.y - centerArc.y, B.x - centerArc.x);
float endAngle = atan2(C.y - centerArc.y, C.x - centerArc.x);

if (endAngle < startAngle)
endAngle += 2.0f * PI;

for (float angle = startAngle; angle <= endAngle; angle = angle + 0.01f)
float x = centerArc.x + cos(angle) * r;
float y = centerArc.y + sin(angle) * r;
glVertex2f(x, windowHeight - y);

enter image description here


The equation for points on a circle, semi-circle or circle arc is the same for all cases. The only variable that changes is the range in which the angle lies.

In pseudocode this looks as follows:

for angle in [startAngle, endAngle]
    p_on_circle = M + r * (cos(angle), sin(angle))

This assumes, that angle is given in radians, so one might want to just use

startAngle = atan2(B.y - M.y, B.x - M.x)
endAngle = atan2f(C.y - M.y, C.x - M.x)


Since atan2 produces angles in [-pi, pi] which makes some problems when endAngle is smaller than startAngle one has to make sure that the endAngle is always larger than the startAngle. This can, for example, be done by:

if (endAngle < startAngle)
    endAngle += 2*pi;