Archived post by SniperJake945

I donno how many people here have every tried converting to and from barycentric coordinates, but assuming you can project your triangle so that all points lie on the x and y axis (this is easy peasy with dihedral), this is my favorite method of finding where a point is within a triangle:
“`c //pts is the three points in your triangle matrix3 gen_bary_mat(vector pts[]){ matrix3 m = set( pts[0].x, pts[0].y, 1, pts[1].x, pts[1].y, 1, pts[2].x, pts[2].y, 1); return m; } vector tri_pts[] = array({10, 4, 1}, {3,2,1}, {0, 10, 1}); vector test_pt = {6, 5, 1}; matrix3 bary_matrix = gen_bary_mat(tri_pts); vector bary_pt = test_pt * invert(bary_matrix); //solution by inversion, this is big brain printf(“bary coords: %g \n”, bary_pt); “`

this means u can pre-compute the transformation needed to project a point into bary coords

which is realllllllllllllllllllllllllllllllllllly fuckin nice if u need to do that a bunch

this also extends to tets as well, but it’d be a 4×4 matrix instead of a 3×3

it helps if everything is actually aligned to the z-1 axis, so if z is set to 1, then you can invert the solution as well to convert back to cartesian coordinates

i like to do my triangle projection with dihedral so u don’t have to worry about any kind of scaling being applied to the triangle, like so:
“`c //this would gooooooooooooo in a prim wrangle, and then ud call the resulting trs matrix in a point wrangle to apply the positional changes //big brain matrix3 m = dihedral(v@N, set(0,0,1)); matrix trs = m; matrix mov_to_orig = ident(); matrix mov_z = ident();
translate(mov_to_orig, v@P); translate(mov_z, set(0,0,1));
trs = invert(mov_to_orig) * m * mov_z; “`

iono how useful this is, but ive had to do this kind of stuff a lot on one of the projects im working on

so i thought id share it

en.wikipedia.org/wiki/Barycentric_coordinate_system#Conversion_between_barycentric_and_Cartesian_coordinates the matrix form comes from the bottom of this section. solution by inversion is just the easiest way of solving that system in houdini currently. especially since it’s a 3×3