[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55827] trunk/blender/source/blender: add BM_face_calc_center_mean_weighted() gives much better result at cost of some speed.
Campbell Barton
ideasman42 at gmail.com
Fri Apr 5 21:26:33 CEST 2013
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},
More information about the Bf-blender-cvs
mailing list