111,092
社区成员




namespace 佩奇
{
class Program
{
static void Main(string[] args)
{
//https://cloud.tencent.com/developer/news/233009
//https://www.cnblogs.com/yezibiancheng/p/9426658.html
//http://www.cnblogs.com/momoowo/archive/2018/06/17/9192488.html
for (double y = -1; y < 1; y += 0.05, putchar('\n'))
for (double x = -1; x < 1; x += 0.05)
putchar(outline(x, y));
var s = 1.0;
for (double y = -1; y < 0.6; y += 0.05 / s, putchar('\n'))
for (double x = -1; x < 0.6; x += 0.025 / s)
putchar(" .|/=\\|/-\\|@! "[(char)f(u(x, y, 0.3), v(x, y, 0.3))]);
}
static double f0(double x, double y)
{
return Math.Sqrt(x * x + y * y) - 0.8;
}
static char outline(double x, double y)
{
var delta = 0.001;
if(Math.Abs(f0(x,y))<0.05)
{
var dx = f0(x+delta,y)-f0(x-delta,y);
var dy=f0(x+y+delta,y)-f0(x,y-delta);
return "|/=\\|/=\\|"[(int)((Math.Atan2(dy,dx)/(2*Math.PI)+0.5)*8+0.5)];
}
else if(f0(x,y)<0) return '.';
else return ' ';
}
static void putchar(char c)
{
Console.Write(c);
}
static double c(double x, double y, double r) //基本图形
{
return Math.Sqrt(x * x + y * y) - r;
}
static double u(double x, double y, double t) //旋转 t°的 x
{
return x * Math.Cos(t) + y * Math.Sin(t);
}
static double v(double x, double y, double t) //旋转 t°的 y
{
return y * Math.Cos(t) - x * Math.Sin(t);
}
static double fa(double x, double y) //脸
{
return Math.Min(c(x, y, 0.5), c(x * 0.47 + 0.15, y + 0.25, 0.3));
}
static double no(double x, double y) //鼻子
{
return c(x * 1.2 + 0.97, y + 0.25, 0.2);
}
static double nh(double x, double y) //鼻孔
{
return Math.Min(c(x + 0.9, y + 0.25, 0.03), c(x + 0.75, y + 0.25, 0.03));
}
static double ea(double x, double y) //耳朵
{
return Math.Min(c(x * 1.7 + 0.3, y + 0.7, 0.15), c(u(x, y, 0.25) * 1.7, v(x, y, 0.25) + 0.65, 0.15));
}
static double ey(double x, double y) //眼睛
{
return Math.Min(c(x + 0.4, y + 0.35, 0.1), c(x + 0.15, y + 0.35, 0.1));
}
static double pu(double x, double y) //眼珠
{
return Math.Min(c(x + 0.38, y + 0.33, 0.03), c(x + 0.13, y + 0.33, 0.03));
}
static double fr(double x, double y) //腮红
{
return c(x * 1.1 - 0.3, y + 0.1, 0.15);
}
static double mo(double x, double y) //嘴巴
{
return Math.Max(c(x + 0.15, y - 0.05, 0.2), -c(x + 0.15, y, 0.25));
}
static double o(double x, double y, Func<double, double, double> f, double i) //判断是否为边界,并计算角度
{
var r=f(x,y);
return Math.Abs(r) < 0.02 ? Math.Atan2(f(x, y + 1e-3) - r, f(x - 1e-3, y) + 0.3) * 1.273 + 6.5 :( r < 0 ? i : 0);
}
static double s(double x, double y, Func<double, double, double> f, double i) //计算是否是内部
{
return f(x, y) < 0 ? i : 0;
}
static double f(double x, double y) //计算 SDF
{
if (o(x, y, no, 1) > 0)
return Math.Max(o(x, y, no, 1), s(x, y, nh, 12));
else
return Math.Max(o(x, y, fa, 1), Math.Max(o(x, y, ey, 11), Math.Max(o(x, y, ea, 1), Math.Max(o(x, y, no, 1), Math.Max(s(x, y, fr, 13), s(x, y, pu, 12))))));
}
}
}
putchar(".|/=\\|/=\\|@!"[(int)a]);
for (double y=-1; y < 0.6; y += 0.05/a)
{
Console.WriteLine();
}