C++ 用cairo绘制bezier路径
我需要借助C++中的Cairo绘制一组贝塞尔路径。 到目前为止,我可以画一条路径 但是我需要画许多由多条贝塞尔曲线和直线组成的路径 我从python生成的外部词汇中加载路径集合。 在这里,对于这个最小的示例,我通过变量C++ 用cairo绘制bezier路径,c++,drawing,bezier,cairo,C++,Drawing,Bezier,Cairo,我需要借助C++中的Cairo绘制一组贝塞尔路径。 到目前为止,我可以画一条路径 但是我需要画许多由多条贝塞尔曲线和直线组成的路径 我从python生成的外部词汇中加载路径集合。 在这里,对于这个最小的示例,我通过变量path0引入一个路径 它是一个向量,由2个子向量组成。第一条表示贝塞尔样条曲线,而第二条表示简单的直线 第一个子向量自然有4个分量,而第二个子向量只有2个分量 下面是我的代码示例 #include <iostream> #include <vector>
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)代码>。
- 在我的版本中,这将添加从曲线末端开始的线段
- 在您的版本中,调用
删除了路径。因为没有当前点,所以线_to不起任何作用(它为以下绘图命令设置当前点)cairo\u stroke()
t.cpp:35:39:错误:未在此范围内声明“symbol”