c++ - 如何在 netpbm 图像中绘制平滑像素?
问题描述
我刚刚写了一个小的 netpbm 解析器,我玩得很开心,主要是绘制参数方程。他们第一次看起来不错,但我怎样才能扩展它并拥有看起来合法的东西?这张照片是我的方法如何重新创建了北极猴子标志
0.5[cos(19t) - cos(21t)]
(我试图在叠加它们之前先绘制两个余弦)
它显然看起来非常“脆”和锋利。我使用尽可能小的步长,而不需要永远完成。(0.0005,耗时 < 5 秒)
我唯一的想法是,当绘制一个白色像素时,我还应该用一些稍微浅一点的灰色来绘制它的近邻。然后用更浅的灰色绘制那些像素的邻居。几乎就像白色是“溶解”或“消散”。
我没有尝试实现这一点,因为它感觉是一种非常糟糕的方法,而且我什至不确定它会产生接近理想效果的任何东西,所以我想我会先问一下。
编辑:这是一个仅绘制一个小螺旋的示例代码
绘制循环:
for (int t = 0; t < 6 * M_PI; t += 0.0005)
{
double r = t;
new_x = 10 * r * cosf(0.1 * M_PI * t);
new_y = -10 * r * sinf(0.1 * M_PI * t);
img.SetPixel(new_x + img.img_width / 2, new_y + img.img_height / 2, 255);
}
//img is a PPM image with magic number P5 (binary grayscale)
设置像素:
void PPMimage::SetPixel(const uint16_t x, const uint16_t y, const uint16_t pixelVal)
{
assert(pixelVal >= 0 && pixelVal <= max_greys && "pixelVal larger than image's maximum max_grey\n%d");
assert(x >= 0 && x < img_width && "X value larger than image width\n");
assert(y >= 0 && y < img_height && "Y value larger than image height\n");
img_raster[y * img_width + x] = pixelVal;
}
这就是这段代码产生的
解决方案
散点图(由点而不是线组成)的一种非常基本的抗锯齿形式可以通过应用随机舍入之类的方法来实现:将画笔视为像素大小的正方形(但请注意此模型的严重限制),居中在绘图点的非整数坐标处,并计算其与共享最接近该点的角的四个像素的重叠。将该重叠部分视为灰度部分,并将每个像素设置为接近一条线的大量点的最大值,或对少量离散点进行alpha混合。
推荐阅读
- c - GCC 无法链接到 libc.a
- c - 就地修改数组并了解其内存分配
- r - 当元素彼此不同时,如何对列的每个元素应用“变异”?
- docker - 容器与 Docker 与 Kubernetes
- xcode - Xcode 11 从 Xcode 10 中删除了我的字体和颜色主题
- hive - 如何在 Hive 中除按列分组之外的列上应用 max 子句
- java - 如何使用具有给定尺寸和嵌套 for 循环的 atericks 绘制“x”形状?
- kubernetes - 如何处理 couchbase 集群中的 IP 地址更改?
- android - IONIC 4 上的命令失败,退出代码为 enoent
- jira - QSH 在 Atlassian 中声明 Zephyr API 不匹配