Как проверить положения прямоугольника в повторяющейся 4-ролльной компоновке с пространственными ограничениями на основеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как проверить положения прямоугольника в повторяющейся 4-ролльной компоновке с пространственными ограничениями на основе

Сообщение Anonymous »

Я работаю со списком прямоугольников и должен проверить, находится ли каждый из них в правильном положении на основе фиксированной шаблона и набора геометрических ограничений. Если роль каждого прямоугольника определяется по указателю % 4.
Эта модуло-4-картинка определяет их ожидаемую пространственную позицию, повторяя каждые 4 элемента в списке.
...
Каждая группа состоит из 4 прямоугольных лиц с последовательными индексами, начинающимися из множества 4 (т.е., индексы 0–3, 4–7, 8–11, etc.). Несмотря на то, что сама роль определяется исключительно по индексу, фактическая позиция прямоугольника, как ожидается, будет визуально соответствовать этой роли (например, прямоугольный прямолинейный взгляд на верхнюю левую в своей группе). < /P>
Последняя группа может содержать менее 4 прямоугольников, если длина списка не делится на 4. Это не рассматривается по ошибке, пока все еще не будет осмотрительно. Это исключение относится только к окончательной группе на основе длины списка ввода. < /P>
шаблон повторяется каждые 4 элемента. Однако прямоугольники в сборе ввода могут быть уже неправильно расположены. Верхний левый прямоугольник помещается там, где должен быть прямоугольный прямоугольник). < /P>
Допустимый диапазон движения каждого прямоугольника определяется не только путем предотвращения прямого перекрытия с соседями, но также и дополнительным правилом:
не должно пересекать линии расширенной оси (x-ax-ax ax ax ax ax. < /P>
horizontal mails): < /p>
horizontal mails). Горизонтально, пока он не пересекает вертикальные граничные линии своих горизонтальных соседей: < /p>
Слева: она не должна пересекать вертикальную линию, простирающуюся от правого края левого соседа. < /p>
Право: не должна пересекать версическую линию, выходящую от левого края правого соседа. (Ось Y):
прямоугольник может двигаться вертикально только до тех пор, пока он не пересекает горизонтальные граничные линии своей вертикальной пары (верхняя /нижняя пара): < /p>
Движение вниз: она не должна пересекать горизонтальную линию, расширяющуюся от верхней части нижней пары. его верхняя пара. < /p>
Другими словами, прямоугольник никогда не должен пересекать воображаемые границы, выравниваемые осью, даже если сами прямоугольники не касаются физически. Ограничение: не может пересечь горизонтальную ось, простирающуюся от края пары.
прямоугольники могут варьироваться по размеру, они не обязаны быть равномерными. Это учитывается в логике: все валидация положения основана на краях и ограничениях, выравниваемых осью (не фиксированными измерениями). Прямоугольник считается недействительным, только если он пересекает расширенные граничные линии соседа, независимо от его размера. < /P>
Я пишу приведенный ниже код. В настоящее время моя функция идентифицирует, когда два прямоугольника нарушают ограничение оси (например, один перекрывает другой вдоль x или y). Но в таких случаях он помечает оба прямоугольника - тот, который остался в правильном положении, и тот, который фактически перемещался в пространство другого. < /P>
Однако это поведение не идеально. Я хотел бы просто пометить прямоугольник, который вторгся в зону оси другого.pastebin.com/64YQM6hA
< /code>
Как я могу улучшить логику, чтобы отметить только ту, которая нарушает шаблон? /> Итак, как я могу изменить свою функцию так, чтобы, когда происходит пересечение оси, он анализирует, какой из двух прямоугольников правильно расположен в соответствии с ожидаемой 4-розовой схемой и координатной планировкой-и затем только отмечает неправильный? Верните индекс того, который фактически нарушил правило, пересекая запрещенное пространство.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... axis-based
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»