Penn - 2 years ago 163
Python Question

# how to create a three-point arc in pygame

I need to draw an arc in pygame, through three points, however pygame's arc function doesn't seem to support this. I have researched three point arcs, both in and out of pygame, however cannot find anything that I understand and is useful.

I would ideally like a full code however any hints will be useful

Penn

Here are some hints, which will require a little mathematics to finish. If you need more help, show more of your work and ask.

Let's say you want to draw a circular arc from point `a=(ax, ay)` through point `b=(bx, by)` to point `c=(cx, cy)`. You want to use the function

`pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1)`

So you need to find `Rect`, the bounding rectangle (which will be a square) of the circle, and the start and stop angles. Here is an outline.

1. Use your point coordinates to calculate the center of the relevant circle, giving you point `u=(ux, uy)`. If that calculation raises a divide-by-zero or overflow error, the points are (nearly) in a straight line, so just draw a line segment from point `a` to point `c` and you are done.
2. Calculate the distance from point `u` to point `a` (or `b` or `c`, it doesn't matter). That will be the radius of the desired circle.
3. Use point `u` and the radius to calculate the parameters of the bounding rectangle `Rect`. The rectangle will actually be a square, and point `u` will be its center.
4. Use a little trigonometry to calculate the direction angle from point `u` to point `a`: this (almost) will be `start_angle`. Be careful, since Cartesian coordinates have increasing y go up, while in pygame increasing y goes down. Also calculate the direction angle from point `u` to point `c`: this (almost) will be `stop_angle`. Then calculate the direction angle from point `u` to point `b`.
5. Examine those three direction angles. If necessary, swap the start and stop angles and/or add 2*pi to the stop angle to ensure that the start angle is less than the stop angle and that the arc goes through point `b`.

You now have `Rect`, `start_angle`, and `stop_angle`. This outline ignores some subtle issues such as rounding to integers, but I'll leave those to you.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download