]> granicus.if.org Git - poly2tri-c/commitdiff
Various small API additions
authorBarak Itkin <lightningismyname@gmail.com>
Thu, 26 Apr 2012 21:57:27 +0000 (00:57 +0300)
committerBarak Itkin <lightningismyname@gmail.com>
Thu, 26 Apr 2012 21:57:27 +0000 (00:57 +0300)
refine/math.c
refine/point.c
refine/point.h
refine/vector2.c
refine/vector2.h

index a2e32d7cd0a8f0ded2401e556737a06035717aed..4a6cc6875498cae8d3ee1199c7cdb0e8213f744a 100644 (file)
@@ -1,15 +1,11 @@
 #include <glib.h>\r
 #include "math.h"\r
 \r
-#define EDGE_LEN_SQ(X,Y)  ((X) * (X) + (Y) * (Y))\r
-#define VECTOR2_LEN_SQ(V) (EDGE_LEN_SQ((V)->x, (V)->y))\r
-#define VECTOR2_DOT(V1,V2) ((V1)->x * (V2)->x + (V1)->y * (V2)->y)\r
-\r
 gdouble\r
 p2tr_math_length_sq (gdouble x1, gdouble y1,\r
                      gdouble x2, gdouble y2)\r
 {\r
-  return EDGE_LEN_SQ (x1 - x2, y1 - y2);\r
+  return P2TR_VECTOR2_DISTANCE_SQ2 (x1, y1, x2, y2);\r
 }\r
 \r
 gdouble\r
