2014年5月27日火曜日

Processingでアナログ時計

Processingでアナログ時計を表示する関数です

void drawClock(String config) {
  String configs[] = split(config, ',');
  
  int x = width / 2, y = height / 2;
  int size = min(width, height);
  float hour   = 0; boolean isHour    = false; int hourColor   = #000000;
  float minute = 0; boolean isMinute  = false; int minuteColor = #000000;
  float sec    = 0; boolean isSec     = false; int secColor    = #000000;
  
  
  for (int i = 0; i < configs.length; i++) {
    if (configs[i] == null) { continue; }
    String[] val = split(configs[i], ' ');
    
    if (val.length < 1) { continue; }
    if (val[0] == null) { continue; }
    
    if (val.length < 2) { continue; }
    if (val[1] == null) { continue; }
    if (val[0].equals("h"))    { hour   = parseFloat(val[1]); isHour   = true; continue; }
    if (val[0].equals("m"))    { minute = parseFloat(val[1]); isMinute = true; continue; }
    if (val[0].equals("s"))    { sec    = parseFloat(val[1]); isSec    = true; continue; }
    if (val[0].equals("hc"))   { hourColor   = parseInt(val[1]); continue; }
    if (val[0].equals("mc"))   { minuteColor = parseInt(val[1]); continue; }
    if (val[0].equals("sc"))   { secColor    = parseInt(val[1]); continue; }
    if (val[0].equals("size")) { size = parseInt(val[1]); continue; }
    if (val[0].equals("x"))    { x = parseInt(val[1]); continue; }
    if (val[0].equals("y"))    { y = parseInt(val[1]); continue; }
  }
  
  pushMatrix();
  translate(x, y);
  
  noFill();
 
  sec    *=  6;
  minute *=  6; 
  hour   *= 30;
  
  hour   += minute / 12;
  minute += sec    / 60;
  
  ellipse(0, 0, size, size);
  
  {
    float eSize =  size * PI / 60 * 0.6;
    float len   = size / 2 * 0.95;
    for (int i = 0; i < 60; i++) {
      float px =  sin(radians(6 * i)) * len;
      float py = -cos(radians(6 * i)) * len;
      ellipse(px, py, eSize, eSize); 
    }
  }
  
  if (isSec) {
    float len = size / 2 * 0.75;
    float px =  sin(radians(sec)) * len;
    float py = -cos(radians(sec)) * len;
    stroke(secColor);
    line(px, py, 0, 0);
    line(-px * 0.25, -py * 0.25, 0, 0);
  }
  
  if (isMinute) {
    float len = size / 2 * 0.80;
    float px =  sin(radians(minute)) * len;
    float py = -cos(radians(minute)) * len;
    stroke(minuteColor);
    line(px, py, 0, 0);
    line(-px * 0.25, -py * 0.25, 0, 0);
  }
  
  if (isHour) {
    float len = size / 2 * 0.60;
    float px =  sin(radians(hour)) * len;
    float py = -cos(radians(hour)) * len;
    stroke(hourColor);
    line(px, py, 0, 0);
    line(-px * 0.25, -py * 0.25, 0, 0);
  }
  
  popMatrix();
}

引数は文字列で渡します
時針 分針 秒針 の表示が可能です
試しに作っただけなので、あんまり使いやすくないですけども

0 件のコメント:

コメントを投稿