我应该如何为任何System.Windows.Media.Geometry对象的质心创建算法?

时间:2009-08-24 20:25:44

标签: .net math .net-3.5 geometry center

我计划将Geometry对象拆分成一系列更简单的形状,并使用以下公式组合它们的质心:

该公式的数学细节可以在this Wikipedia article中找到。

注意:如果我对数学的看法不正确,请不要惊讶。我没有做过任何复杂的数学过去的三角学,我从来没有处理希腊字母。我想我很了解这个,但如果我弄错了,请告诉我。

信息性说明:gometric形状或棱镜的质心不仅仅是形状的中间。它是重心或质心。我假设Geometry对象也可以封装3D棱镜,所以我将来可能不得不考虑这一点,但是现在我只专注于2D几何。对于2D形状,您必须想象它是具有给定形状的硬纸片,并且质心将是这张纸在针上平衡的点。

我面临的第一个问题是我需要找到一种方法来将任何给定的Geometry对象精确地分割成足够简单的形状,这样这个公式就能正常工作。有没有人有任何想法如何实现这一目标?或者是否有更好的程序仍然可以普遍使用?

我面临的第二个问题是,在几何体分离之后,我该如何找到每个部分的质心?每种类型的简单形状(三角形,四边形,半圆形等)都有自己的质心公式。有没有办法让我知道每件作品的形状是什么?

2 个答案:

答案 0 :(得分:3)

任意2D平面形状的细分或离散化是有限元分析中的常见问题。它通常用平面三角形或四边形来完成。尝试在"2d finite element mesh generation"或四叉树或八叉树网格生成上进行Google搜索。您可以计算每个简单形状的质心并应用您引用的(正确)公式。

this之类的东西。或these。当然,你必须为有问题的身体提供原始几何体。

你还有很长的路要走。您必须执行以下所有操作:

  1. 查找自动网格划分程序并了解如何输入2D形状的几何图形。
  2. 运行自动网格划分器并获取网格输出,该输出将包含空间中的所有2D点以及所有三角形和四边形元素的连接性。
  3. 编写程序以读入网格并计算每个元素的面积和质心。
  4. 将这些值插入您引用的公式中,以计算原始2D形状的质心。这意味着循环遍历所有元素并累积区域,以及每个元素质心及其区域的(x,y)坐标的乘积。
  5. 一旦得到答案,您需要检查收敛情况。您可以通过使元素更小并重新计算来细化网格来实现此目的。你知道,当你细化网格并且答案的变化小于一个小的容差(5%或者你愿意容忍的任何东西)时,你已经收敛了。
  6. 这仍然是一项相当多的工作。

    更新:This one看起来很不错,而且它是开源的。

答案 1 :(得分:0)

我没有这方面的任何代码,但我已经看到了形状被细分的位置(在这种情况下使用polygon triangulation),所以你会得到一组很好的三角形。然后根据三角形质心的加权平均值计算组合质心。

编辑:

AGI正在开发一款名为Insight3D的产品的博客。在这个entry中,他们讨论了三角测量。它可能会帮助你做到这一点,因为他们确实提供了更多关于算法的指针。根据您的使用情况,您可以重复使用one implementations。它可以免费用于开发和非商业用途。