Revision: 55827
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55827
Author:   campbellbarton
Date:     2013-04-05 19:26:33 +0000 (Fri, 05 Apr 2013)
Log Message:
-----------
add BM_face_calc_center_mean_weighted() gives much better result at cost of 
some speed.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c   2013-04-05 
17:57:26 UTC (rev 55826)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c   2013-04-05 
19:26:33 UTC (rev 55827)
@@ -337,6 +337,34 @@
 }
 
 /**
+ * computes the center of a face, using the mean average
+ * weighted by edge length
+ */
+void BM_face_calc_center_mean_weighted(BMFace *f, float r_cent[3])
+{
+       BMLoop *l_iter;
+       BMLoop *l_first;
+       float totw = 0.0f;
+       float w_prev;
+
+       zero_v3(r_cent);
+
+
+       l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+       w_prev = BM_edge_calc_length(l_iter->prev->e);
+       do {
+               const float w_curr = BM_edge_calc_length(l_iter->e);
+               const float w = (w_curr + w_prev);
+               madd_v3_v3fl(r_cent, l_iter->v->co, w);
+               totw += w;
+               w_prev = w_curr;
+       } while ((l_iter = l_iter->next) != l_first);
+
+       if (totw != 0.0f)
+               mul_v3_fl(r_cent, 1.0f / (float) totw);
+}
+
+/**
  * COMPUTE POLY PLANE
  *
  * Projects a set polygon's vertices to

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h   2013-04-05 
17:57:26 UTC (rev 55826)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h   2013-04-05 
19:26:33 UTC (rev 55827)
@@ -37,6 +37,7 @@
 float BM_face_calc_perimeter(BMFace *f);
 void  BM_face_calc_center_bounds(BMFace *f, float center[3]);
 void  BM_face_calc_center_mean(BMFace *f, float center[3]);
+void  BM_face_calc_center_mean_weighted(BMFace *f, float center[3]);
 
 void  BM_face_normal_update(BMFace *f);
 void  BM_face_normal_update_vcos(BMesh *bm, BMFace *f, float no[3],

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c  2013-04-05 
17:57:26 UTC (rev 55826)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c  2013-04-05 
19:26:33 UTC (rev 55827)
@@ -1627,7 +1627,23 @@
        return Vector_CreatePyObject(cent, 3, Py_NEW, NULL);
 }
 
+PyDoc_STRVAR(bpy_bmface_calc_center_mean_weighted_doc,
+".. method:: calc_center_median_weighted()\n"
+"\n"
+"   Return median center of the face weighted by edge lengths.\n"
+"\n"
+"   :return: a 3D vector.\n"
+"   :rtype: :class:`mathutils.Vector`\n"
+);
+static PyObject *bpy_bmface_calc_center_mean_weighted(BPy_BMFace *self)
+{
+       float cent[3];
 
+       BPY_BM_CHECK_OBJ(self);
+       BM_face_calc_center_mean_weighted(self->f, cent);
+       return Vector_CreatePyObject(cent, 3, Py_NEW, NULL);
+}
+
 PyDoc_STRVAR(bpy_bmface_calc_center_bounds_doc,
 ".. method:: calc_center_bounds()\n"
 "\n"
@@ -2482,6 +2498,7 @@
        {"calc_area",          (PyCFunction)bpy_bmface_calc_area,          
METH_NOARGS, bpy_bmface_calc_area_doc},
        {"calc_perimeter",     (PyCFunction)bpy_bmface_calc_perimeter,     
METH_NOARGS, bpy_bmface_calc_perimeter_doc},
        {"calc_center_median", (PyCFunction)bpy_bmface_calc_center_mean,   
METH_NOARGS, bpy_bmface_calc_center_mean_doc},
+       {"calc_center_median_weighted", 
(PyCFunction)bpy_bmface_calc_center_mean_weighted, METH_NOARGS, 
bpy_bmface_calc_center_mean_weighted_doc},
        {"calc_center_bounds", (PyCFunction)bpy_bmface_calc_center_bounds, 
METH_NOARGS, bpy_bmface_calc_center_bounds_doc},
 
        {"normal_update",  (PyCFunction)bpy_bmface_normal_update,  METH_NOARGS, 
 bpy_bmface_normal_update_doc},

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to