Итак, позвольте мне резюмировать, что вы хотите здесь сделать: учитывая кривую Безье или кривую B-сплайна и два новых местоположения для начальной и конечной точек, найдите новую кривую Безье / B-сплайн, которая более или менее сохраняет ту же форму, что и исходная кривая.
Один из способов добиться этого - найти преобразование, которое преобразует начальную / конечную точки в их новые местоположения, затем вы можете применить то же преобразование ко всем другим контрольным точкам кривой. По сути, это то же самое, что найти преобразование между линией, определенной начальной точкой кривой P и конечной точкой Q, и другой линией, определенной местоположениями новых точек P * и Q *. Из P и P * мы можем найти вектор трансляции. Из линии PQ и линии P Q мы можем найти угол поворота. От длины | ПО | и длина | P Q | мы можем найти коэффициент масштабирования. Итак, объединив вектор переноса, угол поворота и масштабный коэффициент, мы сможем найти матрицу преобразования. Примените матрицу преобразования ко всем другим контрольным точкам, тогда вы сможете получить новую кривую, которая более или менее сохраняет ту же форму, что и исходная кривая.
Если вы действительно хотите компенсировать кривые, то это совсем другая история. Кривые смещения достигаются с помощью гораздо более сложного алгоритма (который я не буду здесь подробно описывать), и мы укажем расстояние смещения (может быть положительным или отрицательным, чтобы подразумевать смещение наружу / внутрь) вместо новых местоположений для начальной / конечной точек.