Преобразование пикселей в кривые Безье в ActionScript 3 - PullRequest
1 голос
/ 19 июня 2009

Хорошо, поэтому я постараюсь быть как можно более информативным.

Я работаю над проектом для клиента, для которого требуется загруженная картинка в стиле jibjab.

Я хотел бы иметь возможность создать объект, сохраняемый в базе данных, который содержит якорные / управляющие позиции более изогнутой формы, чтобы я мог вытащить его позже и повторно маскировать объект. Все это довольно легко сделать, за исключением одного улова: мне нужно создать объект Безье из нарисованного пользователем контура.

Пока вот как я представляю, как идет процесс:

при наведении мыши, создать новый спрайт, beginFill и moveTo для положения мыши.

при перемещении мыши, линия к координате XY.

при наведении мыши, endFill.

Все это прекрасно работает. Я мог бы просто хранить информацию здесь, но я бы посмотрел на ГИГАНТСКИЙ объект, полный тонн довольно бесполезных координат x / y, и никакого способа по-настоящему внести изменения в настройку, не помещая маркеры в каждый пиксель. (Я могу также дать конечному пользователю карандашный инструмент ...)

Вот что я думаю по поводу расчета кривой Безье:

1: выяснить, когда мне нужно начать новую кривую, и отследить xy пикселя в этом интервале. Я представляю, что это просто число пикселей, может быть, просто увеличить переменную count за ход мыши и сделать новую каждые x пикселей. Проблема здесь в том, что некоторые кривые будут неточными, а другие нет необходимости, но мне действительно нужна просто общая область, а не точное представление, чтобы она могла работать. Хотя я был бы счастлив с чем-то более умным.

2: возьмите каждый новый х / у, сохраните его как якорь и выясните, куда должен идти элемент управления, чтобы сделать линию кривой между этим и последним якорем. это где я действительно одержим Я уверен, что кто-то сделал это в одно мгновение, но никакие прибегающие к гуглу, похоже, не помогут мне с этим справиться. Я сделал много набросков и какую маленькую математику я могу обернуть вокруг себя, но, похоже, не могу найти способ преобразования пикселей в безье.

Возможно ли это? Все, что мне действительно нужно, это что-то, что приблизится к той же форме. Я думаю о том, чтобы разместить якоря только тогда, когда угол следующего пикселя превышает 180 градусов относительно текущей линии или чего-то еще, и просто схватить край дуги между этими изменениями, но как бы я ни старался, я не могу понять, как заставить это работать!

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

Джесси

Ответы [ 3 ]

1 голос
/ 19 июня 2009

В моем ответе на этот вопрос я обсуждаю использование autotrace для преобразования растровых изображений в безье. Я рекомендую передать ваш пользовательский рисунок через эту программу на сервере. Autotrace проделывает фантастическую работу по отслеживанию и упрощению, поэтому нет необходимости пытаться заново изобретать колесо.

1 голос
/ 19 июня 2009

Звучит как много работы, чтобы превратить пиксели в кривые Безье. Вы можете попробовать использовать что-то вроде линейного алгоритма наименьших квадратов. http://en.wikipedia.org/wiki/Linear_least_squares

Другой такт, не могли бы вы, чтобы ваши пользователи рисовали векторную графику? Таким образом, вы можете просто сохранить фигуры в базе данных.

Еще один крутой метод преобразования растра в вектор - это что-то вроде этой итерационной программы: http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

Удачи

0 голосов
/ 27 июня 2009

Спасибо за ответы, хотя я думаю, что мне, вероятно, следует более конкретно рассказать о приложении, мне действительно нужен только контур маски, поэтому преобразование изображений в векторы или многоугольники, несмотря на то, что это круто, не действительно исправить мою проблему. Алгоритм линейных наименьших квадратов мега крут, думаю, это может быть ближе к тому, что я ищу.

У меня сейчас есть обходной путь, я просто считаю движения мыши, затем каждый X (играя с ним, чтобы получить наиболее желательную кривую), я беру позицию xy. затем я беру любой другой сохраненный xy и превращаю его в якорь, остальные xys превращаются в элементы управления. Это дает несколько желательные результаты, но имеет некоторые незначительные проблемы: скорость, с которой рисуется маска, влияет на количество ручек, и на самом деле это просто получение общей области, а не точной подгонки. Интересно, что пользователи, кажется, рисуют медленнее для более точных фигур, поэтому это решение работает намного лучше, чем я себе представлял, но это не так хорошо, как могло бы быть. Это будет работать для клиента, поэтому, хотя нет причин продолжать его, мне нравится изучать новые вещи, и я потрачу немного времени на изучение линейных уравнений наименьшего числа и выяснение, могу ли я найти класс, который будет выполнять эти вычисления для меня. Если кто-нибудь сталкивается с кодом AS3 для этого типа вещей или хочет получить мой, дайте мне знать, это интересная головоломка.

...