@@ -80,11 +76,11 @@ p2tr_math_triangle_barcycentric (const P2trVector2 *A,
   p2tr_vector2_sub(P, A, &v2);\r
 \r
   /* Compute dot products */\r
-  dot00 = VECTOR2_DOT(&v0, &v0);\r
-  dot01 = VECTOR2_DOT(&v0, &v1);\r
-  dot02 = VECTOR2_DOT(&v0, &v2);\r
-  dot11 = VECTOR2_DOT(&v1, &v1);\r
-  dot12 = VECTOR2_DOT(&v1, &v2);\r
+  dot00 = P2TR_VECTOR2_DOT(&v0, &v0);\r
+  dot01 = P2TR_VECTOR2_DOT(&v0, &v1);\r
+  dot02 = P2TR_VECTOR2_DOT(&v0, &v2);\r
+  dot11 = P2TR_VECTOR2_DOT(&v1, &v1);\r
+  dot12 = P2TR_VECTOR2_DOT(&v1, &v2);\r
 \r
   /* Compute barycentric coordinates */\r
   invDenom = 1 / (dot00 * dot11 - dot01 * dot01);\r
@@ -160,10 +156,10 @@ p2tr_math_incircle (const P2trVector2 *A,
    * |Dx Dy Dx^2+Dy^2 1|\r
    */\r
   gdouble result = p2tr_matrix_det4 (\r
-      A->x, A->y, VECTOR2_LEN_SQ(A), 1,\r
-      B->x, B->y, VECTOR2_LEN_SQ(B), 1,\r
-      C->x, C->y, VECTOR2_LEN_SQ(C), 1,\r
-      D->x, D->y, VECTOR2_LEN_SQ(D), 1\r
+      A->x, A->y, P2TR_VECTOR2_LEN_SQ(A), 1,\r
+      B->x, B->y, P2TR_VECTOR2_LEN_SQ(B), 1,\r
+      C->x, C->y, P2TR_VECTOR2_LEN_SQ(C), 1,\r
+      D->x, D->y, P2TR_VECTOR2_LEN_SQ(D), 1\r
   );\r
 \r
   if (result > INCIRCLE_EPSILON)\r
@@ -216,6 +212,6 @@ p2tr_math_diametral_lens_contains (const P2trVector2 *X,
   p2tr_vector2_sub(X, W, &WX);\r
   p2tr_vector2_sub(Y, W, &WY);\r
 \r
-  return VECTOR2_DOT(&WX, &WY)\r
+  return P2TR_VECTOR2_DOT(&WX, &WY)\r
       <= 0.5 * p2tr_vector2_norm(&WX) * p2tr_vector2_norm(&WY);\r
 }\r
index 7d920652a9bdd2083ddb6f00bdb935fc1c1d2a87..e4890b81083a34e4728afd1c8abfa63f8207e1b1 100644 (file)
@@ -4,10 +4,17 @@
 
 P2trPoint*
 p2tr_point_new (const P2trVector2 *c)
+{
+  return p2tr_point_new2 (c->x, c->y);
+}
+
+P2trPoint*
+p2tr_point_new2 (gdouble x, gdouble y)
 {
   P2trPoint *self = g_slice_new (P2trPoint);
   
-  p2tr_vector2_copy (&self->c, c);
+  self->c.x = x;
+  self->c.y = y;
   self->mesh = NULL;
   self->outgoing_edges = NULL;
   self->refcount = 1;
@@ -39,12 +46,13 @@ p2tr_point_free (P2trPoint *self)
   g_slice_free (P2trPoint, self);
 }
 
-static P2trEdge*
-_p2tr_point_existing_edge_to (P2trPoint* self, P2trPoint *end)
+P2trEdge*
+p2tr_point_has_edge_to (P2trPoint *start,
+                        P2trPoint *end)
 {
   GList *iter;
   
-  for (iter = self->outgoing_edges; iter != NULL; iter = iter->next)
+  for (iter = start->outgoing_edges; iter != NULL; iter = iter->next)
     {
       P2trEdge *edge = (P2trEdge*) iter->data;
       if (edge->end == end)
@@ -58,7 +66,7 @@ P2trEdge*
 p2tr_point_get_edge_to (P2trPoint *start,
                         P2trPoint *end)
 {
-    P2trEdge* result = _p2tr_point_existing_edge_to (start, end);
+    P2trEdge* result = p2tr_point_has_edge_to (start, end);
     if (result == NULL)
       p2tr_exception_programmatic ("Tried to get an edge that doesn't exist!");
     else
index 81d513a107f4e2031de4677e06d97c7325db789d..ad164120e4685200592e11a41b9b8505fce7cb02 100644 (file)
@@ -29,6 +29,8 @@ struct P2trPoint_
 
 P2trPoint*  p2tr_point_new                  (const P2trVector2 *c);
 
+P2trPoint*  p2tr_point_new2                 (gdouble x, gdouble y);
+
 void        p2tr_point_ref                  (P2trPoint *self);
 
 void        p2tr_point_unref                (P2trPoint *self);
index 485356753fa6d68fc91d07b62feeecc429f4f1f3..45a6b7f239aae6e2fbc3aaa3b9e99125b669b040 100644 (file)
@@ -6,7 +6,7 @@ gdouble
 p2tr_vector2_dot (const P2trVector2 *a,\r
                   const P2trVector2 *b)\r
 {\r
-  return a->x * b->x + a->y * b->y;\r
+  return P2TR_VECTOR2_DOT (a, b);\r
 }\r
 \r
 gboolean\r
@@ -40,7 +40,7 @@ p2tr_vector2_center (const P2trVector2 *a,
 gdouble\r
 p2tr_vector2_norm (const P2trVector2 *v)\r
 {\r
-  return sqrt (v->x * v->x + v->y * v->y);\r
+  return sqrt (P2TR_VECTOR2_LEN_SQ (v));\r
 }\r
 \r
 void\r
index 8fe7a611831eb95cd23bde5d1eee5627f33c367f..08386ad4679e417c3d82f7096f17f04bb7cf9153 100644 (file)
@@ -14,6 +14,21 @@ typedef struct {
   gdouble y;\r
 } P2trVector2;\r
 \r
+#define P2TR_VECTOR2_LEN_SQ2(X, Y)              \\r
+    ((X) * (X) + (Y) * (Y))\r
+\r
+#define P2TR_VECTOR2_LEN_SQ(V)                  \\r
+    (P2TR_VECTOR2_LEN_SQ2((V)->x, (V)->y))\r
+\r
+#define P2TR_VECTOR2_DOT(V1,V2)                 \\r
+    ((V1)->x * (V2)->x + (V1)->y * (V2)->y)\r
+\r
+#define P2TR_VECTOR2_DISTANCE_SQ2(X1,Y1,X2,Y2)  \\r
+    (P2TR_VECTOR2_LEN_SQ2((X1) - (X2), (Y1) - (Y2)))\r
+\r
+#define P2TR_VECTOR2_DISTANCE_SQ(V1,V2)         \\r
+    (P2TR_VECTOR2_DISTANCE_SQ2((V1)->x, (V1)->y, (V2)->x, (V2)->y))\r
+\r
 /** Compute the dot product of two vectors */\r
 gdouble       p2tr_vector2_dot       (const P2trVector2 *a, const P2trVector2 *b);\r
 \r