C ++。转换绘图贝塞尔曲线调用,将2个点定义为定义了3个点的调用?

时间:2013-08-27 12:07:06

标签: c++ svg bezier openvg

link to theory

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;

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

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

link