1
0
Fork 0
mirror of https://github.com/Findus23/rebound-collisions.git synced 2024-09-19 15:53:48 +02:00
rebound-collisions/visualize_collision.py

77 lines
2.4 KiB
Python
Raw Permalink Normal View History

2021-01-21 16:45:31 +01:00
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.figure import Figure
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import Axes3D, proj3d
from extradata import ExtraData, CollisionMeta
2021-05-03 16:31:30 +02:00
from utils import filename_from_argv, plot_settings, is_ci
2021-01-21 16:45:31 +01:00
fn = filename_from_argv()
2021-02-04 17:29:01 +01:00
ed = ExtraData.load(fn)
2021-01-21 16:45:31 +01:00
plot_settings()
2021-01-21 16:45:31 +01:00
def get_circle(dx, dy, dz, r):
u, v = np.mgrid[0:2 * np.pi:40j, 0:np.pi:20j]
x = r * np.cos(u) * np.sin(v) + dx
y = r * np.sin(u) * np.sin(v) + dy
z = r * np.cos(v) + dz
return x, y, z
class Arrow3D(FancyArrowPatch):
"""
https://stackoverflow.com/a/11156353/4398037
"""
def __init__(self, xs, ys, zs, *args, **kwargs):
FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
self._verts3d = xs, ys, zs
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
FancyArrowPatch.draw(self, renderer)
for collision in ed.tree.get_tree().values():
meta: CollisionMeta = collision["meta"]
fig: Figure = plt.figure()
ax: Axes3D = fig.gca(projection='3d')
i = 0
for pos, vel, r in zip(meta.collision_positions, meta.collision_velocities, meta.collision_radii):
print(pos, vel, r)
circle_coords = get_circle(*pos, r)
2022-01-30 19:52:11 +01:00
ax.plot_wireframe(*circle_coords, color=f"C{i}", linewidths=.75)
2021-01-21 16:45:31 +01:00
a = Arrow3D(*[(p, p + v / 100000) for p, v in zip(pos, vel)], mutation_scale=20,
lw=1, arrowstyle="-|>", color="k")
ax.add_artist(a)
i += 1
2022-01-30 19:52:11 +01:00
print("title", f"angle={meta.input.alpha:.2f}, v/v_esc={meta.input.velocity_esc:.2f}")
# ax.set_title(f"angle={meta.input.alpha:.2f}, v/v_esc={meta.input.velocity_esc:.2f}")
2021-01-21 16:45:31 +01:00
xyzlim = np.array([ax.get_xlim3d(), ax.get_ylim3d(), ax.get_zlim3d()]).T
diff = min(xyzlim[0] - xyzlim[1])
print(xyzlim)
print(diff)
xmin, _ = ax.get_xlim3d()
ax.set_xlim3d((xmin, xmin - diff))
ymin, _ = ax.get_ylim3d()
ax.set_ylim3d((ymin, ymin - diff))
zmin, _ = ax.get_zlim3d()
ax.set_zlim3d((zmin, zmin - diff))
# ax.set_ylim3d(XYZlim)
# ax.set_zlim3d(XYZlim * 3/4)
2022-01-30 19:52:11 +01:00
ax.set_zticklabels([])
ax.set_yticklabels([])
ax.set_xticklabels([])
fig.tight_layout()
2021-05-03 16:31:30 +02:00
if not is_ci():
plt.savefig("/home/lukas/tmp/3d.pdf")
2021-01-21 16:45:31 +01:00
plt.show()