From a5c6374b77610cb2bcb794551475e092d990ef8b Mon Sep 17 00:00:00 2001 From: rodri Date: Sun, 29 Jan 2023 23:11:05 +0000 Subject: libgeometry revamp --- sys/src/libgeometry/triangle.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 sys/src/libgeometry/triangle.c (limited to 'sys/src/libgeometry/triangle.c') diff --git a/sys/src/libgeometry/triangle.c b/sys/src/libgeometry/triangle.c new file mode 100644 index 000000000..1ed6cfcda --- /dev/null +++ b/sys/src/libgeometry/triangle.c @@ -0,0 +1,40 @@ +#include +#include +#include + +/* 2D */ + +Point2 +centroid(Triangle2 t) +{ + return divpt2(addpt2(t.p0, addpt2(t.p1, t.p2)), 3); +} + +/* + * based on the implementation from: + * + * Dmitry V. Sokolov, “Tiny Renderer: Lesson 2”, + * https://github.com/ssloy/tinyrenderer/wiki/Lesson-2:-Triangle-rasterization-and-back-face-culling + */ +Point3 +barycoords(Triangle2 t, Point2 p) +{ + Point2 p0p1 = subpt2(t.p1, t.p0); + Point2 p0p2 = subpt2(t.p2, t.p0); + Point2 pp0 = subpt2(t.p0, p); + + Point3 v = crossvec3(Vec3(p0p2.x, p0p1.x, pp0.x), Vec3(p0p2.y, p0p1.y, pp0.y)); + + /* handle degenerate triangles—i.e. the ones where every point lies on the same line */ + if(fabs(v.z) < 1) + return Pt3(-1,-1,-1,1); + return Pt3(1 - (v.x + v.y)/v.z, v.y/v.z, v.x/v.z, 1); +} + +/* 3D */ + +Point3 +centroid3(Triangle3 t) +{ + return divpt3(addpt3(t.p0, addpt3(t.p1, t.p2)), 3); +} -- cgit v1.2.3