0

理论链接

定义了 3 个点的 C 和 c 平均曲线。

定义了 2 个点的 S 和 s 平均曲线。

相关函数为(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;
4

2 回答 2

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。

于 2013-08-27T15:26:35.433 回答
0

我的解决方案是在另一个库中编写类似的代码:

关联

于 2013-08-30T14:46:25.367 回答