From c29e4ecb7de4cb10f48b2526bc1abae847c718e2 Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 28 Dec 2017 01:19:45 +0100 Subject: Add new geometry common types and functions Signed-off-by: pacien --- src/common/geom.c | 27 ++++++++++++++++++++++++++- src/morpher/trianglemap.c | 2 +- 2 files changed, 27 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/common/geom.c b/src/common/geom.c index 219270f..eb35727 100644 --- a/src/common/geom.c +++ b/src/common/geom.c @@ -1,6 +1,12 @@ #include "common/geom.h" +#include +#include #include "morpher/matrix.h" +static inline IntVector int_round(RealVector x) { + return (IntVector) round(x); +} + CartesianMapping m(int x, int y) { return (CartesianMapping) {{x, y}, {x, y}}; @@ -10,6 +16,10 @@ CartesianVector v(int x, int y) { return (CartesianVector) {x, y}; } +BarycentricVector b(double a, double b) { + return (BarycentricVector) {a, b}; +} + bool mappings_equals(CartesianMapping m1, CartesianMapping m2) { return vector_equals(m1.origin, m2.origin) && vector_equals(m1.target, m2.target); } @@ -18,7 +28,22 @@ bool vector_equals(CartesianVector v1, CartesianVector v2) { return v1.x == v2.x && v1.y == v2.y; } -IntVector triangle_area(CartesianVector v1, CartesianVector v2, CartesianVector v3) { +bool barycentric_vector_equals(BarycentricVector b1, BarycentricVector b2) { + return b1.a == b2.a && b1.b == b2.b; +} + +IntVector square_area(CartesianVector v1, CartesianVector v2, CartesianVector v3) { return matrix_int_det2(v1.x - v3.x, v2.x - v3.x, v1.y - v3.y, v2.y - v3.y); } + +BarycentricVector cartesian_to_barycentric(Triangle t, CartesianVector p) { + RealVector total_area = square_area(t.v[0], t.v[1], t.v[2]); + return (BarycentricVector) {square_area(t.v[1], t.v[2], p) / total_area, + square_area(t.v[2], t.v[0], p) / total_area}; +} + +CartesianVector barycentric_to_cartesian(Triangle t, BarycentricVector p) { + return (CartesianVector) {int_round(p.a * (t.v[0].x - t.v[2].x) + p.b * (t.v[1].x - t.v[2].x) + t.v[2].x), + int_round(p.a * (t.v[0].y - t.v[2].y) + p.b * (t.v[1].y - t.v[2].y) + t.v[2].y)}; +} diff --git a/src/morpher/trianglemap.c b/src/morpher/trianglemap.c index e2f3eb9..ad526bc 100644 --- a/src/morpher/trianglemap.c +++ b/src/morpher/trianglemap.c @@ -30,7 +30,7 @@ TriangleMap *trianglemap_to(TriangleMap *t, CartesianVector v) { int edge; for (edge = 0; edge < 3; ++edge) - if (triangle_area(t->vertices[edge].origin, t->vertices[(edge + 1) % 3].origin, v) > 0) + if (square_area(t->vertices[edge].origin, t->vertices[(edge + 1) % 3].origin, v) > 0) return t->neighbors[edge]; return t; -- cgit v1.2.3