【问题标题】:Optimizing call-out rectangle placement in PowerPoint using VBA使用 VBA 优化 PowerPoint 中的标注矩形位置
【发布时间】:2020-06-11 07:04:41
【问题描述】:

我在 PowerPoint 幻灯片上生成了多个圆圈。它们的位置是固定的(即它们不能四处移动)。然后我将它们连接到我在幻灯片右侧对齐的标注矩形。伪代码如下:

  1. 为圆生成一个circle(1 to x, 1 to 3) 数组,其中维度'1' 是圆,.Name,维度'2' 是圆.Top,维度'3' 是圆@987654326 @
  2. 重新排序 circle(1 to x, 1 to 3) 数组按维度 2(即按 .Top 对圆进行排序)
  3. 循环 遍历数组并为每个圆圈生成一个关联的矩形,然后我以编程方式将它们布置到幻灯片右侧的所需高度和位置。
  4. 使用msoConnectorElbow 将圆连接到它们对应的矩形。如果矩形和圆形之间只有很小的shape.Top 差异,那么我将它们与msoConnectorStraight 连接起来。

结果比较喜人。请参阅下面粘贴的图像。

问题。 如您所见,一些msoConnectorElbow 发生碰撞(例如前三个圆圈)。我的问题如下:我应该如何对圆圈进行排序以使 msoConnectorElbow 不再碰撞?显然我需要一个优化算法。我最初的想法是将数组分成两部分(例如识别“中间”圆),然后一次又一次地遍历数组的每一位,这样肘部就不会发生碰撞。

数组前“半部分”的伪代码看起来像这样(抱歉,它有点老套,并且依赖于辅助数组):

Pivot = UBound(countries) / 2

For i = 1 To Pivot - 1
    For z = i + 1 To Pivot

    If (circles(i, 2) - circles(z, 2)) < 0 And (circles(i, 3) - circles(z, 3)) > 0 Then

    'switch the two circles in a 'helper array'
    final_array(z, 1) = circles(i, 1)
    final_array(z, 2) = circles(i, 2)
    final_array(z, 3) = circles(i, 3)
    final_array(i, 1) = circles(z, 1)
    final_array(i, 2) = circles(z, 2)
    final_array(i, 3) = circles(z, 3)

    'amend the original array
    circles(z, 1) = final_array(i, 1)
    circles(z, 2) = final_array(i, 2)
    circles(z, 3) = final_array(i, 3)
    circles(i, 1) = final_array(z, 1)
    circles(i, 2) = final_array(z, 2)
    circles(i, 3) = final_array(z, 3)

    End If

    Next
Next

当我运行到完成时,最终会发生什么是按水平维度对圆圈进行完全重新排序...最终可能会产生更多碰撞的肘部连接器等。

解决我的问题并正确排序数组以优化矩形放置的合适算法是什么?

【问题讨论】:

    标签: arrays vba algorithm sorting powerpoint


    【解决方案1】:

    我认为如果允许您更改线与点的连接顺序,您基本上可以避免碰撞。

    继续寻找最右边的点并将它连接到它最近的盒子中心(就绝对上/下距离而言)并重复。

    对不起,图表很乱,我必须在油漆中完成!

    【讨论】:

    • 你要么拥有一双非常清新的眼睛,要么拥有美丽的心灵。你的答案很完美。我希望我自己也能看到。
    • 希望我的结局不会像纳什那样悲惨!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多