v0.14.0
Loading...
Searching...
No Matches
sdf_wavy_2d.py
Go to the documentation of this file.
1import numpy as np
2from scipy.optimize import brentq
3
4A = 0.0002
5wave_len = 2
6w = 2. * np.pi / wave_len
7ind = 0.00159624
8
10 def F(p, x, y, t):
11 q = A * (1. - np.cos(w * p)) - ind * t
12 lag = 2. * (y - q)
13 return 2. * (p - x) - lag * A * w * np.sin(w * p)
14
15 def dist(x, y, a, b, t):
16 try:
17 p0 = brentq(WavySurface.F, a, b, args=(x, y, t))
18 q0 = A * (1. - np.cos(w * p0)) - ind * t
19 return np.sqrt((p0 - x)**2 + (q0 - y)**2)
20 except ValueError:
21 return 1e12
22
23 def sDF(x, y,z, t):
24 y0 = A * (1. - np.cos(w * x)) - ind * t
25 if np.any(np.abs(y0 - y)) < 1e-12:
26 return 0.0
27
28 x = np.abs(x) % wave_len
29 x = np.where(x > wave_len / 2, wave_len - x, x)
30
31 eps = 1e-12
32
33 d1 = np.vectorize(WavySurface.dist)(x, y, eps, wave_len / 2 - eps, t)
34 wave_y = A * (1 - np.cos(w * x)) - ind * t
35 sgn_d1 = np.sign(wave_y - y)
36
37 wave_y_d2 = -ind * t
38 sgn_d2 = np.sign(wave_y_d2 - y)
39 d2 = np.sqrt(x**2 + (wave_y_d2 - y)**2) # when xp to be 0
40
41 wave_y_d3 = A * (1 - np.cos(w * (wave_len / 2))) - ind * t
42 sgn_d3 = np.sign(wave_y_d3 - y)
43 d3 = np.sqrt((wave_len / 2 - x)**2 + (A * (1 - np.cos(w * (wave_len / 2))) - ind * t - y)**2) # when xp to be wave_len/2
44
45 d_min = np.minimum(d2, d3)
46 d_final = np.where(d1 < d_min, d1, np.where(d2 < d3, d2, d3))
47 sgn_final = np.where(d1 < d_min, sgn_d1, np.where(d2 < d3, sgn_d2, sgn_d3))
48 sdf = sgn_final * d_final
49 return sdf
50
51
52 def gradSDF(x, y, z, t):
53 delta = 1e-6
54 df_dx = ((WavySurface.sDF(x + delta, y, z, t) - WavySurface.sDF(x - delta, y, z, t)) / (2 * delta)).reshape((-1, 1))
55 df_dy = ((WavySurface.sDF(x, y + delta,z, t) - WavySurface.sDF(x, y - delta,z, t)) / (2 * delta)).reshape((-1, 1))
56 df_dz = np.zeros_like(df_dy).reshape((-1, 1))
57 return np.hstack([df_dx, df_dy, df_dz])
58
59 def hessSDF(x, y, z, t):
60 delta = 1e-6
61 df2_dx2 = (WavySurface.sDF(x + delta, y,z,t) - 2 * WavySurface.sDF(x, y,z,t) + WavySurface.sDF(x - delta, y,z, t)) / (delta ** 2)
62 df2_dy2 = (WavySurface.sDF(x, y + delta,z,t) - 2 * WavySurface.sDF(x, y,z,t) + WavySurface.sDF(x, y - delta,z, t)) / (delta ** 2)
63 df2_dxdy = (WavySurface.sDF(x + delta, y + delta,z,t) - WavySurface.sDF(x + delta, y - delta, z, t) - WavySurface.sDF(x - delta, y + delta,z, t) + WavySurface.sDF(x - delta, y - delta,z,t)) / (4 * delta ** 2)
64
65 return np.hstack([df2_dx2.reshape((-1,1)), df2_dxdy.reshape((-1,1)), np.zeros_like(df2_dy2).reshape((-1,1)),df2_dy2.reshape((-1,1)), np.zeros_like(df2_dy2).reshape((-1,1)), np.zeros_like(df2_dy2).reshape((-1,1))])
66
67def sdf(delta_t, t, x, y, z, tx, ty, tz, block_id):
68 return WavySurface.sDF(x, y, z, t)
69
70def grad_sdf(delta_t, t, x, y, z, tx, ty, tz, block_id):
71 return WavySurface.gradSDF(x, y,z, t)
72
73def hess_sdf(delta_t, t, x, y, z, tx, ty, tz, block_id):
74 return WavySurface.hessSDF(x, y,z, t)
dist(x, y, a, b, t)
@ F
hess_sdf(delta_t, t, x, y, z, tx, ty, tz, block_id)
grad_sdf(delta_t, t, x, y, z, tx, ty, tz, block_id)
Definition sdf.py:1