arrays - 使用 VBA 优化 PowerPoint 中的标注矩形位置
问题描述
我在 PowerPoint 幻灯片上生成了许多圆圈。它们的位置是固定的(即它们不能四处移动)。然后我将它们连接到我在幻灯片右侧对齐的标注矩形。伪代码如下:
- 为圆生成一个
circle(1 to x, 1 to 3)
数组,其中维度“1”是圆,.Name
维度“2”是圆.Top
,维度“3”是圆.Left
- 按维度 2对数组重新
circle(1 to x, 1 to 3)
排序(即按 .Top 对圆进行排序) - 循环遍历数组并为每个圆圈生成一个关联的矩形,然后我以编程方式将它们布置到幻灯片右侧的所需高度和位置。
- 用 . 将圆圈连接到它们对应的矩形
msoConnectorElbow
。如果矩形和圆形之间只有很小的shape.Top
差异,那么我将它们与msoConnectorStraight
.
问题。正如你将看到的,一些msoConnectorElbow
碰撞(例如前三个圆圈)。我的问题如下:我应该如何对圆圈进行排序以使其msoConnectorElbow
不再发生碰撞?显然我需要一个优化算法。我最初的想法是将数组分成两部分(例如,确定“中间”圆),然后一次又一次地遍历数组的每一位,这样肘部就不会发生碰撞。
数组前“一半”的伪代码看起来像这样(抱歉,它有点 hacky 并且依赖于辅助数组):
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
当我运行到完成时最终会发生什么是按水平尺寸对圆圈进行完全重新排序......最终可能会产生更多碰撞的肘部连接器等。
解决我的问题并正确排序我的数组以优化矩形放置的合适算法是什么?
解决方案
我认为如果允许您更改线条连接到点的顺序,您基本上可以避免碰撞。
继续寻找最右边的点并将其连接到它最接近的盒子中心(就绝对上/下距离而言)并重复。
对不起,图表很乱,我必须用油漆来做!
推荐阅读
- java - 如何等待 Apache Camel JDBC 作业完成
- sql - SQL Server 2019 Standard 无法从 2012 Enterprise 备份证书创建证书
- excel - 如何在 TextBoxes 中使用“动态搜索”过滤两列或多列
- php - 如何使用 Laravel 6 将数组值推送到数据库中?
- html - bash:将 html 实体转换为 UTF-8,但保留现有的 UTF-8
- excel - 根据使用 VBA 的 If 语句有粗底边框
- android - 奇怪的 AsyncTaskLoader 行为
- regex - 使用单个正则表达式删除固定模式中特定字符的多次出现
- python - 将两个列表压缩在一起 - Python
- python - 使用 python3 进行 HTTP 检索