我的程序绘制了在窗口上移动的圆圈.我想我必须缺少一些基本的gtk/cairo概念,因为它似乎对我正在做的事情运行得太慢/断断续续.有任何想法吗?谢谢你的帮助!
#!/usr/bin/python
import gtk
import gtk.gdk as gdk
import math
import random
import gobject
# The number of circles and the window size.
num = 128
size = 512
# Initialize circle coordinates and velocities.
x = []
y = []
xv = []
yv = []
for i in range(num):
x.append(random.randint(0, size))
y.append(random.randint(0, size))
xv.append(random.randint(-4, 4))
yv.append(random.randint(-4, 4))
# Draw the circles and update their positions.
def expose(*args):
cr = darea.window.cairo_create()
cr.set_line_width(4)
for i in range(num):
cr.set_source_rgb(1, 0, 0) …Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的代码:
cairo_surface_t * surface = cairo_svg_surface_create("0.svg", 512, 512);
cairo_t * context = cairo_create(surface);
int * data = new int[512*512];
// fill the data...
cairo_surface_t * image_surface =
cairo_image_surface_for_data(data, 512, 512, 512*4);
cairo_set_source_surface(context, image_surface, 0, 0);
cairo_paint(context);
// do some other drawing ...
cairo_surface_flush(surface);
cairo_surface_finish(surface);
cairo_surface_destroy(surface);
cairo_destroy(context);
Run Code Online (Sandbox Code Playgroud)
但是,svg总是显得已损坏.图像未正确写入,并且后面的所有绘图命令都不起作用.将曲面类型更改为PS,即:
cairo_surface_t * surface = cairo_ps_surface_create("0.ps", 512, 512);
Run Code Online (Sandbox Code Playgroud)
生成一个完全正确的PS文档.任何帮助修复SVG将不胜感激.
编辑:忘了提供版本信息.由cairo_version_string()给出的开罗1.10.2.g ++ 4.52在Ubuntu 11.04上运行
编辑(2):好的,我已经用cairo追溯到PNG问题并发现cairo_surface_write_to_png也没有按预期运行.此功能和尝试在SVG中嵌入图像都会导致"内存不足错误",我仍然不知道原因.
我的意思是,开罗是否使用opengl acelerated原语绘制线条,形状和所有内容?如果没有,一个图书馆这样做?
......并不是说我对开罗有什么 - 我其实很喜欢它.安装Python绑定非常困难,特别是在Mac上(参见有关在OS X上安装pycairo的所有SO问题).还有更好的选择吗?
编辑:
对于更多的上下文,我正在创建一个我希望易于部署的Web服务,理想情况下使用标准安装通道; 无法在许多部署平台上简单地使用pip或easy_install引入复杂性到部署过程中.此外,我希望任何人都可以轻松地设置虚拟环境并在本地计算机上对应用程序进行开发.同样,易于安装是重要的一点.
我正在进行2d画布的旋转,它在桌面上工作得非常好,但在移动领域有一个小问题.这是一个放大的屏幕截图:

