Render.ru

Ищу быстрый код определения пересекается ли объект с объектом...

SDmiter

Пользователь сайта
Рейтинг
2
#1
Ищу быстрый код определения пересекается ли объект с объектом...
Фигуры не обязательно прямоугольные :)
пишу алгоритм расстановки объектов на площади
Может есть у кого кого код для компактной расстановки фигур...
 

G-Kir

Знаток
Рейтинг
20
#3
В кореле есть функция IsOnShape. Она проверяет находится ли объект в заданном объекте, либо вне заданного объекта.
Фигуры могут быть какие угодно.

Вот набросал код для примера:

Код:
Sub Probe()
Dim s As Shape
Dim x As Double, y As Double
Dim mySh As Shape

Set mySh = ActiveShape
For Each s In ActivePage.Shapes
    s.GetPosition x, y
     If mySh.IsOnShape(x, y, -1) Then
        s.Fill.UniformColor.CMYKAssign 0, 100, 0, 0
     End If
    mySh.RemoveFromSelection
Next s
End Sub
Рисуем какую-нибудь фигуру и кучу объектов вокруг. Выделяем эту фигуру. Запускаем код. Все объекты которые вошли в фигуру окрасятся. Степень чувствительности можно регулировать. Для большей точности рекомендуется прописывать референ-поинт документа как центр.

Разумеется что алгоритм расстановки объектов придется сочинять самому. Эта функция может лишь облегчить мозговой штурм.
 

Вложения

SDmiter

Пользователь сайта
Рейтинг
2
#4
Спасибо, эта функция сильно поможет, когда "мозговой штурм" закончу обязательно выложу что получилось а так-же те промежуточные полезные вещи что получались...

Но к сажелению вопрос еще остается открытым, т.к. функция только определяет полностью ли объект находится в объекте, а нужно что-бы объекты (группы шейпов в том числе) не пересекались, я лично пока ничего подобного и быстрого не нашел (хотя медленные варианты есть)...
 

SDmiter

Пользователь сайта
Рейтинг
2
#5
кривые не обязательно замкнутые (хотя это не сильно важно)
1) определить пересекаются ли они
2) найти точки пересечения
3) найти нужное смещение (угол поворота) для того что-бы убрать пересечение

Хотя не уверен что это все что нужно, но буду решать задачи по мере их появления...
 

Вложения

G-Kir

Знаток
Рейтинг
20
#6
Чтоб определить пересечение кривых, то можно воспользоваться функцией GetIntersections. Она работает с кривыми и с сегментами одной кривой.
А IsOnShape можно настроить чтоб она определяла и рядомстоящие объекты. Скомбинировав эти две функции, можно сделать вполне подходящий код.
 
Сверху