日常の進捗

主に自分のための,行為とその習慣化の記録

Mod: Coding Challenge #74: Clock with p5.js

f:id:takawo:20171023083401g:plain

なんか微妙なので昔書きかけだった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();
    }
  }
}

リファレンス