显示更多点,然后显示分辨率

Show more points then resolution

提问人:amanda45 提问时间:4/9/2017 更新时间:4/10/2017 访问量:72

问:

我正在绘制一个带有 2000+ 点的图表到 pdf 文件。pdf 的分辨率为 612 x 792。我只能在 pdf 上画 612 个点,因为宽度是 612。我将 1 点映射到 1 像素。如何将所有 2000+ 样本绘制到 pdf 中。我正在使用这个库 http://www.vulcanware.com/cpp_pdf/index.html

C++ C Visual Studio fopen IOstream

评论

0赞 chtz 4/9/2017
用于绘图的 Pdf 分辨率缩放可能重复

答:

1赞 Brendan 4/9/2017 #1

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

选项 2:将每个点视为一个正方形;并计算已缩放的“左边缘 x”和“右边缘 x”的浮点值 (),并通过计算与正方形重叠的每个目标像素的“目标像素重叠的面积”,使用抗锯齿绘制正方形。在这种情况下,您需要执行“dest_pixel = max(dest_pixel + area, 1);”,以在正方形重叠时钳制像素值。left_x = ( (x-width/2.0) * 612.0) / 2000.0; right_x = ( (x+width/2.0) * 612.0) / 2000.0;

选项 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.0row_weightcolumn_weight

评论

0赞 amanda45 4/10/2017
@Brendan- 我尝试了第一个选项,它能够绘制所有点,但它扭曲了该情节。剧情并不流畅。我不确定如何实现选项 2。