拇指图像在500ms的过程中旋转约0.2rad.我认为所有相关代码都在下面内联.正如您所看到的,图像的每个顶角都留有某种"痕迹".
var duration = 500;
var start = 0;
var stop = 0.287554326;
var step = (stop - start) / 10;
var steps = (stop - start) / step;
var current = 0;
var delay = duration / steps;
var first = true;
if (navigator.userAgent.match(/iP(hone|[ao]d)|android/i)) step *= 1.5;
var rotate_int = setInterval(function() {
if (current >= stop) {
clearInterval(rotate_int);
callback && callback();
return;
}
ctx.clearRect(0, 0, cvs.width, cvs.height);
ctx.translate(cvs.width / 2, cvs.height / 2);
ctx.rotate(step);
current += step;
ctx.translate(cvs.width …Run Code Online (Sandbox Code Playgroud) 我试图用透明背景和png格式保存ar情节.我在stackoverflow中遵循了几个推荐的方法,但每次我仍然得到白色背景.我的考试日期如下:
structure(list(wd = c(7.5, 22.5, 37.5, 52.5, 67.5, 82.5, 97.5,
112.5, 127.5, 142.5, 157.5, 172.5, 187.5, 202.5, 217.5, 232.5,
247.5, 262.5, 277.5, 292.5, 307.5, 322.5, 337.5, 352.5), MP1 = c(17.6,
21, 20.5, 26.5, 32.7, 38.3, 40.7, 41.8, 41.6, 44.4, 52.4, 62.5,
70.7, 74.4, 71.1, 66.9, 66.9, 69.4, 69.4, 67.4, 63.4, 55.9, 43.9,
33.9)), .Names = c("wd", "MP1"), class = "data.frame", row.names = c(NA,
-24L))
Run Code Online (Sandbox Code Playgroud)
我尝试了两种方法但都无法删除背景.
方法1:
library(ggplot2)
library(cairo)
ggplot(dat, aes(wd, MP1)) +
coord_polar( start = 0, direction = 1) + …Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有单击并拖动功能的Haskell程序,因此每次鼠标移动事件都会向窗口绘制更新.目前我正在使用
renderWithDrawable myCanvas update
Run Code Online (Sandbox Code Playgroud)
然而,这很多都是闪烁的.我的理解是我需要创建一个单独的drawable(一个"表面"?),渲染到它,然后在一次操作中将它blit到屏幕窗口.但是我对这种方法的正确方法感到困惑.
我发现drawWindowBeginPaintRegion,它谈到消除闪烁.但是根据Haddock文档,它在Gtk3中删除了.所以我不确定我是否应该使用它,因为它似乎已被弃用.
我也在renderWithSimilarSurface开罗找到了,它似乎做了类似的事情.
我也不确定这些函数是如何关联的renderWithDrawable:我是否必须在函数内部使用它们,或者什么?
这样做的正确方法是什么?
编辑
这在开罗似乎是一个众所周知的事情.我正在试图弄清楚如何在Haskell中处理这个问题.
使用Cairo保存R图形有很多优点(例如,请参见此处)。例如,保存PDF时,cairo_pdf设备会正确嵌入自定义字体。
通过cairo_pdf基于ggplot的图形,使用图形设备非常容易ggsave():
library(ggplot2)
ugly_plot <- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
labs(title = "Some data about cars") +
theme_gray(base_family = "Papyrus")
ugly_plot
ggsave(ugly_plot, filename = "ugly_plot.pdf",
width = 4, height = 2.5, device = cairo_pdf)
Run Code Online (Sandbox Code Playgroud)
将cairo_pdfR Markdown中的设备与knitr一起使用也很容易-添加dev: cairo_pdf到YAML前端:
---
title: "Cairo stuff"
output:
pdf_document:
dev: cairo_pdf
---
```{r make-ugly-plot, fig.width=4, fig.height=2.5}
library(ggplot2)
ugly_plot <- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() + …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 macOS 上安装 Cairo/Xlib,但无法正常工作
cmake -G "Xcode" --config 调试 "-DCMAKE_BUILD_TYPE=Debug" ../.
CMake Error:
Xcode 1.5 not supported.
CMake Error: Could not create named generator Xcode
Generators
* Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Ninja Multi-Config = Generates build-<Config>.ninja files.
Xcode = Generate Xcode project files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles …Run Code Online (Sandbox Code Playgroud) 对于我的生活,我无法弄清楚如何在Windows上安装cairo!
我需要它用于Haskell图表,但是当我按照设置说明运行时:
cabal install gtk
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Linking dist/setup-wrapper\setup.exe ...
Configuring glib-0.12.2...
setup.exe: The program pkg-config version >=0.9.0 is required but it could not
be found.
cabal.exe: Error: some packages failed to install:
cairo-0.12.2 failed during the configure step. The exception was:
ExitFailure 1
gio-0.12.2 depends on glib-0.12.2 which failed to install.
glib-0.12.2 failed during the configure step. The exception was:
ExitFailure 1
gtk-0.12.2 depends on glib-0.12.2 which failed to install.
pango-0.12.2 depends on glib-0.12.2 which failed to install. …Run Code Online (Sandbox Code Playgroud)