康托爾集
阿新 • • 發佈:2020-12-22
本次任務主要是利用遞迴畫出康托爾集。
這裡我寫的方法如下:
public void DrawLine(Graphics gr,double ix,double iy,double jx,double jy,MouseEvent e){ double mid = 1; if((jx - ix) < mid){ gr.drawLine((int)ix,(int)iy,(int)jx,(int)jy); } else{ double kx = 0f;double ky = 0f; double lx = 0f;double ly = 0f; kx = ix + (jx - ix) / 3; ky = iy + 50; lx = jx - (jx - ix) / 3; ly = jy + 50; iy = iy + 50; jy = jy + 50; DrawLine(gr,ix,iy,kx,ky,e); DrawLine(gr,lx,ly,jx,jy,e); } } //在MouseClicked裡面 if(ab.equals("康托爾集")){ if(e.getClickCount() == 1){ DrawLine(gr,100,300,500,300,e); } }
這裡,在DrawLine()這個方法的括號裡,要新增Grphics gr,不然畫線的時候畫不了。其次,要新增MouseEvent e(滑鼠監聽器?),不然的話,接下來呼叫這個方法的時候會報錯(編譯器不認識e,不知道這是啥)。
然後既然是遞迴函式,就必須設定退出的東西,不能讓它一直進行下去。所以這個時候我就定義了一個mid = 1.ix,iy和jx,jy分別是一條線段的起始點和終止點的座標。如果這兩個點的橫座標之差小於這個mid,那麼就只需要執行gr.drawLine((int)ix,(int)iy,(int)jx,(int)jy);這條語句就可以了(只需要畫一條線)。
如果不是的話,那就可以遞迴了。kx,ky是一條線段下面那兩條線段中靠左邊的那一條的終止點座標;lx,ly是一條線段下面那兩條線段中靠右邊的那一條的起始點座標。它們的計算方法在上面已經給出。(橫座標就加減三分之一那個東西,縱座標+50表示兩點線段之間的距離是50),而iy和jy都還分別需要+50是因為我畫完一條線之後,接下來畫的那兩條線也需要用到最開始的ix,iy和jx,jy座標。就是橫座標的值不需要變,但是縱座標差了50.(這裡如果不懂的話,可以自己模擬一遍這個畫線的過程。)
關於遞迴次數的問題:當然這裡因為一條線段下面有兩條線段,兩條線段都需要畫,所以我需要在這裡(一個方法裡)呼叫兩次遞迴函式。
再次強調:MouseEvent e一定要加!至於怎麼加,直接放到寫的那個方法後面跟的括號裡就行了!不然的話會報錯的!