Algorithm 计算任何矢量图标的体积中心或光学对准(质心)的公式?

Algorithm 计算任何矢量图标的体积中心或光学对准(质心)的公式?,algorithm,Algorithm,我对计算感兴趣。例如: 如果您熟悉UI设计,您就会知道某些图标,例如上面演示的“播放”按钮三角形,通常会感觉不合适。即使图标的矩形边界在技术上居中,图标仍然感觉不到居中。这是因为图标的表面积分布不均匀 我所尝试的: 有趣的是,当我在询问之前和之后研究这个问题时,谷歌给出的第一个结果是,没有答案 ,但由于它使用JPEG图像作为示例,答案指出的解决方案是使用像素网格来计算解决方案。当然,我可以在HTML5画布上呈现矢量图标(我是一名web开发人员,最终希望用JavaScript实现这一点,尽管我只

我对计算感兴趣。例如:

如果您熟悉UI设计,您就会知道某些图标,例如上面演示的“播放”按钮三角形,通常会感觉不合适。即使图标的矩形边界在技术上居中,图标仍然感觉不到居中。这是因为图标的表面积分布不均匀

我所尝试的: 有趣的是,当我在询问之前和之后研究这个问题时,谷歌给出的第一个结果是,没有答案

,但由于它使用JPEG图像作为示例,答案指出的解决方案是使用像素网格来计算解决方案。当然,我可以在HTML5画布上呈现矢量图标(我是一名web开发人员,最终希望用JavaScript实现这一点,尽管我只是将其标记为“算法”),并计算像素数,但至少可以说这是一种丑陋的方法

我想知道是否有任何算法可以用来计算矢量图标的体积中心,甚至是简单的光学对齐(可以通过在图标周围绘制尽可能小的圆来手动完成,如上图所示,但我对自动方法感兴趣)。我意识到这可能是一个具有挑战性的问题,因为矢量图标可以有任意数量的形状组合而成,矢量形状可以有洞,等等

问题: 有人知道如何编写这样的算法吗?当涉及到像这样复杂的数学算法时,我不知道从哪里开始


注意:有,但它似乎只询问多边形,答案并不涉及奇怪的曲线。

该文章所指的“真实中心”在技术上称为对象的质心。对于三角形等简单形状,甚至是任意多边形,有一个公式可以插入边界点以获得质心。例如,Wikipedia关于质心的文章展示了如何确定三角形的质心,这与您链接的文章中显示的结果一致

不幸的是,对于矢量图形,您有一个稍微困难的问题,因为边界曲线可能就是这样;任意曲线。在这种情况下,最容易使用数值积分来确定质心。下面是一个算法的概要(如果您熟悉MATLAB,可以寻找一个实现):

  • 确定形状的边界框
  • 对于每个x和y尺寸:
    • 将边界框拆分为等距采样点的适当分辨率
    • 在每一点上:
      • 确定与迭代方向正交的“占用长度”。
        • 对于凸面形状,占用长度只是两个边界点之间的差值
        • 对于凹面形状,您可能有多个边界点,并且需要确定哪些跳跃被占用(从头顶开始,每一对交替的边界点都被占用,从占用的最外面的一对开始)
      • 此外,确定“占用长度”的质心。找到一束共线的质心并不难,所以我将把它作为练习
      • 存储“占用长度”及其质心的乘积
    • 求所有加权占用长度的平均值,以找到与迭代的维度正交的质心

一旦你有两个方向的形心,你就知道形状的“真实中心”。

我想指出:我确实知道体积中心和光学对齐是两个稍微不同的东西。我对哪一个更容易计算。中间的图标总是多边形吗?如果是这样,您可以收集所有点并确定多边形质心,然后找到该质心与圆心之间的差异,以计算偏移量。只需按向量的负数移动形状即可对齐。@AsadSaeeduddin不,问题是关于“任何向量形状”,其中包括任何可以想象的曲线和线段组合。你可以将任意精确的多边形覆盖在曲线上,并从中计算质心……太棒了!首先想到的是将整个形状细分为三角形(因为三角形有一个简单的质心和面积方程),然后根据加权点集计算它们的共同质心:(X;Y)-质心,W-面积。这(将平面细分为均匀间隔的网格)这正是OP试图避免的方法。@hidefromkgb我又看了一遍这个问题,看不出在哪里提到了这一点。但是,除非您尝试为任意边界曲线构建近似函数,或者排除图标无法分解为更简单规则形状的可能性,否则避免数值积分是不可能的。@hidefromkgb另外,我不知道您为什么要避免数值积分,由于您可以获得良好的性能和良好的结果,并且假设您通过矢量化表示检查边界,可以将此方法扩展到任意精度。如果这是最合理的方法,并且没有更有效的方法具有更好的性能,那么我不反对它。我总是试图用最有效和“干净”的方法来解决任何问题。@AsadSaeeduddin,这是毫无疑问的。但我仍然认为我的曲率为基础的Testelelistic方法,然后是一个简单的加权和更好的一个。