Source code for ddg.math.nets2d

"""Some operations for functions defined on a square-grid.
"""

from ddg.math import euclidean2d


[docs]def dual_vertex_star(f, n1, n2): O = f(n1, n2) A = f(n1 + 1, n2) B = f(n1 + 1, n2 + 1) C = f(n1, n2 + 1) D = f(n1 - 1, n2 + 1) E = f(n1 - 1, n2) F = f(n1 - 1, n2 - 1) G = f(n1, n2 - 1) H = f(n1 + 1, n2 - 1) Os, As, Bs, Cs = euclidean2d.dual_quadrilateral(O, A, B, C) O2, C2, D2, E2 = euclidean2d.dual_quadrilateral(O, C, D, E) t2 = np.dot(Cs, C2) / np.linalg.norm(C2) ** 2 Ds = t2 * D2 Es = t2 * E2 O3, E3, F3, G3 = euclidean2d.dual_quadrilateral(O, E, F, G) t3 = np.dot(Es, E3) / np.linalg.norm(E3) ** 2 Fs = t3 * F3 Gs = t3 * G3 O4, G4, H4, A4 = euclidean2d.dual_quadrilateral(O, G, H, A) t4 = np.dot(Gs, G4) / np.linalg.norm(G4) ** 2 Hs = t4 * H4 return (Os, As, Bs, Cs, Ds, Es, Fs, Gs, Hs)
[docs]def isotherm_test(f, n1, n2): O = f(n1, n2) A = f(n1 + 1, n2) B = f(n1 + 1, n2 + 1) C = f(n1, n2 + 1) D = f(n1 - 1, n2 + 1) E = f(n1 - 1, n2) F = f(n1 - 1, n2 - 1) G = f(n1, n2 - 1) H = f(n1 + 1, n2 - 1) Os, As, Bs, Cs, Ds, Es, Fs, Gs, Hs = euclidean2d.dual_vertex_star(f, n1, n2) return ( np.dot(B - O, Cs - As) + np.dot(D - O, Es - Cs) + np.dot(F - O, Gs - Es) + np.dot(H - O, As - Gs) )
[docs]def Koenigs_face_norm(f, n1, n2): A = f(n1, n2) B = f(n1 + 1, n2) C = f(n1 + 1, n2 + 1) D = f(n1, n2 + 1) return (euclidean2d.diagonals_intersection(A, B, C, D), np.cross(B - A, D - A))
[docs]def Koenigs_vertex_norm(f, n1, n2): O = f(n1, n2) A = f(n1 + 1, n2) B = f(n1 + 1, n2 + 1) C = f(n1, n2 + 1) D = f(n1 - 1, n2 + 1) E = f(n1 - 1, n2) F = f(n1 - 1, n2 - 1) G = f(n1, n2 - 1) H = f(n1 + 1, n2 - 1) M1 = euclidean2d.diagonals_intersection(O, A, B, C) M2 = euclidean2d.diagonals_intersection(O, C, D, E) M3 = euclidean2d.diagonals_intersection(O, E, F, G) M4 = euclidean2d.diagonals_intersection(O, G, H, A) return (O, np.cross(M4 - M3, M2 - M3))
[docs]def Koenigs_face_norm_coplanar_test(f, n1, n2): a1, v1 = Koenigs_face_norm(f, n1, n2) a2, v2 = Koenigs_face_norm(f, n1 - 1, n2) a3, v3 = Koenigs_face_norm(f, n1 - 1, n2 - 1) a4, v4 = Koenigs_face_norm(f, n1, n2 - 1) return ( euclidean2d.distance_lines(a1, v1, a2, v2), euclidean2d.distance_lines(a2, v2, a3, v3), euclidean2d.distance_lines(a3, v3, a4, v4), euclidean2d.distance_lines(a4, v4, a1, v1), )
[docs]def Koenigs_vertex_norm_coplanar_test(f, n1, n2): a1, v1 = Koenigs_vertex_norm(f, n1, n2) a2, v2 = Koenigs_vertex_norm(f, n1 + 1, n2) a3, v3 = Koenigs_vertex_norm(f, n1 + 1, n2 + 1) a4, v4 = Koenigs_vertex_norm(f, n1, n2 + 1) return ( euclidean2d.distance_lines(a1, v1, a2, v2), euclidean2d.distance_lines(a2, v2, a3, v3), euclidean2d.distance_lines(a3, v3, a4, v4), euclidean2d.distance_lines(a4, v4, a1, v1), )