显示更多积分然后解决

时间:2017-04-09 05:05:23

标签: c++ c visual-studio fopen iostream

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

1 个答案:

答案 0 :(得分:1)

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

选项2:将每个点视为正方形;并计算已缩放(left_x = ( (x-width/2.0) * 612.0) / 2000.0; right_x = ( (x+width/2.0) * 612.0) / 2000.0;)的“左边x”和“右边x”的浮点值,并使用抗锯齿绘制正方形,通过计算“正方形重叠的目标像素区域” “对于与方块重叠的每个目标像素。在这种情况下,您需要执行“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 < / p>

如果您只需要朝一个方向执行此操作,请删除不需要的方向的部分,并使用1.0作为相应的row_weightcolumn_weight