Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-04-03 14:47:03 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-04-03 14:47:03 +0400
commit5770d691bbed31d05ecf22383f56df2a4371acfa (patch)
tree54b0ee57d35e4ca3b66b4bc4a44bdf51c807aee3 /source/blender/blenlib/intern/convexhull2d.c
parent51abc2becd602676eeebc24ba7dc64c804bb935a (diff)
Optimize BLI_convexhull_aabb_fit_hull_2d, avoid atan2, sin, cos
add utility functions for using a 2d unit vector as a rotation matrix mul_v2_v2_cw & mul_v2_v2_ccw
Diffstat (limited to 'source/blender/blenlib/intern/convexhull2d.c')
-rw-r--r--source/blender/blenlib/intern/convexhull2d.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/source/blender/blenlib/intern/convexhull2d.c b/source/blender/blenlib/intern/convexhull2d.c
index 2c29ef042a1..9f509638e3b 100644
--- a/source/blender/blenlib/intern/convexhull2d.c
+++ b/source/blender/blenlib/intern/convexhull2d.c
@@ -253,28 +253,24 @@ float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], unsigned in
{
unsigned int i, i_prev;
float area_best = FLT_MAX;
- float angle_best = 0.0f;
+ float dvec_best[2]; /* best angle, delay atan2 */
i_prev = n - 1;
for (i = 0; i < n; i++) {
const float *ev_a = points_hull[i];
const float *ev_b = points_hull[i_prev];
- float dvec[2];
+ float dvec[2]; /* 2d rotation matrix */
sub_v2_v2v2(dvec, ev_a, ev_b);
if (normalize_v2(dvec) != 0.0f) {
- float mat[2][2];
+ /* rotation matrix */
float min[2] = {FLT_MAX, FLT_MAX}, max[2] = {-FLT_MAX, -FLT_MAX};
-
unsigned int j;
- const float angle = atan2f(dvec[0], dvec[1]);
float area;
- angle_to_mat2(mat, angle);
-
for (j = 0; j < n; j++) {
float tvec[2];
- mul_v2_m2v2(tvec, mat, points_hull[j]);
+ mul_v2_v2_cw(tvec, dvec, points_hull[j]);
min[0] = min_ff(min[0], tvec[0]);
min[1] = min_ff(min[1], tvec[1]);
@@ -290,14 +286,14 @@ float BLI_convexhull_aabb_fit_hull_2d(const float (*points_hull)[2], unsigned in
if (area < area_best) {
area_best = area;
- angle_best = angle;
+ copy_v2_v2(dvec_best, dvec);
}
}
i_prev = i;
}
- return angle_best;
+ return (area_best != FLT_MAX) ? atan2f(dvec_best[0], dvec_best[1]) : 0.0f;
}
/**