Math Library: add functions cross_poly_v2, cross_tri_v2

also added utility macro for removing elements in the middle of an array
This commit is contained in:
Campbell Barton 2013-11-30 15:57:16 +11:00
parent 8aff45d8f6
commit 5910531318
4 changed files with 43 additions and 22 deletions

View File

@ -54,14 +54,17 @@ void cent_quad_v3(float r[3], const float a[3], const float b[3], const float c[
float normal_tri_v3(float r[3], const float a[3], const float b[3], const float c[3]);
float normal_quad_v3(float r[3], const float a[3], const float b[3], const float c[3], const float d[3]);
float area_tri_v2(const float a[2], const float b[2], const float c[2]);
float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2]);
MINLINE float area_tri_v2(const float a[2], const float b[2], const float c[2]);
MINLINE float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2]);
float area_tri_v3(const float a[3], const float b[3], const float c[3]);
float area_tri_signed_v3(const float v1[3], const float v2[3], const float v3[3], const float normal[3]);
float area_quad_v3(const float a[3], const float b[3], const float c[3], const float d[3]);
float area_poly_v3(int nr, float verts[][3], const float normal[3]);
float area_poly_v2(int nr, float verts[][2]);
MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float v3[2]);
float cross_poly_v2(int nr, float verts[][2]);
/********************************* Planes **********************************/
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3]);

View File

@ -300,6 +300,12 @@
#define ARRAY_HAS_ITEM(arr_item, arr_start, tot) \
((unsigned int)((arr_item) - (arr_start)) < (unsigned int)(tot))
#define ARRAY_DELETE(arr, index, tot_delete, tot) { \
BLI_assert(index + tot_delete <= tot); \
memmove(&(arr)[(index)], \
&(arr)[(index) + (tot_delete)], \
(((tot) - (index)) - (tot_delete)) * sizeof(*(arr))); \
} (void)0
/* Warning-free macros for storing ints in pointers. Use these _only_
* for storing an int in a pointer, not a pointer in an int (64bit)! */

View File

@ -88,16 +88,6 @@ float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const flo
return normalize_v3(n);
}
float area_tri_v2(const float v1[2], const float v2[2], const float v3[2])
{
return 0.5f * fabsf((v1[0] - v2[0]) * (v2[1] - v3[1]) + (v1[1] - v2[1]) * (v3[0] - v2[0]));
}
float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2])
{
return 0.5f * ((v1[0] - v2[0]) * (v2[1] - v3[1]) + (v1[1] - v2[1]) * (v3[0] - v2[0]));
}
/* only convex Quadrilaterals */
float area_quad_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
{
@ -157,30 +147,35 @@ float area_poly_v3(int nr, float verts[][3], const float normal[3])
area = 0.0f;
for (a = 0; a < nr; a++) {
area += (co_curr[px] - co_prev[px]) * (co_curr[py] + co_prev[py]);
co_prev = verts[a];
co_curr = verts[a + 1];
co_prev = co_curr;
co_curr += 3;
}
return fabsf(0.5f * area / max);
}
float area_poly_v2(int nr, float verts[][2])
float cross_poly_v2(int nr, float verts[][2])
{
int a;
float area;
float *co_curr, *co_prev;
float cross;
const float *co_curr, *co_prev;
/* The Trapezium Area Rule */
co_prev = verts[nr - 1];
co_curr = verts[0];
area = 0.0f;
cross = 0.0f;
for (a = 0; a < nr; a++) {
area += (co_curr[0] - co_prev[0]) * (co_curr[1] + co_prev[1]);
co_prev = verts[a];
co_curr = verts[a + 1];
cross += (co_curr[0] - co_prev[0]) * (co_curr[1] + co_prev[1]);
co_prev = co_curr;
co_curr += 2;
}
return fabsf(0.5f * area);
return cross;
}
float area_poly_v2(int nr, float verts[][2])
{
return fabsf(0.5f * cross_poly_v2(nr, verts));
}
/********************************* Planes **********************************/

View File

@ -34,6 +34,23 @@
#include <string.h>
/********************************** Polygons *********************************/
MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float v3[2])
{
return (v1[0] - v2[0]) * (v2[1] - v3[1]) + (v1[1] - v2[1]) * (v3[0] - v2[0]);
}
MINLINE float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2])
{
return 0.5f * ((v1[0] - v2[0]) * (v2[1] - v3[1]) + (v1[1] - v2[1]) * (v3[0] - v2[0]));
}
MINLINE float area_tri_v2(const float v1[2], const float v2[2], const float v3[2])
{
return fabsf(area_tri_signed_v2(v1, v2, v3));
}
/****************************** Spherical Harmonics **************************/
MINLINE void zero_sh(float r[9])