Я создаю несколько кругов на слайде PowerPoint. Их размещение фиксировано (то есть их нельзя перемещать). Затем я соединяю их с вызывающими прямоугольниками, которые выравниваю с правой стороны слайда. Псевдокод выглядит следующим образом:
- Создать массив
circle(1 to x, 1 to 3)
для кругов, где измерение «1» - это круг, .Name
, измерение «2» - это круг .Top
и размерность '3' - это круг .Left
- Переупорядочить массив
circle(1 to x, 1 to 3)
по измерению 2 (т.е. отсортировать круг по .Top) - L oop через массив и сгенерируйте связанный прямоугольник для каждого круга, и я программно раскладываю их до желаемой высоты и положения на правой стороне слайда.
- Соедините кружочки с соответствующим прямоугольником с помощью
msoConnectorElbow
. Если между прямоугольником и окружностью существует только небольшой shape.Top
дифференциал, тогда я соединяю их с msoConnectorStraight
.
Результат относительно приятен. Пожалуйста, смотрите изображение, вставленное ниже. ![enter image description here](https://i.stack.imgur.com/NQMC3.png)
Проблема. Как вы увидите, некоторые из 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
Что в конечном итоге происходит, когда я запускаю это до завершения, это полное переупорядочение круги по горизонтали ... Что в итоге создает, возможно, еще больше коллимационных коленчатых соединителей и т. д. c.
Какой будет подходящий алгоритм для решения моей проблемы и правильного упорядочения массива для оптимизации размещения прямоугольники?