C++小火箭的正弦曲线绘画之旅

2026-01-16_112527

 

话说在C++精灵库的世界里,有一个叫rocket(小火箭)的家伙。它可是个多才多艺的小画家。今天它刚在数学课上学了正弦函数,就急不可耐地想要完成一个任务 —— 画一幅正弦曲线,咱们来看看它是怎么操作的吧!

首先,小火箭先给自己布置了绘画场地,它把背景调成了酷酷的纯黑色:rocket.bgcolor("black"),还调整了自己的飞行(绘画)速度:speed(1),确保等会儿画画不会太快也不会太慢,稳稳当当才出精品。

接下来,小火箭要先画好坐标轴,这可是画画的基础哦。它先换上一支橙色的画笔,朝着正前方飞了3百步,画出了横轴的一半,然后又倒着往回飞了6百步,把横轴的另一半也画出来,最后再往前飞3百步,乖乖回到了坐标轴的原点。紧接着,它向左转了90度,换了一支蓝色的画笔,朝着上方飞了260步,画出了纵轴的上半部分,又倒着往回飞了520步画完纵轴下半部分,再飞回去260步回到原点,最后向右转90度,回到了最初的朝向。看看那代码,多么的简洁,倒是我用文字描述了这么久,可见汉语是代表不了编程语言的。

//这里是画坐标轴,前进倒退左转
rocket.color(33).fd(300).bk(600).fd(300).left(90);
rocket.color(230).fd(260).bk(520).fd(260).right(90);

画完坐标轴,小火箭觉得曲线得更醒目一点,就把画笔换成了黄色,还把笔的粗细调到了4号,这下准备工作就全部就绪啦。 (为什么color(50)能把画笔调整黄色呢?这是由于50表示颜色的色相!)

rocket.color(50).pensize(4); 

最关键的绘画环节来咯!小火箭要开始画正弦曲线本身了。它给自己定了个规矩,要从左边180度的位置,一点点画到右边180度的位置。每到一个位置(咱们叫它x),小火箭都会先偷偷算两笔:一笔是当前x位置对应的高度y(用正弦公式算出来,还放大了1百倍,这样曲线能看得更清楚),另一笔是下一个位置(x+1)对应的高度 next_y。

 //朝向下一个坐标点,然后到达(x,y)坐标 
rocket.heading(x+1,next_y).go(x,y); 

更有意思的是,小火箭画画之前还会 “瞄准”,(代码是:rocket.heading(x+1,next_y))。它会先调整自己的飞行朝向,对准下一个要去的坐标点,就像射箭前要先对准靶心一样,然后再稳稳当当地飞到当前的 (x,y) 坐标点上。而且它还特别细心,飞过去之后会检查一下自己的画笔有没有落在 “画布” 上,如果没落下,就赶紧把画笔放下来,保证每一笔都能清晰地留在画面上。就这么一步一步,从左到右,一点点计算、一点点瞄准、一点点飞行,小火箭慢慢勾勒出了正弦曲线那弯弯的、优美的轮廓,一条顺滑的正弦曲线就这样渐渐出现在黑色背景上了。

画完曲线,小火箭还想给作品添点色彩,让它更生动。它找到了两个合适的位置,一个在自己左边1佰个单位、上边 20个单位的地方,另一个在左边220个单位、下边20个单位的地方,然后在这两个地方都填上了清新的嫩绿色,让整个正弦曲线看起来更饱满、更有层次感。

//开始填充,在火箭左边100个单位,上边20的地方填充lime色(估计的)
   rocket.fill("lime",-100,20);    
//在火箭左边200个单位,下边20个单位填充lime色(估计值)
   rocket.fill("lime",-220,-20); 

最后,就是给作品题字啦。小火箭先把画笔收起来,飞到坐标轴上方3佰步的高处,换上了一支红彤彤的画笔,然后写下了“C++ 正弦曲线示例”几个大字,还特意把字调整成居中对齐、48号的常规字体,让大家都能清楚地看到。

rocket.pu().go(0,300).color("red");
std::string s = "C++正弦曲线示例";
rocket.write(s,"center",{"","48","normal"}); 
 

做完这一切,小火箭没有马上离开,它在原地停留了1秒钟,好像在欣赏自己的得意之作,然后才悄悄把自己藏了起来,结束了这次完美的绘画任务。

所有代码如下所示:

#include "sprites.h"  //包含C++精灵库 
#define z 3.1415926535798932/180.0
Sprite rocket;       //建立角色叫rocket 

int main(){        //主功能块     
   rocket.bgcolor("black").speed(0);
   //这里是画坐标轴,前进倒退左转
   rocket.color(33).fd(300).bk(600).fd(300).left(90);
   rocket.color(230).fd(260).bk(520).fd(260).right(90);
   rocket.color(50).pensize(4);   
   //画正弦曲线
   for(int x=-180;x<=180;x++){    //x实际代表的是角度
       float y = 100*sin(x*z);
       float next_y =100*sin((x+1)*z);
       //朝向下一个坐标点,然后到达(x,y)坐标
       rocket.heading(x+1,next_y).go(x,y); 
       if(!rocket.isdown())rocket.pendown();
   }  
   //开始填充,在火箭左边100个单位,上边20的地方填充lime色(估计的)
   rocket.fill("lime",-100,20); 
   //在火箭左边200个单位,下边20个单位填充lime色(估计值)
   rocket.fill("lime",-220,-20); 
   rocket.pu().go(0,300).color("red");
   std::string s = "C++正弦曲线示例";
   rocket.write(s,"center",{"","48","normal"});    
   rocket.wait(1).hide().done();  
   return 0;
}

 

posted on 2026-01-16 11:33  李兴球  阅读(1)  评论(0)    收藏  举报