c++ - 显示更多点然后分辨率

标签 c++ c visual-studio fopen iostream

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

最佳答案

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

方案二:把每个点都看成一个正方形;并计算已缩放的“左边缘 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 会更快.

如果只需要在一个方向做,删除不需要的方向部分,对应的row_weight使用1.0 column_weight.

关于c++ - 显示更多点然后分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43303250/

相关文章:

c - 如何将数据插入到C中的csv文件的同一行中?

c - 错误[e46] : Undefined external and Error[Pe020]: identifier "CurrentDataMode" is undefined

c# - 命名空间 'Practices' 中不存在类型或命名空间名称 'Microsoft'

c++ - 使用 MingW 编译的程序如何使用 Windows 便携设备 (WPD) API?

c++ - 字符串输入验证问题 (C++)

c - c中的*是什么意思

c# - vs 2017 中的 IIS Express 502 错误

c# - Xamarin for VS 2015 - 灾难性失败

c++ - WIN32_FIND_DATA - 获取绝对路径

c++ - 同一 C++ Linux 应用程序中的 Protocol Buffers 2 和 3