软件构造博客1

这一次记录一下实验Turtle Graphics (MIT)的心得

第一个部分是画一个正方形 因为最开始对整个实验是属于比较懵的一个状态,比较傻不知道能够直接调用turtle里的forward和turn,导入整个turtle的包也花了很长时间,就相当于迈出了实验的第一步吧,对Java语言和eclipse不太熟悉,有时间应该多多学习一下这个软件的使用。结果就是forward(步长),然后turn(90)就可以画正方形了。

第二个部分是计算正多边形的内角,然后反过来已知内角求边数,就是数学公式的调用,比较简单。

第三个部分是已知现在的角度,现在的坐标和目标的坐标,然后要求转过的夹角大小。需要特别注意,题目里限定要从y轴正半轴,顺时针开始转动,而用函数atan2(y2-y1,x2-x1)求得的角,是从x正半轴逆时针向上旋转的,这个求角问题困扰了我好久,最终还是要用90-atan2-现在的角,如果结果是负数,还要用负数+360取正数,唉数学问题真的是很需要耐心和智力。

第四个部分是求凸包,提示可以采用gift-wrapping的算法。

凸包:点集Q的凸包是一个最小的凸多边形P,满足Q中的每个点都在P的边界上或者在P的内部

首先应该定义一个point类,包括横纵坐标。如果只有三个点,那么这三个点直接就组成了凸包,然后比较横纵坐标,找到最左下的点,作为初始点,然后将原角度设为0,然后遍历凸包点集外的点,寻找和原角度转角最大的点,如果两个点都符合,那么取距离远的那个点,纳入凸包点集,以此类推。

下面是这部分的代码实现。

Set<Point> a = new HashSet<Point>();
double cb,nb,pb,nl;
Point cp,np = null,min = null;
if(!points.isEmpty())
{
if(points.size() <=3)
return points;
for(Point point : points)
{
if(min == null){
min = point;
continue;
}
if(min.x() > point.x())min = point;
else if(min.x() == point.x())
{
if(point.y() < min.y())
min = point;
}
}
a.add(min);cp = min;
pb = 0;
while(true)
{
nb = 360;
nl = Double.MAX_VALUE;
for(Point point : points)
{
if(point.equals(cp))
continue;
cb = calculateBearingToPoint(pb,(int)cp.x(),(int)cp.y(),(int)point.x(),(int)point.y());
if(nb == cb){
if(nl < (Math.pow(point.x()-cp.x(), 2)+Math.pow(point.y()-cp.y(), 2)))
{
nl = Math.pow(point.x()-cp.x(), 2)+Math.pow(point.y()-cp.y(), 2);
np = point;
}
}
else if(nb > cb) {
nl = Math.pow(point.x()-cp.x(), 2)+Math.pow(point.y()-cp.y(), 2);
nb = cb;
np = point;
}
}
if(min.equals(nb))break;
cp = np;
pb = nb+pb;
a.add(np);

了解完这个算法之后感觉很奇妙,真的是耳目一新的感觉,感觉个人还是需要没啥事得多看看代码,多写写代码,增加自己的水平吧。

posted @ 2022-05-10 19:57  fsscg  阅读(22)  评论(0编辑  收藏  举报