CS 61B Project1
先上两张结果测试图,这次的project就如作业一开始所说,真的非常time-consuming,要早点做。。。
趴一:
1. 需要特别注意x,y和row,column和i,j和width,height的对应关系,坐标(x,y)中x与width相关代表列,y与height相关代表行。
2. blur需要向外扩展一圈,value=0;edge需要镜像向外扩展一圈,值取原外圈的值。注意扩展之后width和height各需要加上2,而不是加1。
之所以要向外扩展是因为这样可以把一些情况统一起来(四个角,边缘,其他)。减少代码量。
3.blur用到递归
return SecImage.boxBlur(--numIterations); }else{ return this;}
结尾部分大致是这个样子,最开始第二个return我写的return SecImage,但是会提示错误“SecImage cannot resovled to a variable”,发现如果numIterations = 0 ,程序直接跳进else里面,但这里面没有设置变量SecImage,所以应该直接return this,表示不进行任何模糊处理,return 原图。
4. 有很多时候需要用到int long short强制转换。
5. 添加jar(一亩上面看到的)
6. 代参数运行 Run--Run configurations--设置跑的project和函数--Arguments里面填参数。
趴234:
(强烈建议先做3再做2和4.最开始按照作业的顺序,完全思路无法理顺。。。。而且main里面的测试代码也要先写完了3才能测试出2。)
趴234之23:
1. 这部分的核心在于runIterator,我觉得它最大的好处就是.next()返回需要的东西会自动指向下一步,当然自己写runIterator就要把这一步体现出来。最开始我不太明白是要自己写一个runIterator还是用java有的iterator,后来知道是要自己写一个,所以就仿照着iterator写了一个针对链表的iterator;(今天发现package那一lecture有详细的讲解iterator)
参数有:
private DListNode2 runindex; private long processLength; private long nodesnum;
函数有(不一定只有这些,但在我的程序里这些就够了):构造函数RunIterator(DListNode2 runhead,long runsnums)/runpoint() [用于返回当前指针] /hasNext() /next() /remove()
补充iterator知识:
来自:https://people.eecs.berkeley.edu/~jrs/61b/lec/13
2. 构造函数里面变量作业规定都是private,所以要额外的写一些函数返回需要的值。比如:PixImage 和 RunIterator里的变量
3. red green blue encode之后长度都相同,所以可以放在同一个run里的判断条件是
RED[Runindex]==image.getRed(i, j)&&GREEN[Runindex]==image.getGreen(i, j)&&BLUE[Runindex]==image.getBlue(i, j))
之前还以为green blue 会跟着red一毛一样除了值,跑的时候出错,才发现需要三个都相同的时候才放在同一个run里。
4. 每个run里的runlength需要初始值设为1而不是0,因为新建一个run意味着已经有一个值了。
5. 在一个构造函数里面构造同样的构造函数记得把参数值传一下。
RunLengthEncoding ImagetoRuns = new RunLengthEncoding(ImageWidth,ImageHeight,finalRed,finalGreen,finalBlue,finalLen); RunsHead = ImagetoRuns.RunsHead; this.width=ImagetoRuns.width; this.height=ImagetoRuns.height; this.RunsNum=ImagetoRuns.RunsNum;
之前忘记传了。。出错。。
6. 每增加或者减少node记得要变化nodenum。。。
7. 学会使用Arrays系列的函数,比如Arrays.copyOf()
8. 用了之前hw中的DListNode2和DList,很好用。注意这个链表head是null。双向的circle。
9. 之前一直不明白为什么要另外写个iterator来new RunIterator。。。还以为要在这个函数里面搞事情。。。后来发现只有这一个用处。。。可能是为了统一吧。
public RunIterator iterator() { // Replace the following line with your solution. RunIterator i = new RunIterator(this.RunsHead,RunsNum); return i;
趴四:
其实不难就是要考虑很多种情况,我的程序一共考虑了9种情况(核心if用了9个),就能够做出来。。思路不写了,怕影响组员的思考,如果有考虑少于9种或者if少于9个能做出来的大佬,记得跟我说一声!(最开始想的是先换成image再插入再encode。。发现作业中说这是cheat的行为【微笑)
最后,测试除了可以跑main里面的还可以跑一下test,就会有之前图中的autograde。part4 其实写的特别顺,也特别慢。。但是debug两次就能跑通还是很爽的!