[CDR 2017-2021] как через vba сделать эффект Pointillizer?

Karatau

Участник
Сообщения
60
Реакции
22
116343

Как вам такая идея:

1. Берем двумерный массив точек по границам данной фигуры, расстояние между которыми 1 мм

2. Убираем точки, которые вне фигуры

3. Ищем максимально большие по размеру вписанные квадраты (элементарно, каждая точка проверяется, не является ли она вершиной данного по размеру квадрата)

(продолжение следует)
 
  • Спасибо
Реакции: Nezar

Karatau

Участник
Сообщения
60
Реакции
22
116344


4. Координаты квадрата запоминаются, точки, которые внутри его - удаляются.

5. Берется следующий по размеру квадрат и ищутся точки, которые удовлетворяют условиям.

6. Квадраты запоминаются, внутренние точки удаляются.

(продолжение следует)
 

Karatau

Участник
Сообщения
60
Реакции
22
116345


7 - 8. Итерация продолжается, пока есть точки.

9. Строятся квадраты, которые мы запомнили.
 

Karatau

Участник
Сообщения
60
Реакции
22
Не вижу здесь больших вычислений, поэтому время построения должно исчисляться секундами. Могу написать этот макрос, но когда появится свободное время, сейчас, к сожалению, график очень плотный.
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
1 и 2 - просто, хотя может быть количество и около 20 000.
3 - не уверен что элементарно. каждая из 4х точек могут лежать на вершинах квадрата, а в середине может быть пустота.
тут надо проверять все точки в данном квадрате, а с учетом 20 000 изначальных - это будет оочень долго.
разве что все это загнать в массив и в нем колупаться, я о таком варианте думал, но как и писал ранее - еще не добрался к реализации.

по сути я сейчас так и делаю просто накидываю квадрат в виде кривой и проверяю на принадлежность его к исходному шейпу.
на маленьких объекта это происходит за 3 секунды. на больших - не дождался ))
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну собственно и предполагается это делать в массиве, причем, при желании для скорости можно вообще в натив загнать. А как еще? Вы что, шейпами квадраты вписываете????
 

Karatau

Участник
Сообщения
60
Реакции
22
3 этап - очень простой. Нужно найти самый большой квадрат, напр. 50 мм. Берется точка и от нее вправо проверяются 50 точек - если они существуют, то от конечной точки проверяются 50 точек вниз, если ОК - то опять от конечной влево и вверх. Если все точки есть, значит квадрат вписывается.
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
ага. т.к. для проверки это был самый простой способ и совсем мала кода
 

Karatau

Участник
Сообщения
60
Реакции
22
Ну а если квадрат вписывается - дальше по алгоритму: квадрат запоминаем, точки удаляем.

Даже рисовать ничего не надо, все операции в памяти с массивом.
 
Последнее редактирование:

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
3 этап - очень простой. Нужно найти самый большой квадрат, напр. 50 мм. Берется точка и от нее вправо проверяются 50 точек - если они существуют, то от конечной точки проверяются 50 точек вниз, если ОК - то опять от конечной влево и вверх. Если все точки есть, значит квадрат вписывается.
для этой ситуации ваш алгоритм скажет что все ок, но нет ((
это должен быть не просто квадрат только по краям, а целый - без отверстий
 

Вложения

  • 2019-03-05_185936.png
    2019-03-05_185936.png
    38.4 КБ · Просм.: 483

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
3 этап - очень простой. Нужно найти самый большой квадрат, напр. 50 мм. Берется точка и от нее вправо проверяются 50 точек - если они существуют, то от конечной точки проверяются 50 точек вниз, если ОК - то опять от конечной влево и вверх. Если все точки есть, значит квадрат вписывается.
Да нет же, все точки квадрата проверять надо. А то вдруг дырка?
 

Karatau

Участник
Сообщения
60
Реакции
22
для этой ситуации ваш алгоритм скажет что все ок, но нет ((
это должен быть не просто квадрат только по краям, а целый - без отверстий
Тогда еще проверяем все точки внутри, но только после того, как граничные точки будут удовлетворять условию. Все просто
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
Даже рисовать ничего не надо, все операции в памяти с массивом.
как я и писал - согласен это наиболее приемлемый вариант - но пока не добрался.
но опять же меня очень смущает количество проверок.
пусть будет 20 000 точек потом нужно проверять все эти точки в квадратах... будет мноого вычислений. простых, но тем не менее.
надо пробовать )) думаю точно будет быстрее чем сейчас

сейчас отлаживаю то что будет после этого безобразия. т.к. не исключено что еже придется внести корректировки в начальное ТЗ ))
 
Последнее редактирование:

Karatau

Участник
Сообщения
60
Реакции
22
как я и писал - согласен это наиболее приемлемый вариант - но пока не добрался.
но опять же меня очень смущает количество проверок.
пусть будет 20 000 точек потом нужно проверять все эти точки в квадратах... будет мноого вычислений. простых, но тем не менее.
надо пробовать ))

сейчас отлаживаю то что будет после этого безобразия. т.к. не исключено что еже придется внести корректировки в начальное ТЗ ))
Делал аналогичную сетку 200х200 (40 000 точек) и вычисления были сложнее. Макрос считал за доли секунды, вернее, я не засекал, т.к. задержка была очень маленькая
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
как я и писал - согласен это наиболее приемлемый вариант - но пока не добрался.
но опять же меня очень смущает количество проверок.
пусть будет 20 000 точек потом нужно проверять все эти точки в квадратах... будет мноого вычислений. простых, но тем не менее.
надо пробовать )) думаю точно будет быстрее чем сейчас

сейчас отлаживаю то что будет после этого безобразия. т.к. не исключено что еже придется внести корректировки в начальное ТЗ ))
Вычисления в массивах гораздо быстрее чем создание и проверка шейпов. А исходный заполнять как я в самом начале говорил - экспортируя и читая растр
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
ок. знает точно буду делать. потом отпишу что быстрее ))

единственное не знаю как читать растр.
я сначала думал проверять каждую точку используя IsOnShape или как он там называется.
но не уверен что это будет быстро для большого количества ((
 

Karatau

Участник
Сообщения
60
Реакции
22
Вычисления в массивах гораздо быстрее чем создание и проверка шейпов. А исходный заполнять как я в самом начале говорил - экспортируя и читая растр
В VBA есть функция, которая возвращает (true/false), лежит ли данная точка внутри шейпа или снаружи. Работает даже с вложенными шейпами. Растр не нужен
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
В VBA есть функция, которая возвращает (true/false), лежит ли данная точка внутри шейпа или снаружи. Работает даже с вложенными шейпами. Растр не нужен
знаю - про нее выше написал - IsOnShape
но 20000 проверок врядли будут быстрыми.
сейчас попробую
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
В VBA есть функция, которая возвращает (true/false), лежит ли данная точка внутри шейпа или снаружи. Работает даже с вложенными шейпами. Растр не нужен
Это сильно медленнее. Я бы сказал, на порядок медленнее. Вдобавок, внутри все равно реализовано через растр. А так за одну операцию имеем полностью заполненный массив.