Я думаю, у меня есть неплохой фикс для твоего алгоритма. Чтобы светлые части изображения не затемнялись нитками так сильно, я бы попробовал не просто вычитать цвет из исходного изображения вплоть до нуля (если считать белый нулем), а уходить в минус (хранить "отрицательный" цвет можно например в отдельном канале или во вспомогательном изображении). Дело в том, что в твоем алгоритме учитывается оставшийся темный цвет на рисунке но не учитывается сколько же черного мы уже добавили в светлые области. То есть при вычислении суммы черных пикселей на рисунке нужно корректировать значение с учетом уже нарисованных там линий. Получится что значение для линия проходящей через точки где уже "есть" нитки будет меньше. И чем больше таких точек тем меньше вероятность что алгоритм выберет эту линию в качестве следующий. С таким подходом я уверен не нужны будут костыли с запретными зонами и количеством нитий на гвоздь.
Еще проще - можно не рисовать белую линию на исходном изображении, а сумму черного для линии считать как сумма черного на исходном минус сумма черного на текущем полученном.
а что если попробовать не из черного в белый а из белого в черный в таком случаи картину загружать в инверсионном виде тогда прогрессия будет расти в обратную сторону
Если не пропускать нитку по белому вообще это сократит количество гвоздей и получится ерунда для самого белого цвета нужно ограничить количество пропусков нитки через эту область до 1.
А заметили какие Алекс красивые руки роботу, который нитки плёл, сделал!? Даже ногти ему накрасил. Видно робот любит Алекса, потому как, только у любящего робота хватит терпения столько ниток заплести. Лайк!
Алекс вообще молодец. Он роботу и сиськи приделал, на 20:06 видно :) Если серьезно, то крутой проект. Можно ещё в приложение диктовку голосом добавить. Чтобы оно голосом проговаривало какие гвозди соединять.
В очередной раз мне не слишком интересны такие "картины", и вообще поделки. Но совершенно балдею от процесса рассуждения и достижения результата методом проб и ошибок в совершенно необычных областях! За это уважаю и ценю! Спасибо Алекс!
Спасибо тебе Саня! Те знания которые ты даёшь, никогда, никто не даст ни в одном учебном заведении, так, как это преподносишь ты. Учиться становится действительно интересно.
Чему тебя тут научили? Тебе дали всё готовое, а ты создаешь иллюзию что это ты сам до этого допер. Если тебе нравится учиться, значит ты где-то ошибаешься, человеческий мозг очень ленив и все попытки вбивания информации всячески пытается избегать. Соответственно он не может приносить удовольствия. Другой момент, если тебе это реально интересно и ты получаешь ответы на свои вопросы и потребности, которые будут исчерпаны на поверхностном уровне. В любом случае, извини что вмешался и успехов в обучении.
У вас изначально неправильная концепция: картина закрашивается не нитями, а их пересечениями! нужен рекурсивный алгоритм для поиска всех пересечений следующего шага, а не пикселей! человеческий глаз устроен так, что пересечение двух нитей для него намного значимее чем вся нить! кроме того очень важен угол пересечения, чем он больше тем менее значим!
Вместо жесткого ограничения на минимальный угол, можно добавить вес - чем меньше угол между хордами, тем алгоритму должно быть труднее провести хорду. Аналогично с числом ниток на гвоздь.
Мысль для улучшения: Может нужно позволить нитке идти иногда не через картину, а по внешнему кругу. Тогда получится как бы скипнуть некоторые места и наоборот дозакрасить более светлые. Не знаю по каким параметрам разрешать программе это делать, но я думаю можно определить методом тыка
Да, сделать как-то, чтобы ценность изображения возрастала по приближению к центру картины и если области по краям будут чуть темнее, чем нужно, то это нестрашно
Гениальный Гайвер, как приятно видеть видосы так часто. Вдохновляешь на свершения! Сам торчу в самоделках и программировании, включая Пайтон. ЗЫ: ОООЧень жду твой обещанный румтур!
Алекс , могу ошибаться но когда у тебя тянется нитка ты вычитаешь пиксели из исходной картины , но когда ты проводишь еще одну которая пересекает первую ты не добавляешь обратно пиксель в месте пересечения из за этого и появляется оочень много черного без полутонов
Ошибка в том, что вы считаете только черный, поэтому у вас получается на светлых областях слишком много черного. Вам нужно считать белый или как минимум учитывать уже нарисованный черный, а не делать вид, что теперь у вас там белая линия.
там вопрос уровня белого и снижения числа градация серого в исходном изображении. еще есть вероятность что надо определять условную глубину изображения по полутонам и раскладывать картинку на слои и вот уже по каждому отдельному слою строить сетку.....
Именно так. Можно например не рисовать белую линию на исходном изображении, а сумму черного на линии считать как сумма черного на исходном минус сумма черного на текущем полученном. Тогда будут учитываться уже полученные нити на светлых областях. А сейчас эта информация совсем теряется.
Класс, а теперь иди и сделай пулл реквест или хотя ишью, в котором подробно и понятным хоть немного техническим языком опиши, что конкретно ты имел ввиду
Видео огонь! Сразу захотелось открыть пайчарм. Есть идея, что нужно при выборе траектории нити учитывать не количество перекрываемого черного, а процент черного цвета в отношении к общей длине линии. То есть короткая линия может содержать в сумме меньше черного, чем более длинная линия. Но правильнее будет выбрать ту, которая "чернее" безотносительно длины в пикселях.
Два замечания к использованному подходу в алгоритме: 1. Для функции оптимизации прокладывания нити стоит учитывать не только вклад нити в чёрный цвет, но и сколько белых точек она затемняет - т.е. функция должна учитывать не только вклад в результат, но и порчу тоже 2. Стоит вначале нарисовать все линии от каждого гвоздя, а потом уже пройтись по кругу и выбрать последовательность обхода гвоздей (обычная задача комивояжёра по графу), чтобы сделать это одной нитью
С первым пунктом полностью согласен. Для каждой нити надо вычислять её ошибку как корень суммы квадратов расхождения для каждого пикселя деленный на количество пикселей.
@@Samiron Дык не нужно оптимальное решение; достаточно "более-менее близкого к оптимальному" (или "не слишком уж неоптимального") -- тут уже не NP, а полиномиальная сложность (а при некоторых приёмчиках упрощения - и с невысокими показателями степеней).
@@dmitryvodolazsky по этим "эвристикам" некоторые кандидатские защищают, вам не кажется что это не совсем то что можно назвать "обычная задача коммивояжера"?
Видео огонь, спасибо за такие проекты, давно видел их рекламу, но не хотел тратить деньги, сейчас даже еще интереснее, посмотреть как будет реализован проект и обязательно его повторить, еще раз большое спасибо и удачи!)
Большой уважение тебе. Очень давно смотрю и прям получаю удовольствие 👍👍👍 Занимался программированием давно. Так же рассуждал и анализировал. Потом судьба не сложилась.
Алекс, классная реализация! Мне кажется, ограничение угла и т.п. - это все "костыли", правильный алгоритм должен сразу работать правильно. Посмотрите на фото от RingString, там весь фон равномерно серый. Раз прохождения нитей через белые области не избежать, то надо постепенно "сдвигать" белый цвет в серую область. Т.е. раз в одном месте нити прошли через белую область и сделали ее серой, то и все остальные белые области должны стать такими же серыми. Таким образом удастся сделать равномерно серый фон. И это как раз заставит алгоритм равномернее распределять нити.
Как всегда, супер проект!!! Оч вдохновляет! Кажется, что если использовать не гвозди ~ 1-2 мм толщиной, а булавки толщиной 0,.. мм , то результат будет ближе к тому, что рисует программа!
Еще одно возможное улучшение - добавить в алгос трассировки возможность просчитывать изменение цвета на несколько шагов вперед и выбирать тот, в котором будет больше заполнение черного. Это позволит более четко обводить кривые линии, к примеру
Ох! Прям до мурашек! 😊 В прошлом году, ещё до выхода RingString, сделал в подарок портрет из нитей. Конечно код я не писал, но сколько интернетов и генераторов я перепробовал… Потом несколько недель работы, и самым сложным было сделать холст. Кстати, такой способ распечатки карты холста постером в Acrobat Reader тоже думал, но по каким-то причинам не подошло (уже не помню). Холст был радиусом 50см на рамке 76*76см. Подготовка и ручная разметка точек для гвоздиков, подбор этих самих гвоздиков, выбор материала и обработки деревянного холста и прочего. Особое счастье словил когда купил готовальню, о которой мог только мечтать в школьные годы, а потом такой кайф работы с циркулем и карандашом… Мне кажется я получил больше удовольствия от изготовления, работая руками, чем получатель подарка от дарения 😅 В результате получился портрет прекрасной девушки, картина с каркасом и рамкой, с дополнительным кожухом для транспортировки и портрет даже виден в темноте. Теперь после просмотра зачесалось повторить… Наконец понятный, бесплатный и понятный генератор картин! Возможно попробую заснять и поделюсь процессом с фидбеком на работу генератора. :)
Как-то пытался сделать цветной вариант. С наскоку не осилил, забросил. Из интересного - вместо закрашивания белым или черным исходного изображения я сравнивал карту промежуточного результата с исходным. Тогда учитывается не просто наиболее требующее нитку направление, но и влияние на светлые области. Засорение светлых областей уменьшается. Для более качественного расчета сначала пытался работать с множеством полутонов и даже учитывал какую часть пиксела закрашивает нить. Но признал это неопрадванным усложнением. У меня лучше был результат с небольшим количеством полутонов. Так же пытался просчитывать несколько шагов вперед для выбора оптимального направления нити. Не довел до вывода. Еще заметил, что у РингСтринг поле разбито на 4 сектора. И работа производится по секторам. Видимо переход к следующему сектору происходит при достижении некоторого уровня заполнения. Это ускоряет обработку и делает удобнее натяжку нити, но положительного влияния на качество не заметил. Возможно не вник.
Блин, бро. Ты сумасшедший изобретатель в моих глазах (мультикам 2000-х спасибо) мы с сыном смотрим твои видео с огромным интересом. Очень крутой канал👍
Друже, есть чудная идея как раз для тебя! Про робота и chatgpt. Как на счёт принять такой вызов: сделать робота, который будет ездить за тобой по квартире, слушать твои вопросы, передавать их - chatgpt и отвечать его ответ, через какой-нибудь онлайн голосовой синтезатор ?? Залайкайте, плес, чтоб Алекс увидел и попробовал сделать это)
Минимальное расстояние вычисляется по формуле: sin((360/S)/2)*2sr S - сумма точек s - минимальное расстояние от точки до точки по дуге, исчисляемое в расстоянии от n-ой до (n+1)-ой точки r - радиус окружности s можно вычислить следующим образом: 1) в кругу с чётным количеством точек: s = |номер точки 1 - номер точки 2| s(max)=S/2 If s>s(max) s = S - s 2) в кругу с нечётным количеством точек: s = |номер точки 1 - номер точки 2| s(max)=(S-1)/2 If s>s(max) s = S - s
Делаю жене в подарок такую картину, а тут Гайвер! Нашел программы, которые высчитывают последовательность нитей, осталось только сделать "холст" из фанеры и гвоздей. Спасибо 👍
Обалдеть, какая титаническая работа проделана! Восхищаюсь твоему упорству и тяге к познанию. И разобрался и запрограммировал и алгоритмы сам придумал... 👍
Ребятки! Очень лютый "Вызов принят" получается. И в таком формате Gyver теперь не в одного затащит тему. Как-же это сильно сплотит его-нашу аудиторию... Только представить достаточно факт, как проект переплюнет всех в этой теме, являясь таким близким и народным!)
Блин, думал буквально месяц назад про то, чтобы автоматизировать этот процесс и тут вижу "Час назад" вышел ролик от Алекса Гайвера. Интересно, посмотрим.
Ну просто очень круто!) Alex, ты лучший! У меня зрение очень плохое, рингстринг еле сплел, а сделать шаблон самому и мечтать нечего, но я знал, что гайвер сможет и окунет нас в процесс с головой!) удачи тебе во всем!
Я так думаю- надо сразу вводить ограничение на нити. Пиксели разделить по яркости. 240 всего. Шаг 24. Всего 10 шагов. Каждый шаг- одна проходящая нитка. При яркости 240- 0 нитей проходящих через пиксель. При яркости 0- 10. При яркости 120- 5. И тд. Не всегда получится идеально, поэтому разрешить погрешность в 2 нити. Если по другому никак, то можно провести или пропустить нить или две через пиксель.
Делал давненько фото на текстолите по офсетной печати и там для увеличения качества нужно было подбирать палитру цветов/размер виртуального пикселя по которому считалась яркость. Думаю тут что-то похожее можно использовать Из общих мыслей: 1) Учитывать не только количество черных пикселей, но и количество белых. Либо в виде порога, либо в вычитая из черных и подбирая максимальный вариант 2) Можно попробовать брать не "прямые" линии между гвоздями, а средний цвет линии определенной ширины 3) Размывать изображение до прогонки линиями 4) Построение не одного варианта, а нескольких(десятков-сотен) с разными начальными положениями и выбором оптимального по близости среднего цвета областей к исходному 5) В случае равенства/превышения порога из п.1. разрешить перемещаться до другой точки по кругу Возможный ответ на вопрос о поиске мин расстояния - использовать полярный угол. Чем меньше, тем меньше декартово расстояние между точками
Было бы здорово учитывать ещё и толщину гвоздей и с какой стороны гвоздя заводить/выводить нитку, поскольку гвоздь не точка и при плетении систематическая погрешность😅
11:20 алгоритм кратчайшего пути для N точек на окружности: 1-Вычесть из большего меньшее (записать в d) 2-Если число больше N/2, то мин расстояние = N - d 3-Иначе мин расстояние = d
На заметку! У рингстринга используются очень качественные никелированные гвозди с очень гладкой шляпкой, от которых нитка не рвётся и нитка нейлоновая, которую чтобы порвать нужно очень постараться.
11:29 - если я правильно понял вопрос, то, например- s0 = 2пr/n // s0 - расстояние между двумя соседними, n - кол-во точек х1, х2 - нумерация точек If (|x2-x1| > = n/2) then ( S= s0*(n+x1-x2)) else ( S=s0*(x2-x1))
В алгоритме не хватает рандома, желательно синего шума. А ещё для эстетичности расчётов думаю надо чтобы чёрная нить на белых пикселях отнимала очки оценки полезности, а не просто не давала их. Так мы проанализируем самые бесполезные линии.
Алекс, думаю, ты и сам об этом думаешь, но как доведёшь свои чёрно-белые ниточные картины до идеала, можно попробовать в цвете! Такого я ещё нигде не слышал.
Супер! Я сам некоторое время думал как же реализовать такой алгоритм, но до такой простой идеи не додумался. Мысль про улучшение: сейчас алгоритм выбирает путь который покроет максимальное количество чётных пикселей, но никак не учитывает белые пиксели которые он покроет зря. Если для белых пикселей ввести штраф (вычитать из суммы черных количество белых) то возможно алгоритм перестанет так сильно закрашивать белые области
Алекс, Спасибо очень крутой проект) ждем модернизацию.... я добрался до паяльника и пробую сделать кое что из ваших проектов, так что желаю вам и дальнейших творческих успехов)
11:17 - решения два, одно из просты, сравнить модуль дельты позиций точек с прямой и реверснутой сетками. В нашей ситуации код на C++ int min_ring_length(int delta, int size) { return min(size - abs(delta), abs(delta)); } // min_ring_length(2 - 14, 16) == 4, всё верно работает, пока значение delta не меньше -size и не больше size
Алекс, для того, что бы не сверлить дырки под гвозди, и они не расщепляли доску, надо эти гвозди затупить. То есть, просто ставишь острым концом гвоздь на железку покрепче и делаешь по нему пару не сильных ударов молотком. А потом спокойно забиваешь тупой гвоздь в доску. Это реально работает, сам пробовал не раз.
Круто очень! И ещё благодарю за идеи, что можно с этим всем делать. Если не заленюсь, буду пробовать. Реклама готовых наборов такой творческий порыв не вызывала...
Какая интересная жизнь у Пельменя!.. Постоянно что-то ездит, шуршит, жужжит, мигает, печатается, а главное и кормушку сделали (которую можно взломать))))
Алекс идея просто трэш! У большинства не хватит ни терпения ни усидчивости это понять и собрать! Может лучше станочек по выжиганию на этих досках? Вроде там ардуинка, драйверы, пара моторчиков, жало для выжигания и какое то втягивающее или поворотное реле...
Как вариант это слоеный пирог, раскладываешь картинку на слои по градации цвета и вот потом для каждого слоя делаешь алгоритм с учетом наименьшего пересечения ниткой предыдущего слоя (слоев). И что не мало важно нитка в одном слое не должна пересекать нитку этого слоя
Мне кажется надо на первом этапе для каждой возможной линии определить её «черность» от 0 до 256 посчитав кол-во встреченных черных пикселей в зависимости от её длины, например при длине линии в 100пкс встретили 50пкс и присвоили линии 128, при длине линии в 50пкс встретили 25пкс и тоже присвоили 128. На втором этапе надо заставить трассировщик так построить маршрут чтобы максимально точно приблизиться к «черности» линий. При этом можно скажем задать допустимое отклонение от нужной «черности» в +/-10ед. или считать что за один проход чернее становиться на 5 ед.
Есть предложение к исходному алгоритму - определять не путь и вычитать его, а разбить холст на пиксели(или нители, они по размеру будут разные меньше к краям), которые покрывает набор хорд из ниток, и уже для каждой нити(хорды) определить вес, выбрать наиболее используемые и уже имеющийся набор используемых хорд - перевести в граф для плетения
Спасибо за очень интересный проект, в качестве дополнения есть вариант иногда прерывать последовательность линий, если из конкретной точки невозможно сделать соединение с другими точками не закрасив определённый процент, тогда программа анализирует другие точки для старта находя наилучший вариант, в результате нужно условно протянуть нить по окружности, можно в виде змейки для красоты, до нужной точки и начать новый цикл линий. В самом конце нужно будет добавить ещё несколько проходов по окружности что бы получилась рамка и не было зрительных пробелов на контуре.
Я думаю, у меня есть неплохой фикс для твоего алгоритма. Чтобы светлые части изображения не затемнялись нитками так сильно, я бы попробовал не просто вычитать цвет из исходного изображения вплоть до нуля (если считать белый нулем), а уходить в минус (хранить "отрицательный" цвет можно например в отдельном канале или во вспомогательном изображении). Дело в том, что в твоем алгоритме учитывается оставшийся темный цвет на рисунке но не учитывается сколько же черного мы уже добавили в светлые области. То есть при вычислении суммы черных пикселей на рисунке нужно корректировать значение с учетом уже нарисованных там линий. Получится что значение для линия проходящей через точки где уже "есть" нитки будет меньше. И чем больше таких точек тем меньше вероятность что алгоритм выберет эту линию в качестве следующий. С таким подходом я уверен не нужны будут костыли с запретными зонами и количеством нитий на гвоздь.
согласен
Ну что-то в этом есть.... (😏Зовите санитаров)
Еще проще - можно не рисовать белую линию на исходном изображении, а сумму черного для линии считать как сумма черного на исходном минус сумма черного на текущем полученном.
а что если попробовать не из черного в белый а из белого в черный в таком случаи картину загружать в инверсионном виде тогда прогрессия будет расти в обратную сторону
Если не пропускать нитку по белому вообще это сократит количество гвоздей и получится ерунда для самого белого цвета нужно ограничить количество пропусков нитки через эту область до 1.
А заметили какие Алекс красивые руки роботу, который нитки плёл, сделал!? Даже ногти ему накрасил. Видно робот любит Алекса, потому как, только у любящего робота хватит терпения столько ниток заплести. Лайк!
Алекс вообще молодец. Он роботу и сиськи приделал, на 20:06 видно :) Если серьезно, то крутой проект. Можно ещё в приложение диктовку голосом добавить. Чтобы оно голосом проговаривало какие гвозди соединять.
Еще и в 2 часа ночи)
Какая то толстая женщина плела ...
Секс робот
ещё и из сантеха такое замутить! Ну, мастер!
Природа настолько очистилась, что Алекс начал выпускать по 2 видео в неделю!
Это робот бармен помогает
Это чаталекс все за него делает
В очередной раз мне не слишком интересны такие "картины", и вообще поделки. Но совершенно балдею от процесса рассуждения и достижения результата методом проб и ошибок в совершенно необычных областях! За это уважаю и ценю! Спасибо Алекс!
Плюсую. Гораздо интереснее разработка робота, «красящего стенку», чем покрашенная стенка.
Спасибо тебе Саня! Те знания которые ты даёшь, никогда, никто не даст ни в одном учебном заведении, так, как это преподносишь ты. Учиться становится действительно интересно.
Чему тебя тут научили? Тебе дали всё готовое, а ты создаешь иллюзию что это ты сам до этого допер. Если тебе нравится учиться, значит ты где-то ошибаешься, человеческий мозг очень ленив и все попытки вбивания информации всячески пытается избегать. Соответственно он не может приносить удовольствия. Другой момент, если тебе это реально интересно и ты получаешь ответы на свои вопросы и потребности, которые будут исчерпаны на поверхностном уровне. В любом случае, извини что вмешался и успехов в обучении.
лол, типичный неуч, косинусы и алгоритмы тут основа, а их учат в уч. заведениях, а не на ютубе. Ну, по крайней мере у нас, в России.
@@undetectby вот так вот взял и разрушил его мирок
У вас изначально неправильная концепция: картина закрашивается не нитями, а их пересечениями! нужен рекурсивный алгоритм для поиска всех пересечений следующего шага, а не пикселей! человеческий глаз устроен так, что пересечение двух нитей для него намного значимее чем вся нить! кроме того очень важен угол пересечения, чем он больше тем менее значим!
⠀
ШЕДЕВР получается тогда, когда человеку нравиться то, чем он занимается.
Молодец Алекс!
"Нравится" пишется без мягкого знака ☝️
@@mudofel согласен. Но для человека, который знает три языка, причем русский не родной, думаю это не так важно...
@@mudofel🤓🤓🤓
Вместо жесткого ограничения на минимальный угол, можно добавить вес - чем меньше угол между хордами, тем алгоритму должно быть труднее провести хорду. Аналогично с числом ниток на гвоздь.
Ну будет у тебя на 100 метров 30 см погрешности. Тебе не ракету из этих ниток строить.
Ого 2 видео за неделю, так неожиданно и приятно😊
Согласен
Полностью согл
+
Это значет что ближайшее месяца 3 видео не будет😊
Адвокат Егоров включился )
Мысль для улучшения:
Может нужно позволить нитке идти иногда не через картину, а по внешнему кругу. Тогда получится как бы скипнуть некоторые места и наоборот дозакрасить более светлые.
Не знаю по каким параметрам разрешать программе это делать, но я думаю можно определить методом тыка
Не, плохой вариант
@@ivanromanchenko459 лол. Ну ладно. Раз ты сказала, значит не надо.
Может все же объяснишь?
@@Stepan.K Могут появиться чрезмерно толстые края у рисунка. В одном месте будет жирный край, а в другом - нет.
@@ДенисОлейник-э6е, может ограничить это каким-то параметром или взять нитку потоньше
Да, сделать как-то, чтобы ценность изображения возрастала по приближению к центру картины и если области по краям будут чуть темнее, чем нужно, то это нестрашно
Гениальный Гайвер, как приятно видеть видосы так часто. Вдохновляешь на свершения! Сам торчу в самоделках и программировании, включая Пайтон.
ЗЫ: ОООЧень жду твой обещанный румтур!
Бабушки старше 72 лет на лавочке
Алекс , могу ошибаться но когда у тебя тянется нитка ты вычитаешь пиксели из исходной картины , но когда ты проводишь еще одну которая пересекает первую ты не добавляешь обратно пиксель в месте пересечения из за этого и появляется оочень много черного без полутонов
Ошибка в том, что вы считаете только черный, поэтому у вас получается на светлых областях слишком много черного. Вам нужно считать белый или как минимум учитывать уже нарисованный черный, а не делать вид, что теперь у вас там белая линия.
там вопрос уровня белого и снижения числа градация серого в исходном изображении.
еще есть вероятность что надо определять условную глубину изображения по полутонам и раскладывать картинку на слои и вот уже по каждому отдельному слою строить сетку.....
Именно так. Можно например не рисовать белую линию на исходном изображении, а сумму черного на линии считать как сумма черного на исходном минус сумма черного на текущем полученном. Тогда будут учитываться уже полученные нити на светлых областях. А сейчас эта информация совсем теряется.
Класс, а теперь иди и сделай пулл реквест или хотя ишью, в котором подробно и понятным хоть немного техническим языком опиши, что конкретно ты имел ввиду
лол,все в видосе
Самый лучший канал на ЮТУБЕ ! РЕСПЕКТ! Гений, а не человек! Очень рад, что наткнулся на твой канал 3 года назад!))
Спасибо!!! Обязательно повторю !
Видео огонь! Сразу захотелось открыть пайчарм. Есть идея, что нужно при выборе траектории нити учитывать не количество перекрываемого черного, а процент черного цвета в отношении к общей длине линии. То есть короткая линия может содержать в сумме меньше черного, чем более длинная линия. Но правильнее будет выбрать ту, которая "чернее" безотносительно длины в пикселях.
Только вчера задумался как сделать такую картину самому, а тот вот ответ сразу. Красавчик.
Два замечания к использованному подходу в алгоритме:
1. Для функции оптимизации прокладывания нити стоит учитывать не только вклад нити в чёрный цвет, но и сколько белых точек она затемняет - т.е. функция должна учитывать не только вклад в результат, но и порчу тоже
2. Стоит вначале нарисовать все линии от каждого гвоздя, а потом уже пройтись по кругу и выбрать последовательность обхода гвоздей (обычная задача комивояжёра по графу), чтобы сделать это одной нитью
С первым пунктом полностью согласен. Для каждой нити надо вычислять её ошибку как корень суммы квадратов расхождения для каждого пикселя деленный на количество пикселей.
Хаха, обычная задача коммивояжера, обычная np полная задача, на графе в 100+ вершин, куда уж проще то :)
@@Samiron вот тоже об этом подумал)
@@Samiron Дык не нужно оптимальное решение; достаточно "более-менее близкого к оптимальному" (или "не слишком уж неоптимального") -- тут уже не NP, а полиномиальная сложность (а при некоторых приёмчиках упрощения - и с невысокими показателями степеней).
@@dmitryvodolazsky по этим "эвристикам" некоторые кандидатские защищают, вам не кажется что это не совсем то что можно назвать "обычная задача коммивояжера"?
Спасибо за то, что делишься знаниями. Это дорогого стоит в нынешнее время, испорченное капитализмом.
Спасибо за видео! Можно узнать когда планируется 2я часть?)
Вот он чудесный мир программирования! В умелых руках всё в чудо превращается! 👏
Ура мой любимый канал выпускает сразу два видео за неделю, спасибо
Если человек талант, то он талант во всём!!! Молодец, кайфую от твоих видео)))
Кайф! Ждём с нетерпением допиливания) я загорелся пойду шкаф ломать, доску жалко покупать) а гвозди заменю на саморезы😂
Видео огонь, спасибо за такие проекты, давно видел их рекламу, но не хотел тратить деньги, сейчас даже еще интереснее, посмотреть как будет реализован проект и обязательно его повторить, еще раз большое спасибо и удачи!)
это обалденно. ждём вторую часть
Большой уважение тебе. Очень давно смотрю и прям получаю удовольствие 👍👍👍
Занимался программированием давно. Так же рассуждал и анализировал.
Потом судьба не сложилась.
Супер. Видос огонь!)
Дополнительный лайк за майку)
Честно, ну ты умище, Алекс. Просто гений. В одиночку такие проекты делаешь, что и группам людей не под силу. Восхищаюсь твоими навыками.
18:35 ты уже сделал робота? Красава!
Зачот!
Молодец. Надо возвращать молодому поколению ум и очумелые ручки!
Спасибо большое за твой труд друг!
Вот это подход! Наверное это один из лучших проектов после Гайверночника и пневматической пушки!
Алекс, классная реализация! Мне кажется, ограничение угла и т.п. - это все "костыли", правильный алгоритм должен сразу работать правильно. Посмотрите на фото от RingString, там весь фон равномерно серый. Раз прохождения нитей через белые области не избежать, то надо постепенно "сдвигать" белый цвет в серую область. Т.е. раз в одном месте нити прошли через белую область и сделали ее серой, то и все остальные белые области должны стать такими же серыми. Таким образом удастся сделать равномерно серый фон. И это как раз заставит алгоритм равномернее распределять нити.
Как всегда, супер проект!!!
Оч вдохновляет!
Кажется, что если использовать не гвозди ~ 1-2 мм толщиной, а булавки толщиной 0,.. мм ,
то результат будет ближе к тому, что рисует программа!
Еще одно возможное улучшение - добавить в алгос трассировки возможность просчитывать изменение цвета на несколько шагов вперед и выбирать тот, в котором будет больше заполнение черного. Это позволит более четко обводить кривые линии, к примеру
Ох! Прям до мурашек! 😊 В прошлом году, ещё до выхода RingString, сделал в подарок портрет из нитей. Конечно код я не писал, но сколько интернетов и генераторов я перепробовал… Потом несколько недель работы, и самым сложным было сделать холст. Кстати, такой способ распечатки карты холста постером в Acrobat Reader тоже думал, но по каким-то причинам не подошло (уже не помню). Холст был радиусом 50см на рамке 76*76см. Подготовка и ручная разметка точек для гвоздиков, подбор этих самих гвоздиков, выбор материала и обработки деревянного холста и прочего. Особое счастье словил когда купил готовальню, о которой мог только мечтать в школьные годы, а потом такой кайф работы с циркулем и карандашом… Мне кажется я получил больше удовольствия от изготовления, работая руками, чем получатель подарка от дарения 😅 В результате получился портрет прекрасной девушки, картина с каркасом и рамкой, с дополнительным кожухом для транспортировки и портрет даже виден в темноте.
Теперь после просмотра зачесалось повторить… Наконец понятный, бесплатный и понятный генератор картин! Возможно попробую заснять и поделюсь процессом с фидбеком на работу генератора. :)
Радуешь второй день подряд))
Как-то пытался сделать цветной вариант. С наскоку не осилил, забросил. Из интересного - вместо закрашивания белым или черным исходного изображения я сравнивал карту промежуточного результата с исходным. Тогда учитывается не просто наиболее требующее нитку направление, но и влияние на светлые области. Засорение светлых областей уменьшается.
Для более качественного расчета сначала пытался работать с множеством полутонов и даже учитывал какую часть пиксела закрашивает нить. Но признал это неопрадванным усложнением. У меня лучше был результат с небольшим количеством полутонов.
Так же пытался просчитывать несколько шагов вперед для выбора оптимального направления нити. Не довел до вывода.
Еще заметил, что у РингСтринг поле разбито на 4 сектора. И работа производится по секторам. Видимо переход к следующему сектору происходит при достижении некоторого уровня заполнения. Это ускоряет обработку и делает удобнее натяжку нити, но положительного влияния на качество не заметил. Возможно не вник.
Жду вторую часть - год первый
Блин, бро. Ты сумасшедший изобретатель в моих глазах (мультикам 2000-х спасибо) мы с сыном смотрим твои видео с огромным интересом. Очень крутой канал👍
Такой кайф знать питон и другие языки программирования
Друже, есть чудная идея как раз для тебя! Про робота и chatgpt.
Как на счёт принять такой вызов: сделать робота, который будет ездить за тобой по квартире, слушать твои вопросы, передавать их - chatgpt и отвечать его ответ, через какой-нибудь онлайн голосовой синтезатор ??
Залайкайте, плес, чтоб Алекс увидел и попробовал сделать это)
Ждем 2ую часть)
Минимальное расстояние вычисляется по формуле:
sin((360/S)/2)*2sr
S - сумма точек
s - минимальное расстояние от точки до точки по дуге, исчисляемое в расстоянии от n-ой до (n+1)-ой точки
r - радиус окружности
s можно вычислить следующим образом:
1) в кругу с чётным количеством точек:
s = |номер точки 1 - номер точки 2|
s(max)=S/2
If s>s(max)
s = S - s
2) в кругу с нечётным количеством точек:
s = |номер точки 1 - номер точки 2|
s(max)=(S-1)/2
If s>s(max)
s = S - s
Интересный проект!
Возможно, стоит рассмотреть возможность использования белой нитки.
Так и до цветных ниток дойти можно 🤗
Делаю жене в подарок такую картину, а тут Гайвер!
Нашел программы, которые высчитывают последовательность нитей, осталось только сделать "холст" из фанеры и гвоздей. Спасибо 👍
Подскажите, программы нормально отрисовываюь? А то не попадалось пока нормальных
@@ЖорикВартанов-б2ю как будет в реале ещё пока не проверил, но в программе нормально, если поиграть с настройками
@@otsy7947 подскажите,что за прога?
@@ЖорикВартанов-б2ю сегодня не дома, так не помню, завтра вечером скину
@@ЖорикВартанов-б2ю ссылки не проходят
Думаю можно добавить в алгоритм разрешение на разрыв нити, то есть можно идти по окружности до нового гвоздя и начинать движение уже с него
Обалдеть, какая титаническая работа проделана! Восхищаюсь твоему упорству и тяге к познанию. И разобрался и запрограммировал и алгоритмы сам придумал... 👍
Ты красава 💪🤝
Пора внедрять твои уроки в школьный курс , это не только интересно и познавательно,но и мозг заставляет развиваться .
Ребятки! Очень лютый "Вызов принят" получается. И в таком формате Gyver теперь не в одного затащит тему. Как-же это сильно сплотит его-нашу аудиторию...
Только представить достаточно факт, как проект переплюнет всех в этой теме, являясь таким близким и народным!)
Супер! Спасибо! Интересно!
Блин, думал буквально месяц назад про то, чтобы автоматизировать этот процесс и тут вижу "Час назад" вышел ролик от Алекса Гайвера. Интересно, посмотрим.
Очень ждал этого робота!
Ну просто очень круто!) Alex, ты лучший! У меня зрение очень плохое, рингстринг еле сплел, а сделать шаблон самому и мечтать нечего, но я знал, что гайвер сможет и окунет нас в процесс с головой!) удачи тебе во всем!
Ура! Давно ждал когда сделаешь это. Надеюсь смогу сделать картину ракеты)
Я так думаю- надо сразу вводить ограничение на нити.
Пиксели разделить по яркости.
240 всего.
Шаг 24.
Всего 10 шагов.
Каждый шаг- одна проходящая нитка.
При яркости 240- 0 нитей проходящих через пиксель.
При яркости 0- 10.
При яркости 120- 5.
И тд.
Не всегда получится идеально, поэтому разрешить погрешность в 2 нити.
Если по другому никак, то можно провести или пропустить нить или две через пиксель.
Отличный проект! Будет круто если бы станок смог бы создавать такие картины!
Делал давненько фото на текстолите по офсетной печати и там для увеличения качества нужно было подбирать палитру цветов/размер виртуального пикселя по которому считалась яркость. Думаю тут что-то похожее можно использовать
Из общих мыслей:
1) Учитывать не только количество черных пикселей, но и количество белых. Либо в виде порога, либо в вычитая из черных и подбирая максимальный вариант
2) Можно попробовать брать не "прямые" линии между гвоздями, а средний цвет линии определенной ширины
3) Размывать изображение до прогонки линиями
4) Построение не одного варианта, а нескольких(десятков-сотен) с разными начальными положениями и выбором оптимального по близости среднего цвета областей к исходному
5) В случае равенства/превышения порога из п.1. разрешить перемещаться до другой точки по кругу
Возможный ответ на вопрос о поиске мин расстояния - использовать полярный угол. Чем меньше, тем меньше декартово расстояние между точками
Было бы здорово учитывать ещё и толщину гвоздей и с какой стороны гвоздя заводить/выводить нитку, поскольку гвоздь не точка и при плетении систематическая погрешность😅
11:20 алгоритм кратчайшего пути для N точек на окружности:
1-Вычесть из большего меньшее (записать в d)
2-Если число больше N/2, то мин расстояние = N - d
3-Иначе мин расстояние = d
Когда будет Вторая часть??
Блииин. А я на 8 марта рингстринг жене подарил. И все это время думал как сделать станок для плетения на ардуинке . А тут как-раз видео в тему!
Эка куда вас, коллега, занесло! Но все инженеры веселятся как хотят)
На заметку! У рингстринга используются очень качественные никелированные гвозди с очень гладкой шляпкой, от которых нитка не рвётся и нитка нейлоновая, которую чтобы порвать нужно очень постараться.
Ну вот, а то уже нет сил на паяльники 3 год смотреть..)
11:29 - если я правильно понял вопрос, то, например-
s0 = 2пr/n // s0 - расстояние между двумя соседними, n - кол-во точек
х1, х2 - нумерация точек
If (|x2-x1| > = n/2) then (
S= s0*(n+x1-x2)) else (
S=s0*(x2-x1))
когда же выйдет вторая часть, уже с улучшенным алгоритмом
Как всегда посмотрел и подумал, не ужели во всём этом реально можно разбираться) спасибо за позновательные видео!
а часть 2 вышла?
Заспойлерил робоплëта с красивыми руками. Теперь с нетерпентем жду следующую серию, что бы увидить робоплëта во всей красе 😊
Почему бы не применить к изначальному изображению фильтр выделения границ? Например, использовать оператор Собеля
В этом хобби плести интересно самостоятельно, а вот станок чтобы гвозди набивать - реально полезный инструмент.
В алгоритме не хватает рандома, желательно синего шума. А ещё для эстетичности расчётов думаю надо чтобы чёрная нить на белых пикселях отнимала очки оценки полезности, а не просто не давала их. Так мы проанализируем самые бесполезные линии.
Good job Russia. Best regards from Poland.
Алекс, думаю, ты и сам об этом думаешь, но как доведёшь свои чёрно-белые ниточные картины до идеала, можно попробовать в цвете!
Такого я ещё нигде не слышал.
Супер! Я сам некоторое время думал как же реализовать такой алгоритм, но до такой простой идеи не додумался.
Мысль про улучшение: сейчас алгоритм выбирает путь который покроет максимальное количество чётных пикселей, но никак не учитывает белые пиксели которые он покроет зря. Если для белых пикселей ввести штраф (вычитать из суммы черных количество белых) то возможно алгоритм перестанет так сильно закрашивать белые области
Алекс, Спасибо очень крутой проект) ждем модернизацию.... я добрался до паяльника и пробую сделать кое что из ваших проектов, так что желаю вам и дальнейших творческих успехов)
11:17 - решения два, одно из просты, сравнить модуль дельты позиций точек с прямой и реверснутой сетками. В нашей ситуации код на C++
int min_ring_length(int delta, int size) {
return min(size - abs(delta), abs(delta));
} // min_ring_length(2 - 14, 16) == 4, всё верно работает, пока значение delta не меньше -size и не больше size
Мне или показалось, или ты охренел... Где вторая часть?
Где прода? Год прошёл!!!!!
Вот он следующий проект (после эмбилайта), который я повторю!
Эмбилайт повторял кстати 3 раза и еще повторять буду))) спасибо огромное!
Очень сильно ждём вторую часть
Кто согласен , лайк
Алекс, для того, что бы не сверлить дырки под гвозди, и они не расщепляли доску, надо эти гвозди затупить. То есть, просто ставишь острым концом гвоздь на железку покрепче и делаешь по нему пару не сильных ударов молотком. А потом спокойно забиваешь тупой гвоздь в доску. Это реально работает, сам пробовал не раз.
Круто очень! И ещё благодарю за идеи, что можно с этим всем делать. Если не заленюсь, буду пробовать. Реклама готовых наборов такой творческий порыв не вызывала...
Какая интересная жизнь у Пельменя!.. Постоянно что-то ездит, шуршит, жужжит, мигает, печатается, а главное и кормушку сделали (которую можно взломать))))
Алекс идея просто трэш! У большинства не хватит ни терпения ни усидчивости это понять и собрать! Может лучше станочек по выжиганию на этих досках? Вроде там ардуинка, драйверы, пара моторчиков, жало для выжигания и какое то втягивающее или поворотное реле...
Ну ты просто человечище)) большой респект за работу)
Я так понимаю, это первый проект, который не смог поддаться сразу. Давай АлексГайвер, мы в тебя верим!
11:20 Предлагаю вариант алгоритма поиска расстояния между точками:
N - количество точек
n1, n2 - номера точек между которыми ищем расстояние, нумерация с 0
x1 = min( n1, n2 )
x2 = max( n1, n2 )
distance = min( x2 - x1 , x1 + N - x2 )
В этом видео прекрасно всё, много полезной информации, девушка (хоть и частично), котик.
Хоть это все слишком сложно, но безумно интересно наблюдать за творческим человеком!
Как вариант это слоеный пирог, раскладываешь картинку на слои по градации цвета и вот потом для каждого слоя делаешь алгоритм с учетом наименьшего пересечения ниткой предыдущего слоя (слоев). И что не мало важно нитка в одном слое не должна пересекать нитку этого слоя
Автор, за вами не успеть, вы ии-2 . Зашла, так как сама создаю стиль одежды, обуви, сумок с элементами плетения.
Удачи, Торнадо!
Очень мощно! Со стороны, кажется, что если холст будет больше, то проблема с темными участками станет менее выражена)
Мне кажется надо на первом этапе для каждой возможной линии определить её «черность» от 0 до 256 посчитав кол-во встреченных черных пикселей в зависимости от её длины, например при длине линии в 100пкс встретили 50пкс и присвоили линии 128, при длине линии в 50пкс встретили 25пкс и тоже присвоили 128. На втором этапе надо заставить трассировщик так построить маршрут чтобы максимально точно приблизиться к «черности» линий. При этом можно скажем задать допустимое отклонение от нужной «черности» в +/-10ед. или считать что за один проход чернее становиться на 5 ед.
Гениально! С нетерпением ждем продолжения проекта! Спасибо!
Есть предложение к исходному алгоритму - определять не путь и вычитать его, а разбить холст на пиксели(или нители, они по размеру будут разные меньше к краям), которые покрывает набор хорд из ниток, и уже для каждой нити(хорды) определить вес, выбрать наиболее используемые и уже имеющийся набор используемых хорд - перевести в граф для плетения
Дорогой Кекс ! всё супер продолжай свои эксперименты дальше ждём-с.
Спасибо за очень интересный проект, в качестве дополнения есть вариант иногда прерывать последовательность линий, если из конкретной точки невозможно сделать соединение с другими точками не закрасив определённый процент, тогда программа анализирует другие точки для старта находя наилучший вариант, в результате нужно условно протянуть нить по окружности, можно в виде змейки для красоты, до нужной точки и начать новый цикл линий. В самом конце нужно будет добавить ещё несколько проходов по окружности что бы получилась рамка и не было зрительных пробелов на контуре.
Круто! Начинал смотреть канал, когда поделки были попроще. А теперь не угнаться за тобой. Спасибо, всегда очень интересно!