Last active
August 29, 2015 14:07
-
-
Save p5info/f43b856cf001f10aaaea to your computer and use it in GitHub Desktop.
http://yoppa.org/proga10/1419.html の OOPのコードがちょっと疑問だったので直してみた。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Analog clock OOP | |
//original code http://yoppa.org/proga10/1419.html | |
//構造化プログラミングしてないと拡張するときもぜんぶ読まないといけないので大変だろうと | |
int MARGIN = 20; | |
Clock myClock = new Clock(); | |
void setup() { | |
size(300,300); | |
stroke(255); | |
smooth(); | |
frameRate(30); | |
} | |
void draw() { | |
background(0); | |
//myClock.getTime(); | |
//時間の操作は時計が描くときにすることだと思います。 | |
//Clockを描くためにはClock#getTime()で最新の時間にしなければならないという実装の縛りが出来てしまっている、 | |
//それはモジュール化(カプセル化)がうまくできていない事を示しているのではないでしょうか。 | |
//このdraw()が時間を知る必要ないですし、値を得てない上状態を変更するのでgetではなくsetです、 | |
//setCurrentTimeに直しました。 | |
myClock.draw(); | |
} | |
//テーマが『Processingを用いて「時間」を表現する』なので「時間」は「時計」と分離する方が良いのかなと | |
class Time { | |
public float s, m, h;//getterを用意するのは過剰実装かと思ったので作らない事とした | |
public void setCurrentTime(){ | |
s = second(); | |
m = minute() + (s/60.0); | |
h = hour()%12 + (m/60.0); | |
} | |
} | |
class Clock { | |
private Time time = new Time(); | |
public void draw(){ | |
//今は時間を指定して書くことを考えてないので、時計が描くときに | |
//今の時間をとってくれば良いとおもったので | |
time.setCurrentTime(); | |
translate(width/2, height/2); | |
rotate(radians(180)); | |
drawDial(); | |
drawHands(); | |
} | |
//針の描画 | |
void drawHands() { | |
noFill(); | |
stroke(255); | |
//メソッドの実装は現在はほぼ同じなのでdrawXxxxHandを汎用メソッド化してもよいとは思うが、それぞれでデザインを適用する拡張を残すため、このままとする | |
//メソッドに分割して気がついたのですが、この呼び出し順は逆ではないかと、秒針が一番上に来るのが一般的だと思われるのでdrawSecondHand()が本来なら最後かなと思います。 | |
drawSecondHand(); | |
drawMinuteHand(); | |
drawHourHand(); | |
} | |
//時針の描画 | |
void drawHourHand() { | |
pushMatrix(); | |
rotate(radians(time.h*(360/12))); | |
strokeWeight(4); | |
line(0,0,0,width/3-MARGIN); | |
popMatrix(); | |
} | |
//分針の描画 | |
void drawMinuteHand() { | |
pushMatrix(); | |
rotate(radians(time.m*(360/60))); | |
strokeWeight(2); | |
line(0,0,0,width/2-MARGIN); | |
popMatrix(); | |
} | |
//秒針の描画 | |
void drawSecondHand() { | |
pushMatrix(); | |
rotate(radians(time.s*(360/60))); | |
strokeWeight(1); | |
line(0,0,0,width/2-MARGIN); | |
popMatrix(); | |
} | |
//文字盤の描画 | |
void drawDial() { | |
fill(128); | |
pushMatrix(); | |
noStroke(); | |
for(int i=0; i<60; i++){ | |
rotate(radians(6)); | |
ellipse(width/2-MARGIN,0,3,3); | |
} | |
for(int i=0; i<12; i++){ | |
rotate(radians(30)); | |
ellipse(width/2-MARGIN,0,10,10); | |
} | |
popMatrix(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment