SVG — C ++. Преобразовать вызовы кривой Безье с 2 определенными точками в вызовы с 3 определенными точками?

ссылка на теорию

C и c означают кривые с 3 точками.

S и S средние кривые с 2 точками определены.

Соответствующие функции (monkSVG + monkVG / openVG):

    void OpenVG_SVGHandler::onPathCubic( float x1, float y1, float x2, float y2, float x3, float y3 ) {
VGubyte seg = VG_CUBIC_TO | openVGRelative();
VGfloat data[6];

data[0] = x1; data[1] = y1;
data[2] = x2; data[3] = y2;
data[4] = x3; data[5] = y3;
vgAppendPathData( _current_group->current_path->path, 1, &seg, data);

}

void OpenVG_SVGHandler::onPathSCubic( float x2, float y2, float x3, float y3 ) {
VGubyte seg = VG_SCUBIC_TO | openVGRelative();
VGfloat data[4];

data[0] = x2; data[1] = y2;
data[2] = x3; data[3] = y3;
vgAppendPathData( _current_group->current_path->path, 1, &seg, data);

}

Проблема в том, что вторая функция (с 2 точками) приводит к тому, что изображение выглядит неправильно. Поэтому я хочу попробовать заменить его на функцию, которая выглядит как работоспособная.

Я пытался сохранить точку из предыдущего шага, но это дает неверный результат:

float x2 = d_string_to_float( c, &c );
float y2 = d_string_to_float( c, &c );
float x3 = d_string_to_float( c, &c );
float y3 = d_string_to_float( c, &c );
float x1 = 2 * prevX - x2;
float y1 = 2 * prevY - x2;
_handler->onPathCubic(x1, y1, x2, y2, x3, y3);
prevX = x3;
prevY = y3;

0

Решение

Давайте назовем переменные немного по-другому. У вас есть две кубические кривые Безье, одна с четырьмя точками A, B, C, D, а другая с точками E, F, G, H.

Функция SCubic пытается гарантировать, что D = E и (C + F) / 2 = D.

При первом вызове onPathCubic x1 = B, x2 = C, x3 = D. A установлен ранее. (Я только обсуждаю x для краткости, но вам понадобятся x и y).

Во второй раз, когда вы вызываете onPathCubic, вам нужно вычислить F, а также указать G и H. Как вы можете вычислить F? Ну, F = 2 * D — C.

Давайте посмотрим, как наши буквы отображаются на переменные во втором вызове:

D = E = prevX
F = x1
G = x2
H = x3

Это проблема, потому что вы не храните C, поэтому у вас недостаточно информации для вычисления F.

0

Другие решения

Мое решение — написать код, похожий на тот же, в другой библиотеке:

ссылка на сайт

0