// Last edited on 2024-05-01 18:31:46 by stolfi #include "bez.inc" #macro retalho_p(P, U, V) #local p0 = bez_pos(V, P[0][0], P[0][1], P[0][2], P[0][3]); #local p1 = bez_pos(V, P[1][0], P[1][1], P[1][2], P[1][3]); #local p2 = bez_pos(V, P[2][0], P[2][1], P[2][2], P[2][3]); #local p3 = bez_pos(V, P[3][0], P[3][1], P[3][2], P[3][3]); #local p = bez_pos(U, p0, p1, p2, p3); p #end #macro retalho_dpdV(P, U, V) #local dp0dV = bez_diff(V, P[0][0], P[0][1], P[0][2], P[0][3]); #local dp1dV = bez_diff(V, P[1][0], P[1][1], P[1][2], P[1][3]); #local dp2dV = bez_diff(V, P[2][0], P[2][1], P[2][2], P[2][3]); #local dp3dV = bez_diff(V, P[3][0], P[3][1], P[3][2], P[3][3]); #local dpdV = bez_pos(U, dp0dV, dp1dV, dp2dV, dp3dV); dpdV #end #macro retalho_dpdU(P, U, V) #local dp0dU = bez_diff(U, P[0][0], P[1][0], P[2][0], P[3][0]); #local dp1dU = bez_diff(U, P[0][1], P[1][1], P[2][1], P[3][1]); #local dp2dU = bez_diff(U, P[0][2], P[1][2], P[2][2], P[3][2]); #local dp3dU = bez_diff(U, P[0][3], P[1][3], P[2][3], P[3][3]); #local dpdU = bez_pos(v, dp0dU, dp1dU, dp2dU, dp3dU); dpdU #end #macro retalho_normal(P, U, V) #local dpdU = retalho_dpdU(P, U, V); #local dpdV = retalho_dpdV(P, U, V); #local norm = vnormalize(vcross(dpdU, dpdV)) norm #end