Skip to content

Conversation

@kushalkolar
Copy link
Member

@kushalkolar kushalkolar commented Oct 21, 2025

closes #560

Uses instanced meshes to create the 3D vector representations and place them in 3D space.

  • VectorsGraphic graphic which is based on instanced meshes built by merging a cone and cylinder mesh.
    • VectorDirections which manages the positions of the arrows through modifying the translation elements of the transform matrix of the instance buffer
    • VectorDirections which manages the directions of the arrows through modifying the entire transform matrix of the instance buffer
    • supports static immutable single colors for now
    • auto-determines size of the arrows by estimating the density of vectors, or user can provide a specific size or specific shape for the arrows.

Can implement per-vector colors after pygfx/pygfx#1221 later in a future PR.

image

Can do some fun electromagnetism animations with this.

Very simple API:

figure = fpl.Figure(size=(700, 700))

start, stop, step = 0, 2 * np.pi, 0.2

# get uniform x, y positions
x, y = np.meshgrid(
    np.arange(start, stop, step),
    np.arange(start, stop, step)
)

# vectors, u and v indicate directions in x and y
u = np.cos(x)
v = np.sin(y)

# positions of each vector as [n_points, 2] array
positions = np.column_stack([x.ravel(), y.ravel()])

# directions of each vector as a [n_points, 2] array
directions = np.column_stack([u.ravel(), v.ravel()])

vectors = figure[0, 0].add_vectors(
    positions=positions,
    directions=directions,
)

figure.show()

Copy link
Member Author

@kushalkolar kushalkolar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

few questions

@kushalkolar
Copy link
Member Author

Interactions work well:

vectors-2025-10-28_01.52.43.mp4
figure = fpl.Figure(size=(700, 700))

start, stop, step = 0, 2 * np.pi, 0.4

# get uniform x, y positions
x, y = np.meshgrid(np.arange(start, stop, step), np.arange(start, stop, step))

# vectors, u and v are x and y components indication directions
u = np.cos(x)
v = np.sin(y)

# positions of each vector as [n_points, 2] array
positions = np.column_stack([x.ravel(), y.ravel()])
# directions of each vector as a [n_points, 2] array
directions = np.column_stack([u.ravel(), v.ravel()])


vector_field = figure[0, 0].add_vector_field(
    positions=positions,
    directions=directions,
)

def update(change):
    val = change["new"]
    start, stop, step = 0, 2 * np.pi, 0.4
    start += val
    stop += val
    
    # get uniform x, y positions
    x, y = np.meshgrid(np.arange(start, stop, step), np.arange(start, stop, step))
    
    # vectors, u and v are x and y components indication directions
    u = np.cos(x)
    v = np.sin(y)
    
    directions = np.column_stack([u.ravel(), v.ravel()])
    
    vector_field.directions = directions

slider = FloatSlider(value=0, min=-5, max=5, step=0.01)
slider.observe(update, "value")

VBox([figure.show(), slider])

Need to wait for pygfx/pylinalg#107
and pygfx/pygfx#1220

before merging into fastplotlib main

@kushalkolar kushalkolar marked this pull request as ready for review October 30, 2025 19:42
@kushalkolar
Copy link
Member Author

The recursion error with the ome-zarr file makes no sense, going to get rid of it from tests and only show the code in the docs until they fix whatever is up.

@github-actions
Copy link

github-actions bot commented Oct 30, 2025

📚 Docs preview built and uploaded! https://www.fastplotlib.org/ver/vector-field

@kushalkolar kushalkolar changed the title Vector field VectorsGraphic Nov 2, 2025
Copy link
Member

@clewis7 clewis7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aside from that one example that won't run, everything LGTM

@kushalkolar kushalkolar merged commit 61b0c01 into main Nov 4, 2025
36 checks passed
@kushalkolar kushalkolar deleted the vector-field branch November 4, 2025 00:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VectorsGraphic

4 participants