Adapted from

This example uses transform matrices to create an arm. The angle of each segment is controlled with the mouse_x and mouse_y position. The transformations applied to the first segment are also applied to the second segment because they are inside the same push() and pop() matrix group.

from proceso import Sketch

p5 = Sketch()
p5.describe("Two white line segments connected at a joint move like a human arm.")

x: float
y: float
seg_length = 100

def setup():
    p5.create_canvas(720, 400)

    # Stroke with a semi-transparent white
    p5.stroke(255, 160)

    # Position the "shoulder" of the arm in the center of the canvas
    global x, y
    x = p5.width * 0.5
    y = p5.height * 0.5

def draw():

    # Change the angle of the segments according to the mouse positions
    angle_1 = (p5.mouse_x / p5.width - 0.5) * -p5.TWO_PI
    angle_2 = (p5.mouse_y / p5.height - 0.5) * p5.PI

    # use push and pop to "contain" the transforms. Note that
    # even though we draw the segments using a custom function,
    # the transforms still accumulate
    segment(x, y, angle_1)
    segment(seg_length, 0, angle_2)

# a custom function for drawing segments
def segment(x, y, a):
    p5.translate(x, y)
    p5.line(0, 0, seg_length, 0)

p5.run_sketch(setup=setup, draw=draw)

View sketch