2017-04-09 70 views
1

我正在绘制一个包含2000多个点的图形,以pdf文件形式显示。 PDF的分辨率是612 x 792.由于宽度是612,因此我只能绘制612点到pdf。我将1点映射到1个像素。我怎样才能将所有2000多个样本绘制成PDF格式。我正在使用这个lib http://www.vulcanware.com/cpp_pdf/index.html显示更多分数然后分辨率

+0

可能重复的[Pdf分辨率缩放绘图](http://stackoverflow.com/questions/43301673/pdf-resolution-scaling-for-plotting) – chtz

回答

1

选项1:使用x = (x * 612)/2000来缩放分数。这意味着如果2点彼此接近(包括“相似的y”),它们将相互覆盖。

选项2:将每个点视为正方形;并计算已经缩放的“左边缘x”和“右边缘x”的浮点值(left_x = ((x-width/2.0) * 612.0)/2000.0; right_x = ((x+width/2.0) * 612.0)/2000.0;),并且通过针对每个目的地计算“正方形重叠的目的像素的面积”来使用抗锯齿绘制正方形与正方形重叠的像素。在这种情况下,您需要执行“dest_pixel = max(dest_pixel + area,1);”在正方形重叠时钳位像素值。选项3:将整个东西旋转90度,使“x轴”沿页面垂直向下(如果需要,可以分成多个页面);如果这对y造成问题,那么使用上面的y选项之一。

请注意,“选项2”可同时在两个(垂直和水平)方向上完成。

left_x = point_x/MAX_SRC_X * MAX_DEST_X; 
    right_x = (point_x + 1)/MAX_SRC_X * MAX_DEST_X; 
    top_y = point_y/MAX_SRC_Y * MAX_DEST_Y; 
    bottom_y = (point_y + 1)/MAX_SRC_Y * MAX_DEST_Y; 

然后有一个“对于被影响的每一行”循环计算每行有多少影响,如:

for(int y = top_y; y < bottom_y; y++) { 
     row_top = fmax(y, top_y); 
     row_bottom = fmin(y+1, bottom_y); 
     row_weight = row_bottom - row_top; 
要做到这一点,通过确定广场的边缘,就像启动

然后有一个类似的“为每一列被实现”循环,如:

 for(int x = left_x; x < right_x; x++) { 
      column_left = fmax(x, left_x); 
      column_right = fmin(x+1, right_x); 
      column_weight = column_right - column_left; 

然后计算面积对于像素,设置像素,并完成循环:

  dest_pixel_area = row_weight * column_weight; 
      pixel[y][x].red = min(pixel[y][x].red + dest_pixel_area * red, MAX_RED); 
      pixel[y][x].green = min(pixel[y][x].green + dest_pixel_area * green, MAX_GREEN); 
      pixel[y][x].blue = min(pixel[y][x].blue + dest_pixel_area * blue, MAX_BLUE); 
     } 
    } 

注意:以上所有代码均未经过测试和简化。将环路分解为“第一行/列;仅用于中间区域的循环;然后是最后一行/列”可以更快地移除大部分fmin/fmax

如果你只需要做到这一点的一个方向,删除的方向,你不需要和使用1.0为相应row_weightcolumn_weight部分。

+0

@布伦丹 - 我试过第一个选项,它能够绘制所有的点,但它扭曲了那个情节。情节并不平坦。我不知道如何实现选项2. – amanda45

+0

@ amanda45:我添加了一些可能有用的东西.. :-) – Brendan