Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用cairo绘制bezier路径_C++_Drawing_Bezier_Cairo - Fatal编程技术网

C++ 用cairo绘制bezier路径

C++ 用cairo绘制bezier路径,c++,drawing,bezier,cairo,C++,Drawing,Bezier,Cairo,我需要借助C++中的Cairo绘制一组贝塞尔路径。 到目前为止,我可以画一条路径 但是我需要画许多由多条贝塞尔曲线和直线组成的路径 我从python生成的外部词汇中加载路径集合。 在这里,对于这个最小的示例,我通过变量path0引入一个路径 它是一个向量,由2个子向量组成。第一条表示贝塞尔样条曲线,而第二条表示简单的直线 第一个子向量自然有4个分量,而第二个子向量只有2个分量 下面是我的代码示例 #include <iostream> #include <vector>

我需要借助C++中的Cairo绘制一组贝塞尔路径。 到目前为止,我可以画一条路径

但是我需要画许多由多条贝塞尔曲线和直线组成的路径

我从python生成的外部词汇中加载路径集合。 在这里,对于这个最小的示例,我通过变量
path0
引入一个路径

它是一个向量,由2个子向量组成。第一条表示贝塞尔样条曲线,而第二条表示简单的直线

第一个子向量自然有4个分量,而第二个子向量只有2个分量

下面是我的代码示例

#include <iostream>
#include <vector>
#include "cairo.h"
#include <string> 

int main(int argc, char* argv[])
{
    cairo_surface_t* surface;
    cairo_t* cr;

    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1000, 1000);
    cr = cairo_create(surface);
    cairo_scale(cr, 1, 1);
    cairo_set_line_width(cr, 1);
    cairo_set_source_rgb(cr, 0, 0, 0);  

    // Here goes the svg-path. It is a bezier curve and unconnected line. 
    
    std::vector<std::vector<std::vector<double>>> path0 = { {{82.801,-204.48},{66.241,-204.48},{52.561,-214.56},{52.561,-235.44}},{{277.921,-192.24},{277.921,-173.5}} };
        
        // Here I put the initial point in the middle of the canvas. 

        double x0 = 300+path0[0][0][0];
        double y0 = 700+ path0[0][0][1];

        cairo_move_to(cr, x0, y0);

        // Parsing path
        for (int i = 0; i < path0.size(); i++) {
            if (path0[i].size() == 4) {
                cairo_rel_curve_to(cr, path0[i][1][0], path0[i][1][1], path0[i][2][0], path0[i][2][1], path0[i][3][0], path0[i][3][1]);
                cairo_stroke(cr);
            }
            if (path0[i].size() == 2) {
                cairo_rel_line_to(cr, symbol[0][i][1][0], symbol[0][i][1][1]);
                cairo_stroke(cr);
            }
        }
        cairo_surface_write_to_png(surface, "stroke.png");
        cairo_destroy(cr);
        cairo_surface_destroy(surface);

        return 0;

}
#包括
#包括
#包括“cairo.h”
#包括
int main(int argc,char*argv[])
{
开罗曲面;
开罗*cr;
surface=cairo\u image\u surface\u create(cairo\u格式\u ARGB32,1000,1000);
cr=cairo_创建(曲面);
cairo_量表(cr,1,1);
cairo_集_线_宽(cr,1);
cairo\u set\u source\u rgb(cr,0,0,0);
//这里是svg路径。它是一条贝塞尔曲线和未连接的线。
向量路径0={{{82.801,-204.48},{66.241,-204.48},{52.561,-214.56},{52.561,-235.44},{{277.921,-192.24},{277.921,-173.5};
在这里,我把初始点放在画布中间。
双x0=300+path0[0][0][0];
双y0=700+path0[0][0][1];
开罗移动到(cr,x0,y0);
//解析路径
对于(int i=0;i
关键是我在画布上只看到一条曲线。第二个可能在外面。 你能帮我理解我做错了什么吗


雅罗斯拉夫。

你能澄清一下你希望看到什么吗?通过以下更改,我得到了两行,但我不确定这是否是您想要看到的

--- t.cpp.orig  2020-10-13 17:00:12.404871474 +0200
+++ t.cpp   2020-10-13 17:04:20.573101739 +0200
@@ -29,13 +29,12 @@ int main(int argc, char* argv[])
         for (int i = 0; i < path0.size(); i++) {
             if (path0[i].size() == 4) {
                 cairo_rel_curve_to(cr, path0[i][1][0], path0[i][1][1], path0[i][2][0], path0[i][2][1], path0[i][3][0], path0[i][3][1]);
-                cairo_stroke(cr);
             }
             if (path0[i].size() == 2) {
-                cairo_rel_line_to(cr, symbol[0][i][1][0], symbol[0][i][1][1]);
-                cairo_stroke(cr);
+                cairo_rel_line_to(cr, path0[i][1][0], path0[i][1][1]);
             }
         }
+   cairo_stroke(cr);
         cairo_surface_write_to_png(surface, "stroke.png");
         cairo_destroy(cr);
         cairo_surface_destroy(surface);
——t.cpp.orig 2020-10-13 17:00:12.404871474+0200
+++t.cpp 2020-10-13 17:04:20.573101739+0200
@@-29,13+29,12@@int main(int argc,char*argv[]
对于(int i=0;i
结果是:

在上述程序中发生的是:

  • 首先调用
    cairo\u move\u to(cr,382.8495.5)
    。这决定了以下曲线的起点
  • 然后调用
    cairo\u rel\u curve\u to()
    。这将添加一条从当前点到类似于
    382.8+52.5495.5-235.4
    的曲线。其他两点描述曲线是如何弯曲的
  • 接下来是对cairo的调用(cr,277.9,-173.5)
    • 在我的版本中,这将添加从曲线末端开始的线段
    • 在您的版本中,调用
      cairo\u stroke()
      删除了路径。因为没有当前点,所以线_to不起任何作用(它为以下绘图命令设置当前点)

您的示例未编译:
t.cpp:35:39:错误:未在此范围内声明“symbol”