Применить искажение к поверхности Безье


8

Я пытаюсь смоделировать эффект деформации изображения, который используется в Adobe Photoshop.

Прямоугольное изображение деформируется в соответствии с кубической поверхностью Безье (в 2D все компоненты Z равны 0). Имея любую поверхность Безье, к ней можно применить вертикальное искажение .d[0,1]

Слева : входная поверхность Безье, , справа : выходная поверхность, d=0d=0.8

введите описание изображения здесь введите описание изображения здесь

Есть ли у вас какие-либо идеи, что делается с поверхностью Безье (16 баллов) при преобразовании из версии слева в выход справа?

Ответы:


5

Изменить: изменил ответ в соответствии с новыми изображениями и уточнениями.

for every control point p(k, n)
   p'(k, n) = ( p(k, n) - p(k) ) * d * l(k) + p(k, n)

где kиндекс строки и индекс nстолбца контрольной точки. lявляется коэффициентом возвышения и равен {-1, -1/3, 1/3, 1}. p(k)это центр k-го ряда.

Обоснование:

На новых изображениях красные и синие линии нарисованы от центра линии (p (k), которая в основном (k, 0)), до этой точки. В первой строке все контрольные точки, включая точки на графике (красные линии), перемещаются в одну и ту же точку на этой линии. p (k, n) - p (k) дает вектор, который перемещает точку из p (k) в p (k, n), которая теперь должна быть применена другим способом, перемещая точку в нужное место. На ваших графиках d = 1, так что все точки первой линии будут перемещены в центр. Вы можете легко решить уравнение, чтобы проверить это. d * l(0)равен -1, так что было бы, -p(k, n) + p(k) + p(k, n)что бы дать р (к).

На второй линии ваша синяя линия снова из точки в центр, но на этот раз она остановилась, прежде чем дойти до нее. Я не могу сказать, действительно ли оно вырезано из 1/3, но это было бы хорошей отправной точкой. Таким образом, та же формула все еще применяется. l равно -1/3, d равно 1, поэтому точка будет сдвинута на 1/3 пути. 3-е - то же самое, что и второе, но теперь оно движется наружу, поэтому l равно 1/3.

На последней линии все контрольные точки перемещаются из центральной точки этой линии. Это совершенно ясно, так как ваши линии встречаются в этом центре.

Единственная проблема, с которой может столкнуться эта формула, это допущение 1/3, кроме того, что я не вижу причины, по которой она должна потерпеть неудачу.

Примечание: я использовал строку, столбец при индексации, поэтому, если вы используете x, y, вы должны поменять их месторасположение.


Это сохраняет вертикальные линии, это правда. Но я работаю с поверхностью Безье (16 точек на плоскости), и я считаю, что это можно сделать, просто перемещая эти 16 точек, не вычисляя точки на кривых Безье и т. Д. Здесь вы можете увидеть, как работает поверхность Безье: philipandrews.org/ песочница / BezierSurface / bin / BezierSurface.swf
Иван Кукир

Я думаю, что нашел решение этой проблемы, если я правильно понял. Вы спрашиваете, как деформировать безье поверхность A, чтобы деформировать поверхность B или C в D с параметром d, равным 0,8, это правильно?
Джем Калионку

Ну, похоже, это не точная формула, но довольно близко. Я буду обдумывать это немного больше. Формула верна, по крайней мере, для точек на кривой.
Джем Калионку

Вы приближаетесь :) Но для второго примера также меняется координата Y. Как я уже говорил, все точки движутся вдоль линий, поэтому достаточно найти новую позицию для d = 1 для каждой точки, тогда я могу интерполировать линейно.
Иван Кукир

Я добавил еще одну картинку, она может вам помочь.
Иван Кукир
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.