软件构造实验一的P2中,课程给的程序可以操控画笔进行画图,并且在任务8中让每个人绘制自己的图形。
该项目让我想到了小学时学的pc logo——一种面向青少年的编程语言,通过程序控制一个小海龟(箭头)移动并进行绘图,于是我根据过往的经验尝试了不少图形。
本文给出几种个人认为较为美观的图形。
一、圆:
项目中的一个任务是画正多边形,而在边数大到一定程度时,画出来的就接近于一个圆,通常认为正三十六边形近似于圆。
二、正多角星:
正多角星分为两种,边数为奇数和偶数时画法不同,这是由于偶数正多角星实际上是由两个其边数一半的正多边形叠加而成。
奇数角:
public static void drawOddStar(Turtle turtle, int n, int len) {
for(int i = 0; i < n; i++) {
turtle.forward(len);
turtle.turn(180 - 180 / n);
}
}
偶数角:
public static void drawEvenStar(Turtle turtle, int n, int len) {
double turnAngle = 180 - calculateRegularPolygonAngle(n / 2);
for(int i = 0; i < n; i++) {
turtle.forward(len);
turtle.turn(turnAngle);
turtle.forward(len);
turtle.turn(360 - turnAngle / 2);
}
}
其中偶数正多角星在循环一圈之后可以构成一些美观的图案。
8*8:
10*10:
三、二叉树:
没错,这玩意还能用来画二叉树,在此之前先定义几个静态方法,因为源代码中只有forward和turn两个函数用于画画,即只能前进和右转,我们添加后退和左转:
public static void FD(Turtle turtle, int len) {
turtle.forward(len);
}
public static void BK(Turtle turtle, int len) {
turtle.turn(180);
turtle.forward(len);
turtle.turn(180);
}
public static void RT(Turtle turtle, int degree) {
turtle.turn(degree);
}
public static void LT(Turtle turtle, int degree) {
turtle.turn(360 - degree);
}
采用递归形式,先画左枝,然后回退,再画右枝:
public static void drawBinaryTree(Turtle turtle, int n, int len) {
if(n > 0) {
LT(turtle, 45);
FD(turtle, len);
RT(turtle, 45);
drawBinaryTree(turtle, n - 1, len / 2);
LT(turtle, 45);
BK(turtle, len);
RT(turtle, 90);
FD(turtle, len);
LT(turtle, 45);
drawBinaryTree(turtle, n - 1, len / 2);
RT(turtle, 45);
BK(turtle, len);
LT(turtle, 45);
}
}
事实上,通过递归还可以画出更多精妙的曲线和图形。
以上就是本篇文章的全部内容。