开罗翻了一张画

时间:2014-11-10 16:45:25

标签: c++ cairo

我想用C ++和Cairo画这样的三角形和文字:

|\
| \
|PP\
|___\

如果我使用Cairo添加三角形和文本,我会得到:

 ___
|   /
|PP/
| /
|/

所以y轴是从上到下,但我想从下到上。所以我试图改变视点矩阵(cairo_transform(p,& mat);)或缩放数据(cairo_scale(p,1.0,-1.0);)。我明白了:

|\
| \
|bb\
|___\

现在三角形是我想要的方式但是TEXT是MIRRORED,我不想被镜像。

知道如何处理这个问题吗?

3 个答案:

答案 0 :(得分:5)

我处于类似OP的状态,要求我改变笛卡尔坐标系中的各种坐标,左下角的原点。 (我不得不移植一个使用与开罗不同的坐标系开发的旧视频游戏,由于时间限制/可能的计算错误/端口精度,我认为最好不要重写整个堆)幸运的是,我发现没问题改变开罗坐标系的方法。该方法基于开罗的内部转换矩阵,将开罗的输入转换为用户设备。解决方案是将此矩阵更改为反射矩阵,该矩阵通过x轴反映其输入,如下所示:

cairo_t *cr;
cairo_matrix_t x_reflection_matrix; 
cairo_matrix_init_identity(&x_reflection_matrix); // could not find a oneliner
/* reflection through the x axis equals the identity matrix with the bottom 
left value negated  */
x_reflection_matrix.yy = -1.0;
cairo_set_matrix(cr, &x_reflection_matrix);
// This would result in your drawing being done on top of the destination 
// surface, so we translate the surface down the full height
cairo_translate(cr, 0, SURFACE_HEIGHT); // replace SURFACE_HEIGHT
// ... do your drawing

但是有一个问题:文本也会被镜像。要解决这个问题,可以改变字体转换矩阵。所需的代码是:

cairo_matrix_t font_reflection_matrix;
// We first set the size, and then change it to a reflection matrix
cairo_set_font_size(cr, YOUR_SIZE);
cairo_get_font_matrix(cr, &font_reflection_matrix);
// reverse mirror the font drawing matrix
font_reflection_matrix.yy = font_reflection_matrix.yy * -1;
cairo_set_font_matrix(cr, &font_reflection_matrix);

答案 1 :(得分:1)

<强>答案

重新思考你的坐标并将它们正确传递给cairo。如果坐标源具有倒置轴,则预处理它们以翻转几何体。这将被称为胶水代码,它是必要的。

<强>东西

在2D计算机图形中,左上角的原点(0,0)和向下的y轴(参见gimp / photoshop,定位在html,webgl画布中)是很常见的事情。至少还有其他例子(PDFs)。 我不确定原因是什么,但我会假设纸上的阅读方向(从上到下)和/或在屏幕上呈现/绘制图像的过程< / em>的。 对我来说,这似乎是从第一个像素到最后一个像素在某个位置从程序上绘制图像的最简单方法(您不需要预先计算它的大小)。

我认为你并不孤单。但我认为没有标准数学坐标系。当指示轴方向的箭头丢失时,即使是非常常见的carthesian坐标系也是不完整的。

答案 2 :(得分:1)

总结:从讨论中我假设开罗只使用了一个坐标系:x轴向右,y轴向下。如果需要标准的数学坐标系(x轴向右,y轴向上),则必须对数据进行预处理。