Изменить: изменил ответ в соответствии с новыми изображениями и уточнениями.
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, вы должны поменять их месторасположение.