geometrycomputational-geometryspiral

How change the spiral movement in 2D space?


I have two points in 2D space as we can see in the figure to move from the blue point to the red points we can use the equation (1). Where b is a constant used to limit the shape of the logarithmic spiral, l is a random number in [−1,1], which is used to control the indentation effect of the movement, D indicates the distance between blue points and the current point

enter image description here

I need another movement that can move from blue points to the red points like in the figure

enter image description here


Solution

  • You can use sinusoidal model.

    For start point (X0, Y0) and end point (X1,Y1) we have vector end-start, determine it's length - distance between points L, and angle of vector Fi (using atan2).

    Then generate sinusoidal curve for some standard situation - for example, along OX axis, with magnitude A, N periods for distance 2 * Pi * N:

    Scaled sinusoid in intermediate point with parameter t, where t is in range 0..1 (t=0 corresponds to start point (X0,Y0))

    X(t) = t * L
    Y(t) =  A * Sin(2 * N * Pi * t)
    

    Then shift and rotate sinusoid using X and Y calculated above

    X_result = X0 + X * Cos(Fi) - Y * Sin(Fi)
    Y_result = Y0 + X * Sin(Fi) + Y * Cos(Fi)
    

    Example Python code:

    import math
    x0 = 100
    y0 = 100
    x1 = 400
    y1 = 200
    nperiods = 4
    amp = 120
    nsteps = 20
    leng = math.hypot(x1 - x0, y1 - y0)
    an = math.atan2(y1 - y0, x1 - x0)
    arg =  2 * nperiods* math.pi
    points = []
    for t in range(1, nsteps + 1):
        r = t / nsteps
        xx = r * leng
        yy =  amp * math.sin(arg * r)
        rx = x0 + xx * math.cos(an) - yy * math.sin(an)
        ry = y0 + xx * math.sin(an) + yy * math.cos(an)
        points.append([rx, ry])
    print(points)
    

    Draw points:

    enter image description here