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两次就能跑通还是很爽的!

原文地址:https://www.cnblogs.com/developerchen/p/7182437.html