Оптимизация размещения прямоугольников в PowerPoint с использованием VBA - PullRequest
1 голос
/ 27 февраля 2020

Я создаю несколько кругов на слайде PowerPoint. Их размещение фиксировано (то есть их нельзя перемещать). Затем я соединяю их с вызывающими прямоугольниками, которые выравниваю с правой стороны слайда. Псевдокод выглядит следующим образом:

  1. Создать массив circle(1 to x, 1 to 3) для кругов, где измерение «1» - это круг, .Name, измерение «2» - это круг .Top и размерность '3' - это круг .Left
  2. Переупорядочить массив circle(1 to x, 1 to 3) по измерению 2 (т.е. отсортировать круг по .Top)
  3. L oop через массив и сгенерируйте связанный прямоугольник для каждого круга, и я программно раскладываю их до желаемой высоты и положения на правой стороне слайда.
  4. Соедините кружочки с соответствующим прямоугольником с помощью msoConnectorElbow. Если между прямоугольником и окружностью существует только небольшой shape.Top дифференциал, тогда я соединяю их с msoConnectorStraight.

Результат относительно приятен. Пожалуйста, смотрите изображение, вставленное ниже. enter image description here

Проблема. Как вы увидите, некоторые из 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.

Какой будет подходящий алгоритм для решения моей проблемы и правильного упорядочения массива для оптимизации размещения прямоугольники?

1 Ответ

1 голос
/ 03 марта 2020

Я думаю, что вы могли бы избежать коллизий, если бы вам было позволено изменить порядок, в котором линии связаны с точками.

Продолжайте искать самую дальнюю правую точку и подключите ее к центру прямоугольника, к которому она ближе всего (с точки зрения абсолютного расстояния вверх / вниз), и повторите.

enter image description here

Извините за грязную диаграмму, я должен был сделать это в краске!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...