软件构造Lab1-turtle问题
Turtle问题
以下是对turtle的简介:
Logo is a programming language created at MIT that originally was used to move a robot around in space. Turtle graphics, added to the Logo language, allows programmers to issue a series of commands to an on-screen “turtle” that moves, drawing a line as it goes. Turtle graphics have also been added to many different programming languages, including Python, where it is part of the standard library.
基本操作
turtle中最基本的操作如下:
- **forward(units) **
以单位像素为单位在当前方向上移动乌龟,其中单位为整数。按照原来的Logo惯例,龟开始面朝上。 - **turn(degrees) **
通过旋转角度的龟度向右(顺时针方向),其中,度是双精度浮点数。
多边形绘制
用以上基本操作绘制多边形的方法如下:
画一个多边形,只需要算出对应的旋转角度。
1.初始方向竖直向上,先向前sidelength长度,再根据多边形的边数和calculateRegularPolygonAngle()计算要旋转的角度,旋转应转的角度。
2.循环n次
代码如下:
public static void drawRegularPolygon(Turtle turtle, int sides, int sideLength) {
if (sides <= 2 || sideLength <= 0) {
return;
}
for (int i = 1; i <= sides; i++) {
turtle.forward(sideLength);
turtle.turn(180 - calculateRegularPolygonAngle(sides));
}
}
其中 calculateRegularPolygonAngle函数为计算相应旋转角度。
Calculating bearings
计算一个在某一点面朝某一方向的乌龟到达目标点需要先旋转多少角度
通过三角函数等进行相应计算即可
代码如下
public static double calculateBearingToPoint(double currentBearing, int currentX, int currentY, int targetX,
int targetY) {
// throw new RuntimeException("implement me!");
if (currentX == targetX && currentY == targetY)
return 0.0;
double degreess = Math.atan2(targetY - currentY, targetX - currentX) / Math.PI * 180.00;
if (degreess < 0)
degreess += 360.00;
currentBearing = 90.00 - currentBearing;
if (currentBearing < 0)
currentBearing += 360.00;
double ans = currentBearing - degreess;
if (ans < 0)
ans += 360.00;
return ans;
}
在此基础上进行多点的扩展,返回多个角度的List,主要步骤如下:
- 调用calculateBearingToPoint()求第一个顶点到第二个顶点所需转的角度
- 循环处理后面的顶点,将结果加入List中
- 返回List
凸包问题
采用分治法解决凸包问题
1.选择横坐标最大和最小的点
2.选择在过两点的直线的上(下)方并且距离直线距离最大的点。如果所有的点都在同一条直线上,直接return
3.连接刚刚选择的点与直线的两个端点,产生新的两条直线,划分为两个子问题,分别对其执行步骤2
个人艺术
利用循环变量,变换海龟画笔的颜色,并利用恰当的角度旋转,使其产生较为有趣的图形。
例图如下: