Home > Software design >  draw arc using start, end and initial direction
draw arc using start, end and initial direction

Time:06-08

I am trying to draw a railway in the way it is implemented in railroad tycoon 3. I have understood some of the patterns by which this is done, but I cannot find a formula for their application. I am trying to build an arc using only two points and some initial direction. For simplicity, let's assume that I can only plot a path in the range from 0 to 90 degrees. The arc should always start in the direction of "Initial direction". I need a method that would implement this. I tried to depict the idea in the drawings. Any pseudocode would do I guess.

enter image description here

Python code. Perhaps examples are too simple to reveal bugs, but the first with half-circle gives R=L/2, center at M, and the second one shows correct C position and R.

from math import hypot, atan2
def arcfromptsdir(sx, sy, ex, ey, dx, dy):
    sex = ex - sx
    sey = ey - sy
    perpx = -sey
    perpy = sex
    mx = (ex   sx) / 2
    my = (ey   sy) / 2
    #equation
    #(sex/2   perpx * t )*dx   (sey/2   perp.y * t )*dy = 0
    p = perpx * dx   perpy * dy
    if p:
        t = -0.5*(sex*dx   sey*dx) / p
    else:
        return None
    #centerx, centery, radius
    cx = mx   perpx * t
    cy = my   perpy * t
    radius = hypot(cx-sx, cy-sy)
    arcangle = atan2((sx-cx) * (ey-cy) - (sy-cy) * (ex-cx), 
                     (sx-cx) * (ex-cx)   (sy-cy) * (ey-cy))
    return (cx, cy, radius, arcangle)

print(arcfromptsdir(0, 0, 2, 0, 0, 1))
print(arcfromptsdir(0, 0, 2, 0, 0.7071, 0.7071))

(1.0, 0.0, 1.0, -3.141592653589793)
(1.0, -1.0, 1.4142135623730951, -1.5707963267948966)
  • Related