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

  • Автор темы Автор темы Nezar
  • Дата начала Дата начала
116343

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

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

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

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

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


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

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

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

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


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

9. Строятся квадраты, которые мы запомнили.
 
Не вижу здесь больших вычислений, поэтому время построения должно исчисляться секундами. Могу написать этот макрос, но когда появится свободное время, сейчас, к сожалению, график очень плотный.
 
1 и 2 - просто, хотя может быть количество и около 20 000.
3 - не уверен что элементарно. каждая из 4х точек могут лежать на вершинах квадрата, а в середине может быть пустота.
тут надо проверять все точки в данном квадрате, а с учетом 20 000 изначальных - это будет оочень долго.
разве что все это загнать в массив и в нем колупаться, я о таком варианте думал, но как и писал ранее - еще не добрался к реализации.

по сути я сейчас так и делаю просто накидываю квадрат в виде кривой и проверяю на принадлежность его к исходному шейпу.
на маленьких объекта это происходит за 3 секунды. на больших - не дождался ))
 
Ну собственно и предполагается это делать в массиве, причем, при желании для скорости можно вообще в натив загнать. А как еще? Вы что, шейпами квадраты вписываете????
 
3 этап - очень простой. Нужно найти самый большой квадрат, напр. 50 мм. Берется точка и от нее вправо проверяются 50 точек - если они существуют, то от конечной точки проверяются 50 точек вниз, если ОК - то опять от конечной влево и вверх. Если все точки есть, значит квадрат вписывается.
 
ага. т.к. для проверки это был самый простой способ и совсем мала кода
 
Ну а если квадрат вписывается - дальше по алгоритму: квадрат запоминаем, точки удаляем.

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

Вложения

  • 2019-03-05_185936.png
    2019-03-05_185936.png
    38.4 КБ · Просм.: 510
3 этап - очень простой. Нужно найти самый большой квадрат, напр. 50 мм. Берется точка и от нее вправо проверяются 50 точек - если они существуют, то от конечной точки проверяются 50 точек вниз, если ОК - то опять от конечной влево и вверх. Если все точки есть, значит квадрат вписывается.
Да нет же, все точки квадрата проверять надо. А то вдруг дырка?
 
для этой ситуации ваш алгоритм скажет что все ок, но нет ((
это должен быть не просто квадрат только по краям, а целый - без отверстий
Тогда еще проверяем все точки внутри, но только после того, как граничные точки будут удовлетворять условию. Все просто
 
Даже рисовать ничего не надо, все операции в памяти с массивом.
как я и писал - согласен это наиболее приемлемый вариант - но пока не добрался.
но опять же меня очень смущает количество проверок.
пусть будет 20 000 точек потом нужно проверять все эти точки в квадратах... будет мноого вычислений. простых, но тем не менее.
надо пробовать )) думаю точно будет быстрее чем сейчас

сейчас отлаживаю то что будет после этого безобразия. т.к. не исключено что еже придется внести корректировки в начальное ТЗ ))
 
Последнее редактирование:
как я и писал - согласен это наиболее приемлемый вариант - но пока не добрался.
но опять же меня очень смущает количество проверок.
пусть будет 20 000 точек потом нужно проверять все эти точки в квадратах... будет мноого вычислений. простых, но тем не менее.
надо пробовать ))

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

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

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