C/C++小猪佩奇

image-20250831104515127

写在前面

这是一段用纯C语言编写的代码,其目标是用字符艺术的方式绘制出小猪佩奇的形象。虽然没有图形界面,也没有绚丽的色彩,但通过数学公式和字符的巧妙排列,我们依然可以感受到一种独特的艺术魅力。代码中运用了大量数学函数与几何变换,将一个卡通形象用字符的形式“雕刻”出来,这不仅是一次编程挑战,也是一次艺术与逻辑的融合。

系列文章

技术需求

  1. 数学建模与几何表达

    • 代码通过定义多个数学函数来描述佩奇的各个身体部位,如鼻子、眼睛、耳朵、嘴巴等。每个函数代表一个图形元素,通过几何变换(旋转、缩放)与组合(取最小值、最大值)来构造整体形状。
    • 使用了欧几里得距离函数 c(x, y, r) 来定义圆形,通过调整参数实现不同部位的大小与位置。
  2. 坐标变换与旋转操作

    • 为了使佩奇在画面中呈现合适的角度,使用 uv 函数对坐标进行旋转,模拟二维平面上的旋转变换。
    • 所有绘制操作均在旋转后的坐标系中进行,增强了图形的自然性和对称性。
  3. 字符映射与可视化输出

    • 通过 f 函数返回一个整数值,该值对应字符表中的索引,从而实现图形到字符的映射。
    • 使用 putchar 输出字符,通过控制台打印出佩奇的图像,利用字符密度差异模拟图形轮廓。
  4. 条件判断与区域着色

    • 使用 os 函数分别判断某个点是否在特定图形内部或边界上,通过返回值控制字符的选取,实现图形的分区域着色。
    • 不同部位对应不同的字符集,例如眼睛、鼻子、嘴巴等使用不同字符,增强视觉识别度。
  5. 参数化设计与可扩展性

    • 通过宏定义 #define T double,便于后续修改数据类型,提升代码灵活性。
    • 函数结构清晰,便于添加新的图形元素或调整现有形状,为后续扩展提供更多可能。
  6. 控制台绘图与性能优化

    • 整个绘图过程在控制台中完成,不依赖任何图形库,适合在命令行环境中运行。
    • 通过调整步长参数 s 控制绘制精度,平衡图像质量与性能消耗。

主要代码

创作不易,订阅后可查看完整代码

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define T double
// 小猪佩奇
T c(T x, T y, T r) {
    return sqrt(x * x + y * y) - r;
}
T u(T x, T y, T t) {
    return x * cos(t) + y * sin(t);
}
T v(T x, T y, T t) {
    return y * cos(t) - x * sin(t);
}
T fa(T x, T y) {
    return fmin(c(x, y, 0.5), c(x * 0.47 + 0.15, y + 0.25, 0.3));
}
T no(T x, T y) {
    return c(x * 1.2 + 0.97, y + 0.25, 0.2);
}
T nh(T x, T y) {
    return fmin(c(x + 0.9, y + 0.25, 0.03), c(x + 0.75, y + 0.25, 0.03));
}

……

创作流程

在创作这段代码时,我的目标是用最朴素的方式,绘制出一个广为人知的卡通形象——小猪佩奇。我没有使用任何图形库,也没有复杂的图像处理技术,而是选择了一种更加原始但充满挑战的方式:用字符来“画”出佩奇。

一开始,我思考的是如何用数学语言来描述佩奇的外形。佩奇的头部近似圆形,耳朵是两个小椭圆,眼睛、鼻子、嘴巴则是更小的圆形或曲线。我决定用距离函数来定义这些基本形状。比如,一个圆可以用点到圆心的距离减去半径来表示。当这个值为0时,点在圆上;为负时,在圆内;为正时,在圆外。这种方法让我可以用数学公式来“雕刻”佩奇的每一个部位。

接着,我开始设计各个部位的函数。脸是一个大圆,鼻子是两个小圆的组合,眼睛则是两个并排的小圆。为了使佩奇看起来更生动,我还添加了眉毛、嘴巴和脸颊的红晕。这些元素通过函数的组合来实现,比如用 fmin 取两个圆形的交集,用 fmax 取并集,从而构建出复杂的形状。

为了让佩奇在画面中有一个合适的角度,我对坐标进行了旋转处理。通过三角函数,我将整个图像顺时针旋转了一定角度,使佩奇看起来像是在正视我们。这种旋转不仅增强了视觉效果,也让图像更加自然。

在绘制过程中,我需要将数学函数的结果映射到字符上。我定义了一个字符表,其中包含了不同密度的字符,比如空格、点、斜杠、竖线等。通过判断某个点是否在佩奇的某个部位内部,我可以选取对应的字符进行输出。比如,鼻子部分用“@”字符,眼睛用“.”,嘴巴用“=”等。这种映射方式虽然简单,但却能很好地表现出图像的轮廓和细节。

为了让图像更加清晰,我还加入了边界检测。当某个点非常接近图形的边缘时,我会选择不同的字符来表示边界,从而增强图像的立体感。这种细节处理让佩奇的形象更加生动,也让我对代码的控制更加精准。

最后,我将所有部分整合到主函数中,通过双重循环遍历整个画布,逐点计算并输出字符。为了提高绘制精度,我还添加了一个缩放参数,可以通过命令行传入不同的值来调整图像的大小。这种设计不仅提升了代码的灵活性,也让我在不同环境下都能获得满意的效果。

整个创作过程充满了挑战与乐趣。虽然没有绚丽的图形界面,但通过数学与字符的结合,我成功地将一个可爱的卡通形象呈现在控制台中。这不仅是一次编程实践,更是一次艺术与逻辑的完美融合。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Want595

感谢小伙伴的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值