断断续续的写了几天,现在只剩下最后的Social Net没有写,暂且分享一下之前的几个部分吧。
第三部分我们需要补充几个函数,实现它们的功能:
主要围绕多边形展开,有很早就学过的多边形内角外角和相关的,还有一个凸包问题和个性绘图。
转角的那个还是比较简单的,只需要考虑东西 和南北,然后具体划分到东北、东南这种相对关系,然后注意反三角函数得到的值的符号以及需要使用Math.toDegree()方法转换为角度,此外要注意结果的范围。可以使用如result%=360;方式约束范围。
凸包问题(敲重点):简单地说就是给一堆离散的二维点,找到一组点组成多边形,使得这个多边形将其余的点包含在其内部或者在其边上。
知乎,百科等都介绍了几种常用的方法比如GraHam等,其中有一个“摆线法”令我印象深刻(因为看起来简单),但是事实上在具体操作时,个人觉得那些表述丢失了重要细节,它应当表述为:
1.选取图中最左下(右下)的一个点作为出发点,加入凸包集合S
2.从出发点开始顺时针(逆时针)旋转,计算出发点和不在集合S内的所有点的转角
(这意味着初始化的时候,需要选取一个和原始出发点不同,并且当前不在集合S内的点作为第二个点)
(以出发点建立笛卡尔二维坐标系,连接两点,该线段与纵轴的夹角定义为转角)
(这里的转角可以使用实验中之前补充好的函数,默认参数一为0)
3.选取转角最小的一个点作为预备点,当有多个预备点的时候,选取出发点与预备点之间线段距离最长的点加入S。(多个预备点即至少三点共线,因为每次循环都相对于出发点选择了”第二个点“,所以使得三点、两线段的距离比较成为可能)。
4.更新出发点为选取到的预备点
5.重复2,3,4直至选到的预备点为原始出发点。
这里还是给一个框架,具体实现不难。
①:所有参数点加入集合A
②:循环找到最左下或右下的点StartPoint,加入凸包集合S,保存相同副本FlagPoint。
③:do
1)随机选取一个既不是StartPoint也不在集合S内的点,作为nextpoint, 计算对应的转角mindg
2)循环寻找是否存在一个点,其转角dg<mindg,如果存在更新nextpoint以及mindg;如果转角相同,比较dis(StartPoint,nextpoint)和dis(StartPoint,A(i));选择较大的作为nextpoint,
3)将nextpoint加入S,更新StartPoint为nextPoint
while(StartPoint!=FlagPoint);
④:return S
写一下感想,并感谢帮助我查出最后一个bug的老铁子兼室友。
最近事情很多,学这学那的,某竞赛快来了,课程又给我安排的明明白白,只能忙中抽空写实验,也参考了很多学长关于凸包问题的方法,最终也用了这种,不过白嫖的事我是不会干的,也因此陷入debug的快乐境地,今天早上的时候Junit的错误只剩下一个数组越界了,一直不得其解,联系了场外援助(朋友),最终发现我没有考虑给定的点集是空集的情况,真的是当局者迷。特别感谢这位在学习上给我巨大帮助的朋友。
现在想想可能正确的算法部分早在昨天就写出来了,还是初次接触Junit,不会自己debug,导致写了删删了写,浪费时间,得不偿失。忙完这几天后还是好好学学正则表达式以及Junit吧,这里又想到第一部分,相信我,正则表达式才是最完美的解法,可能有人参考学长的,发现他们有的人的一些字符分割格式因为无法处理只好输出一个提示信息,这其实靠正则表达式就可以完美解决,Java中也有相应的库,学一下比较好。
此外,关于Social Net也有一点小小想法,因为最开始就看了这个,没仔细看实验手册,还以为就这一个问题,初步想法是:如果要画图就需要用到swing,awt,数据结构是图,
可以使用泛型实现,示例代码中的类感觉有很明显的一些属性方法,相互之间的关系,难点可能是距离的定义以及画图的时候怎么画好两个圆之间的线段。
软件构造Lab1-Part3总结
最新推荐文章于 2022-04-23 22:45:54 发布