Mod: Coding Challenge #74: Clock with p5.js
なんか微妙なので昔書きかけだった7セグメントの時計も改めて書いてみた.
コード(サークルクロック)
float hlen = 130; float mlen = 230; float slen = 230; float lastMillis; void setup() { size(600, 600,P2D); colorMode(HSB, 360, 100, 100, 100); } void draw() { background(220, 40, 20); translate(width/2, height/2); rotate(radians(-90)); noFill(); float h = hour(); h = map(h%12, 0, 11, 0, TWO_PI); float hx = cos(h) * hlen; float hy = sin(h) * hlen; float m = minute(); m = map(m, 0, 59, 0, TWO_PI); float mx = cos(m) * mlen; float my = sin(m) * mlen; float s = second(); s = map(s, 0, 59, 0, TWO_PI); float sx = cos(s) * slen; float sy = sin(s) * slen; strokeWeight(30); stroke(300, 100, 100, 80); line(0, 0, hx, hy); strokeWeight(16); stroke(200, 100, 100, 80); line(0, 0, mx, my); strokeWeight(12); stroke(100, 100, 100, 80); line(0, 0, sx, sy); stroke(300, 100, 100, 80); arc(0, 0, 2*slen + 120, 2*slen + 120, 0, h); stroke(200, 100, 100, 80); arc(0, 0, 2*slen + 120 - 12 * 2 - 5, 2*slen + 120 - 12 * 2 - 5, 0, m); stroke(100, 100, 100, 80); arc(0, 0, 2*slen + 120 - 12 * 4 - 10, 2*slen + 120 - 12 * 4 - 10, 0, s); }
コード(7セグメントクロック)
ArrayList<SevenSegments> segments = new ArrayList<SevenSegments>(); String str = "00-00-00"; float segSize = 50; void setup() { size(800, 200, P3D); colorMode(HSB, 360, 100, 100, 100); frameRate(10); noStroke(); for (int i = 0; i < str.length(); i++) { segments.add(new SevenSegments(new PVector(width/22+i*segSize*2, height/2), segSize, 0)); } background(0, 0, 0); } void draw() { fill(0, 0, 0, 20); rect(0, 0, width, height); String str = nf(hour(), 2)+"-"+ nf(minute(), 2) +"-"+nf(second(), 2); for (int i = 0; i < segments.size(); i++) { SevenSegments segment = (SevenSegments)segments.get(i); if (str.charAt(i)=='-') { segment.num = 10; } else { segment.num = Character.getNumericValue(str.charAt(i)); } segment.draw(); } } class Segment { color c_on = color(220, 80, 100); color c_off = color(220, 80, 20); ; PVector topLeft; PVector size; float w; float h; boolean isVertical; public Segment(PVector _topLeft, float _len, boolean _isVertical) { topLeft = _topLeft.get(); w = _len; h = _len/6; isVertical = _isVertical; } public void draw() { pushMatrix(); translate(topLeft.x, topLeft.y); if (isVertical) { rotate(-PI/2); } beginShape(); vertex(0, 0); vertex(w, 0); vertex(w+h/2, h/2); vertex(w, h); vertex(0, h); vertex(0-h/2, h/2); endShape(); popMatrix(); } } class SevenSegments { int num = 0; PVector pos; float margin = 15; Segment[] segments = new Segment[7]; Boolean[][] status = { {true, true, true, false, true, true, true}, // 0 {false, false, true, false, false, true, false}, // 1 {true, false, true, true, true, false, true}, // 2 {true, false, true, true, false, true, true}, // 3 {false, true, true, true, false, true, false}, // 4 {true, true, false, true, false, true, true}, // 5 {true, true, false, true, true, true, true}, // 6 {true, false, true, false, false, true, false}, // 7 {true, true, true, true, true, true, true}, // 8 {true, true, true, true, false, true, true}, // 9 {false, false, false, true, false, false, false} // - }; public SevenSegments(PVector _pos, float len, int _num) { pos = _pos; num = _num; float x_margin = len/5; float y_margin = len/5; segments[0] = new Segment(new PVector(pos.x-len/2+x_margin, pos.y-len-y_margin), len, false); segments[1] = new Segment(new PVector(pos.x-len/2, pos.y), len, true); segments[2] = new Segment(new PVector(pos.x+len/2+x_margin, pos.y), len, true); segments[3] = new Segment(new PVector(pos.x-len/2+x_margin, pos.y), len, false); segments[4] = new Segment(new PVector(pos.x-len/2, pos.y+len+y_margin), len, true); segments[5] = new Segment(new PVector(pos.x+len/2+x_margin, pos.y+len+y_margin), len, true); segments[6] = new Segment(new PVector(pos.x-len/2+x_margin, pos.y+len+y_margin), len, false); } public void draw() { for (int i = 0; i < segments.length; i++) { if (status[num][i] == true) { fill(segments[i].c_on); } else { fill(segments[i].c_off); } if (num==10 && millis()%1000 < 500) { fill(segments[i].c_off); } segments[i].draw(); } } }