【发布时间】:2020-06-11 07:04:41
【问题描述】:
我在 PowerPoint 幻灯片上生成了多个圆圈。它们的位置是固定的(即它们不能四处移动)。然后我将它们连接到我在幻灯片右侧对齐的标注矩形。伪代码如下:
-
为圆生成一个
circle(1 to x, 1 to 3)数组,其中维度'1' 是圆,.Name,维度'2' 是圆.Top,维度'3' 是圆@987654326 @ -
重新排序
circle(1 to x, 1 to 3)数组按维度 2(即按 .Top 对圆进行排序) - 循环 遍历数组并为每个圆圈生成一个关联的矩形,然后我以编程方式将它们布置到幻灯片右侧的所需高度和位置。
-
使用
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