-
Notifications
You must be signed in to change notification settings - Fork 0
/
example_curvature.py
69 lines (53 loc) · 1.64 KB
/
example_curvature.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""
Little script to demonstrate positioning a new point in between two points,
and taking curvature into account.
"""
from wgpu.gui.auto import WgpuCanvas, run
import pygfx as gfx
import numpy as np
n1 = np.array([1, 1, 0], np.float32)
n2 = np.array([1, 1, 0], np.float32)
n1 /= np.linalg.norm(n1)
n2 /= np.linalg.norm(n2)
p1 = np.array([10, 0, 0], np.float32)
p2 = np.array([30, 0, 0], np.float32)
dist = np.linalg.norm(p2 - p1)
dirr = p2 - p1
dirr /= dist
ort = np.cross(n1, dirr) + np.cross(n2, dirr)
ort /= np.linalg.norm(ort)
dir1 = -np.cross(n1, ort)
dir2 = +np.cross(n2, ort)
dir1 /= np.linalg.norm(dir1)
dir2 /= np.linalg.norm(dir2)
n = 64
t2 = np.linspace(0, 1, n, dtype=np.float32).reshape(n, 1)
t1 = 1 - t2
# Define position of points in between p1 and p2
curve = t1 * t2
line = t1 * p1 + t2 * p2 # linear
# line = t1 * p1 + t2 * p2 + t1 * curve * n1 * dist + t2 * curve * n2 * dist # normals
line = (
t1 * p1 + t2 * p2 + curve * t1 * dir1 * dist + curve * t2 * dir2 * dist
) # curvature
line_ob = gfx.Line(
gfx.Geometry(positions=line),
gfx.LineMaterial(color="cyan"),
)
points_ob = gfx.Points(
gfx.Geometry(positions=[p1, p2, line[n // 2]]),
gfx.PointsMaterial(color="magenta", size=10),
)
normal_ob = gfx.Line(
gfx.Geometry(positions=[p1, p1 + n1, p2, p2 + n2]),
gfx.LineSegmentMaterial(color="red"),
)
scene = gfx.Scene()
scene.add(line_ob, normal_ob, points_ob)
renderer = gfx.WgpuRenderer(WgpuCanvas())
camera = gfx.OrthographicCamera()
camera.show_object(scene)
controller = gfx.PanZoomController(camera, register_events=renderer)
renderer.request_draw(lambda: renderer.render(scene, camera))
controller
run()