新浪博客

2026年02月01日

2026-02-01 14:49阅读:
LOGO编程题:3D斑马线_源程序
2026年02月01日

上面的《3D斑马线》是竞赛试题要求参赛者画的画面。


题目:3D斑马线(bmx)** 题源:2018厦门复赛
题目类型:静态作图。属于LOGO语言信息学编程竞赛中的“不需要动画”、“不需要调用键盘、鼠标功能”的较为简单的类型。
题目难度系数:**两颗星。初级难度


交通规则
规定,驾驶员驾车在遇到斑马线前要礼让行人并减速慢行。不少城市交警部门为了减少交通事故,设计了3D斑马线,即在地上画的是立体斑马线,使驾驶员误以为前方有路障而自然而然的减速慢行。请用LOGO语言,让海龟模拟画出3D斑马线。
说明与要求:
1.立体斑马线的立方体尺寸为 20X50X200,立方体之间的间距为130,阴影部分的尺寸同立方体的一个底面,距离立方体底部为15。其他参数参考图形酌情决定。
2.整个图形只需在屏幕居中完整显示。
3. 执行过程bmx,则输出如(图一)所示图形。


详解:
1. 这个题目中有两个隐藏着的数据十分重要。不理解这两个数据程序根本就编写不出来。这里所有的横道都是30度倾斜角的,对应于下面的30度角的直角三角形。有些同学会认为这些关乎三角函数的知识不是“超标”、“超纲”了吗?其实编写这样的程序也早就超纲超标了。你没有这些基础知识怎么和其他竞赛高手争?再说这也不难呀。
2026年02月01日


对应于30度角的直角三角形。如果斜边长为1,那么较短的直角边长为0.5、较长直角边长为0.866。这个数据是(SQRT 3)/2≈0.866。
2. 图形居中的算法:
整个图形的宽度是138*6,半根横道长200/2=100。占宽100*:K。这整个尺寸的宽度是: MAKE 'X (130 * 6 + 50 * :K) / 2 。
整个图形的“高度”是 “横道”200的高度100加上方块厚度20、阴影距离15的总和的一半: MAKE 'Y (200/2+15+20)/2 。
通过SETXY会非常准确地使图形居中。
所不同的是:PCLogo在使用SETXY时需要SE命令将数据组成“表”。
3. 画图的顺序步骤
2026年02月01日

应先画底下的阴影色块。先画A-B-C-D-E-F-A,再填色。
再画G-H-I-C-G正面长方形。
然后画H-J-K-I-H平行四边形。
再画I-K-L-C-I平行四边形。最后抬笔移位到“下一个起点”。
连画6组任务就完成了。


整个图形是高度完美、高度“居中”的。画出图形后输入命令ST HOME可以看到海龟确实在整个图形的正中央。


编程的每个细节都能说清理由,才算是完美。

编程程序:
;*MSWLogo-FMSLogo编程适用
TO BMX ;3D斑马线
CS
MAKE 'K 0.866 ;斑马线倾角30度:X方向长度是斜边长的0.866倍
MAKE 'X (130*6+100*:K)/2 ;为居中图形左下角应左移的步数
MAKE 'Y (200/2+15+20)/2 ;为图形居中左下角应下移的步数
PU SETXY :X*-1 :Y*-1 PD ;左移海龟到左下角 使图形居中
REPEAT 6[LITI] ;画6根立体斑马线
END
TO LITI ;画单根立体线
PD
RT 60 FD 30 RT 30 FD 50-30*:K LT 30 FD 200-30 ;画A-B-C-D
RT 30 FD 30*:K RT 150 FD 200 RT 30 FD 50 ;画D-E-F-A
RT 90 RT 75 PU FD 5 PD FILL PU BK 5 LT 75 ;对黑色部分填充
FD 15 PD ;移动到G
REPEAT 2[FD 20 RT 90 FD 50 RT 90] ;画G-H-I-C-G
FD 20 RT 60 ;移动到H
REPEAT 2[FD 200 RT 30 FD 50 RT 150] ;画H-J-K-I-H
RT 30 FD 50 LT 30 ;移动到I
REPEAT 2[FD 200 RT 120 FD 20 RT 60] ;画I-K-L-C-I
PU LT 60 BK 35 LT 90 BK 130-50 RT 90 ;移动到I-F~下一个起点
END
-------------
; *PCLogo编程适用
TO BMXP ;3D斑马线
CS
MAKE 'K 0.866 ;斑马线倾角30度:X方向长度是斜边长的0.866倍
MAKE 'X (130*6+100*:K)/2 ;为居中图形左下角应左移的步数
MAKE 'Y (200/2+15+20)/2 ;为图形居中左下角应下移的步数
PU SETXY :X*-1 :Y*-1 PD ;左移海龟到左下角 使图形居中
REPEAT 6[LITI] ;画6根立体斑马线
END
TO LITI ;画单根立体线
PD
RT 60 FD 30 RT 30 FD 50-30*:K LT 30 FD 200-30 ;画A-B-C-D
RT 30 FD 30*:K RT 150 FD 200 RT 30 FD 50 ;画D-E-F-A
RT 90 RT 75 PU FD 5 PD FILL PU BK 5 LT 75 ;对黑色部分填充
FD 15 PD ;移动到G
REPEAT 2[FD 20 RT 90 FD 50 RT 90] ;画G-H-I-C-G
FD 20 RT 60 ;移动到H
REPEAT 2[FD 200 RT 30 FD 50 RT 150] ;画H-J-K-I-H
RT 30 FD 50 LT 30 ;移动到I
REPEAT 2[FD 200 RT 120 FD 20 RT 60] ;画I-K-L-C-I
PU LT 60 BK 35 LT 90 BK 130-50 RT 90 ;移动到I-F~下一个起点
END


2026年02月01日
2026年02月01日
2026年02月01日
2026年02月01日

我的更多文章

下载客户端阅读体验更佳

APP专享