效果
思路
编写一个程序并非一蹴而就之事,它要求程序员不断地积累经验,持续学习新知,深入思考,并勤于实践。无论程序的复杂度如何,都是程序员通过无数次的敲击键盘,一点一滴构建起来的。这样的过程,无疑需要时间的积累和沉淀。唯有不断学习,才能深刻体会到学习本身的重要性。
以上程序就是借鉴了我前面发布的两篇文章组合而来,日晷 和 太极图。有时候创新就是1+1这样。就好像每个汉字我们都认识,但是作家可以将这些汉字组合成作品。写程序也是这样,我们平时积累掌握一些小的函数,然后用自己的方式把他们组合起来,就形成新的创新。
写一点小感想
在接触电脑的很长一段时间里,可能有很多人和我一样,只听说过计算机病毒还有名的木马病毒,当时第一次听到木马病毒的时候,我一直以为是一个啥样的木马。而对于病毒就感觉和人类感染的病毒一样,电脑也会感染病毒,对于病毒的理解感觉很模糊。
随着对于电脑知识和编程能力的提升,渐渐了解了一下计算机知识吧。也明白了什么是病毒,什么是木马病毒。
关于木马病毒我觉得这个故事可以分享给大家
木马一词源于古希腊神话中的“特洛伊木马”(Trojan Horse)。相传,在古希腊攻打特洛伊城的战争中,由于久攻不下,希腊人使用了一个巧妙的计策。他们制造了一匹巨大的木马,并在其空肚子里藏了很多装备精良的勇士。然后,希腊人佯装又一次攻打失败,逃跑时把那匹大木马遗弃在特洛伊城下。守城的士兵误以为这是希腊人留下的战利品,便将其带入城内。到了半夜,木马肚子里的勇士们悄悄地溜出来,与城外的希腊军队里应外合,一举攻下了特洛伊城。
编程这个东西有时候学习地越多感觉就越恐惧。
现在的笔记本电脑都有摄像头,我们可以使用程序来调用自己的摄像头,进行拍照,使用代码可以获取到摄像头权限拍照,这一点不难吧。
图像处理为字符串这一点也不难吧。
我们想发送邮件,那使用程序发送邮件这一点也不难吧。
将字符串反算为图像这一点也不难吧。
如果以上每一步都不难,我们是否就可以完成这样一个操作,就是使用电脑拍照发送到邮箱了。
为什么说学习的越多越感觉恐惧,就是如果有人写了这样一个程序放到你的电脑上,并且后台运行,那么它就可以随时监控你的一举一动。
当然学习目的不是去做坏事,而是长见识,明事理。当你明白了什么是病毒,什么是木马,那么在平时生活中就应该注意防范。来历不明的U盘不要随意插到电脑上,来历不明的软件不要下载,使用笔记本电脑的小伙伴可以将摄像头用贴纸封住。
源码
///////////////////////////////////////////////////
// 程序名称:旋转太极罗盘图
// 编译环境:Mictosoft Visual Studio 2022, EasyX_20200315(beta)
// 公 众 号:C语言研究
// 作 者:luoyh <2864292458@qq.com>
// 最后修改:2024-10-23
//
void DrawCircle(TCHAR str, int variable, int fors, int R, int MYX, int MYY, double QSHD, int size);
void DrawKD(int variable, int fors, int R, int Long, double QSHD);
void TJ(int centerX, int centerY, int size, double radians);
void DrawBK();
int main()
{
// 初始化绘图窗口
initgraph(W, H);
setbkcolor(RGB(247, 242, 239));
cleardevice();
BeginBatchDraw();
while (true)
{
double radians = 0.0; // 弧度
for (int i = 0; i < 628; i++)
{
radians += 0.1;
TJ(W / 2, H / 2, 100, radians); // 中间大的
DrawBK();
Sleep(1);
FlushBatchDraw();
cleardevice();
}
}
EndBatchDraw();
// 关闭绘图窗口
_getch();
closegraph();
return 0;
}
void DrawCircle(TCHAR str, int variable, int fors, int R, int MYX, int MYY, double QSHD, int size)
{
double a, x0, y0, w, h, x1, y1;
int x, y;
settextstyle(size, 0, L"楷体", variable * 3600 / fors - 900, variable * 3600 / fors - 900, 0, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH);
a = variable * PI * 2 / fors - QSHD;
w = textwidth(str); // 计算字符串宽 w、高 h
h = textheight(str);
x1 = R * cos(a); // 计算输出字符串的左上角位置
y1 = R * sin(a);
x0 = x1 * cos(-a) - y1 * sin(-a); // 将字符串绕原点顺时针旋转 a 弧度
y0 = y1 * cos(-a) + x1 * sin(-a);
x0 -= w / 2; // 将字符串向左上偏移 w/2、h/2
y0 += h / 2; // 绘图坐标向下为正
x = (int)(x0 * cos(a) - y0 * sin(a)); // 将字符串绕原点逆时针旋转 a 弧度
y = (int)(y0 * cos(a) + x0 * sin(a));
outtextxy(int(MYX + x + 0.5), int(MYY - y + 0.5), str); // 绘图坐标向下为正
}
void DrawKD(int variable, int fors, int R, int Long, double QSHD)
{
//setlinecolor(RED);
setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 1);
double a, x0, y0, x1, y1;
double star_x, star_y;
double end_x, end_y;
a = variable * PI * 2 / fors - QSHD;
x1 = R * cos(a);
y1 = R * sin(a);
x0 = x1 * cos(-a) - y1 * sin(-a);
y0 = y1 * cos(-a) + x1 * sin(-a);
star_x = (x0 * cos(a) - y0 * sin(a));
star_y = (y0 * cos(a) + x0 * sin(a));
x1 = (R - Long) * cos(a);
y1 = (R - Long) * sin(a);
x0 = x1 * cos(-a) - y1 * sin(-a);
y0 = y1 * cos(-a) + x1 * sin(-a);
end_x = (x0 * cos(a) - y0 * sin(a));
end_y = (y0 * cos(a) + x0 * sin(a));
line((int)(W / 2 + star_x), (int)(W / 2 + star_y), (int)(W / 2 + end_x), (int)(W / 2 + end_y));
}
void TJ(int centerX, int centerY, int size, double radians)
{
setfillcolor(BLACK);
solidpie(centerX - size, centerY - size, centerX + size, centerY + size, radians, radians + PI);
setfillcolor(WHITE);
solidpie(centerX - size, centerY - size, centerX + size, centerY + size, radians + PI, radians);
// 使用弧度计算坐标
int x1 = centerX + size / 2.0 * cos(-radians);
int y1 = centerY + size / 2.0 * sin(-radians);
int x2 = centerX + size / 2.0 * cos(-(radians + PI));
int y2 = centerY + size / 2.0 * sin(-(radians + PI));
setfillcolor(WHITE);
solidcircle(x1, y1, size / 2);
setfillcolor(BLACK);
solidcircle(x2, y2, size / 2);
// 绘制鱼眼
setfillcolor(BLACK);
solidcircle(x1, y1, size / 8);
setfillcolor(WHITE);
solidcircle(x2, y2, size / 8);
}
void DrawBK()
{
settextcolor(BLACK);
setlinecolor(BLACK);
// 共三圈字
TCHAR str[25];
for (int i = 0; i < 12; i++)
{
str[0] = L"巽丙丁坤庚辛乾癸壬艮甲乙"[11 - i];
DrawCircle(str[0], i, 12, 150, W / 2, H / 2, PI * 2 / (12 * 2.0), 30);
DrawKD(i, 12, 150, 50, 0);
}
TCHAR str1[25];
for (int i = 0; i < 12; i++)
{
str1[0] = L"辰巳午未申酉戌亥子丑寅卯"[11 - i];
DrawCircle(str1[0], i, 12, 200, W / 2, H / 2, 0, 30);
DrawKD(i, 12, 200, 50, PI * 2 / (12 * 2.0));
}
for (int i = 0; i < 24; i++)
{
str1[0] = L"正初"[i % 2];
DrawCircle(str1[0], i, 24, 250, W / 2, H / 2, PI * 2 / (24 * 2.0), 25);
DrawKD(i, 24, 250, 50, 0);
}
// 绘制五个圆
for (int i = 0; i < 96; i++)
{
DrawKD(i, 96, 270, 20, 0);
}
circle(W / 2, H / 2, 150);
circle(W / 2, H / 2, 200);
circle(W / 2, H / 2, 250);
circle(W / 2, H / 2, 270);
circle(W / 2, H / 2, 100);
}
动态效果