gpt4 book ai didi

c# - 如何计算单个点质量?

转载 作者:行者123 更新时间:2023-11-30 15:49:03 28 4
gpt4 key购买 nike

我正在使用 C# 2d 软体物理引擎,我需要将质量分配给给定的对象顶点:顶点列表(x、y 位置)、对象的总质量和质心。

质心给定为:

alt text

在哪里,

R = center of mass
M = total mass
mj = mass of vertex j
rj = position of vertex j

我需要一种算法,可以在给定 R、M 和 rj 的情况下逼近每个 mj。

编辑:我只是想澄清一下,我知道有无数种解决方案。我正在寻找一种找到一组 mj 的快速算法(这样它们每个都足够接近 mj = M/[顶点数],并且“足够”被定义为一些小的浮点阈值)。

此外,每个对象将包含大约 5 到 35 个点。

最佳答案

您可以按如下方式计算均匀密集多边形的 CM:从 0..N-1 开始编号 N 个顶点,并循环处理它们,使顶点 N 环绕到顶点 0:

total_area = sum[i=0..N-1]( X(p[i],p[i+1])/2 )
CM = sum[i=0..N-1]( (p[i]+p[i+1])*X(p[i],p[i+1])/6 ) / total_area

where X(p,q)= p.x*q.y - q.x*p.y [basically, a 2D cross product]

如果多边形是凸面的,则 CM 将位于多边形内部,因此您可以合理地开始将区域切成三角形,如饼图,CM 位于中心。您应该能够在不改变 CM 的情况下,用三分之一的质量对三角形的每个顶点进行加权——但是,这仍然会在整个多边形的 CM 处留下总质量的三分之一。尽管如此,将质量传递缩放 3/2 应该可以让您在两个“外部”顶点之间拆分每个三角形的质量。结果,

area[i] = X( (p[i]-CM), (p[i+1]-CM) ) / 2
(this is the area of the triangle between the CM and vertices i and i+1)

mass[i] = (total_mass/total_area) * (area[i-1] + area[i])/2

请注意,这种质量传递在很大程度上是“非物理的”——如果没有别的,如果按字面意思处理,它会把惯性矩搞砸一些猛烈的事情。但是,如果您需要在顶点之间分配质量(例如某种俗气的爆炸),并且您不想在这样做时破坏 CM,那么这应该可以解决问题。

最后,一些警告:

  • 如果您不为此使用实际的 CM,它将无法正常工作
  • 在凹面物体上使用它是危险的;你冒着以负质量结束的风险

关于c# - 如何计算单个点质量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128644/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com