选项 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_weight 或column_weight。