使用R的C / C ++ API和Rcpp绘制多边形

时间:2017-07-11 11:47:32

标签: c++ r rcpp

我目前正在尝试使用C ++重写包中的R脚本以提高性能。该软件包可以从文件中读取点,颜色和其他一些数据的坐标,并对其进行一些计算。最后,这些数据用于生成许多多边形并将其写入pdf文件。

这个过程在R中太慢了,所以我决定让C ++与Rcpp一起做。我已完成计算部分(虽然我无法并行化循环键,但这是另一个主题)但我目前没有得到任何性能提升,因为我必须从C ++代码调用R的graphics :: polygon函数,这需要一个大量的时间。

我的问题从那里开始。我试图编写一种方法来绘制我的多边形而不需要调用R代码。因此,我调查了R源。图形包本身不允许我使用它的标题,但我至少可以看一下源代码。 R的源包含目录包含许多有用的标题,可以帮助我,例如Graphics.h或Rgraphics.h,但这些是内部标题而未安装。对我来说唯一的选择是解决原始的多边形方法并使用R_ext / GraphicsEngine.h 在那里,我找到了一个名为“GEPolygon”的方法,有5个参数。

void GEPolygon(int n, double *x, double *y, const pGEcontext gc, pGEDevDesc dd);

前三个论点的意思很明显。通过查看图形包的源代码,我找到了最后2个传递的内容,如下面的方法所示。

void polygonplot(NumericVector x, NumericVector y, String col, String 
border, double lwd, int lty){
  //found in graphics.c
  const void *vmax = vmaxget();

  pGEDevDesc device = GEcurrentDevice();
  int n = x.length();

  R_GE_gcontext gc;
  gc.lty = lty;
  gc.lwd = lwd;
  gc.col = R_GE_str2col(border.get_cstring());
  gc.fill = R_GE_str2col(col.get_cstring());
  //convert NumericVector to double*
  double xx[n], yy[n];

  for(int i = 0; i < n; i++){
    xx[i] = x[i];
    yy[i] = y[i];
    // probably converting coordinates, but how?
    // xx[i] = GEtoDeviceWidth(x[i], GE_NDC, device);
    // yy[i] = GEtoDeviceHeight(y[i], GE_NDC, device);
  }
  GEPolygon(n, xx, yy, &gc, device);
  vmaxset(vmax);
}

这就是我现在发现的全部内容。到目前为止似乎很好,至少对于编译器而言。构建包后,示例脚本执行包的功能。第260次调用在德语中产生错误(因为我的语言设置为德语):“unzulässigesZeilenende”,可以翻译为“不允许的行结尾”(在互联网上没有找到任何有用的内容)。执行停止,不打印任何其他内容。即使我附加gdb我也没有得到任何其他信息。它肯定发生在对“GEPolygon”的调用中,并且应该与传递的最后两个参数中的一个或两个相关。另一个问题应该是坐标,因为它们在图形包的多边形函数中转换(参见这里:https://github.com/wch/r-source/blob/trunk/src/library/graphics/src/plot.c#L1982) 我很高兴为我的问题或甚至完全不同的方法阅读解决方案。

我使用了https://github.com/wch/r-source/blob/trunk/src/library/graphics/src/graphics.c#L2833和来自此存储库的其他文件,我对未记录的源代码有很多问题。

如果有人可以帮我直接从C ++代码打印多边形,请执行此操作。

提前致谢,
expeehaa

0 个答案:

没有答案