これを使えば起動時間を最大20日程度まで計測できます
似た関数に second() minute() hour() day() month() year() がありますが、これはシステム時間を返す関数なので注意してください
言い訳をすると、day hour millis minute month second yearと並んでいるので、millisはシステム時間のミリ秒を返す関数かと思っていました
システム時間のミリ秒が欲しい場合はどうすればいいんだろう?
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(); }引数は文字列で渡します
final float BoxSize = 120; final float AxisLineLen = BoxSize / 1.5; final float AutoRotateDegree = 0.5; boolean IsCameraRotate = true; float CameraXrot = radians( 45); float CameraYrot = radians(-45); float CameraZoom = 160; boolean pmousePressed = false, pkeyPressed = false; void setup() { textFont(createFont("GulimChe", 20)); textAlign(LEFT, TOP); size(1024, 768, P3D); noFill(); } void draw() { keyboardInput(); pushMatrix(); background(127); MoveCamera(); DrawBox(); popMatrix(); text("camR:" + (int)degrees(CameraXrot), 0, 20 * 0); text("camP:" + (int)degrees(CameraYrot), 0, 20 * 1); text("zoom:" + (int)CameraZoom, 0, 20 * 2); text("musX:" + mouseX, 0, 20 * 3); text("musY:" + mouseY, 0, 20 * 4); if (!pkeyPressed && keyPressed && key == 's') { save("./Processing_ss.png"); } pmousePressed = mousePressed; pkeyPressed = keyPressed; } void keyboardInput() { if (!pkeyPressed && keyPressed) { if (key == '1') { IsCameraRotate = false; CameraXrot = radians( 0); CameraYrot = radians( 0); } if (key == '2') { IsCameraRotate = false; CameraXrot = radians(90); CameraYrot = radians( 0); } if (key == '3') { IsCameraRotate = false; CameraXrot = radians(90); CameraYrot = radians(89.71); } if (key == '4') { IsCameraRotate = true; CameraXrot = radians(45); CameraYrot = radians(-45); } } } void DrawBox() { strokeWeight(2); stroke(255); box(BoxSize / 2, BoxSize / 4, BoxSize); strokeWeight(1); stroke(#FF0000); line(0, 0, 0, 0, 0, AxisLineLen); sphere(1, 0, 0, AxisLineLen); stroke(#7F0000); line(0, 0, 0, 0, 0, -AxisLineLen); stroke(#00FF00); line(0, 0, 0, AxisLineLen, 0, 0); sphere(1, AxisLineLen, 0, 0); stroke(#007F00); line(0, 0, 0, -AxisLineLen, 0, 0); stroke(#0000FF); line(0, 0, 0, 0, AxisLineLen, 0); sphere(1, 0, AxisLineLen, 0); stroke(#00007F); line(0, 0, 0, 0, -AxisLineLen, 0); } boolean MvCm_IsCameraMove = false; void MoveCamera() { if (mousePressed) { CameraXrot += radians(pmouseX - mouseX) / 2; CameraYrot += radians(pmouseY - mouseY) / 2; MvCm_IsCameraMove = MvCm_IsCameraMove || pmouseX != mouseX || pmouseY != mouseY; } else { if (pmousePressed) { IsCameraRotate = IsCameraRotate ? false : !MvCm_IsCameraMove; } if (IsCameraRotate) { CameraXrot += radians(AutoRotateDegree); } MvCm_IsCameraMove = false; } if (keyPressed && key == 'z') { CameraZoom++; } if (keyPressed && key == 'x') { CameraZoom--; } CameraXrot = (CameraXrot + TWO_PI) % TWO_PI; if (CameraYrot < -HALF_PI) { CameraYrot += PI; } if (CameraYrot > HALF_PI) { CameraYrot -= PI; } camera(CameraXrot, CameraYrot, CameraZoom); } void camera(float X, float Y, float zoom) { camera(cos(Y) * zoom * sin(X), sin(Y) * zoom, cos(Y) * zoom * cos(X), 0, 0, 0, 0, 1, 0); } void sphere(float r, float x, float y, float z) { pushMatrix(); translate(x, y, z); sphere(r); popMatrix(); }やってることは
void arc(float x, float y, float z, String vec, float start, float stop, float size) { final float lineDeg = radians(360 / 32); float px0, py0, pz0, px1, py1, pz1; boolean IsBreak = false; start = (start); stop = (stop); do { float startRot = start; float stopRot = startRot + lineDeg; if (stopRot > stop) { stopRot = stop; IsBreak = true; } px0 = px1 = py0 = py1 = pz0 = pz1 = 0; if (vec == "X") { pz0 = -sin(start) * size; py0 = -cos(start) * size; pz1 = -sin(stopRot) * size; py1 = -cos(stopRot) * size; } if (vec == "Y") { px0 = sin(start) * size; pz0 = cos(start) * size; px1 = sin(stopRot) * size; pz1 = cos(stopRot) * size; } if (vec == "Z") { px0 = sin(start) * size; py0 = -cos(start) * size; px1 = sin(stopRot) * size; py1 = -cos(stopRot) * size; } line(px0 + x, py0 + y, pz0 + z, px1 + x, py1 + y, pz1 + z); start = stopRot; } while (!IsBreak); }使い方は
arc(0, 0, 0, "Z", radians(-45), radians(45), 30);のような感じ
import processing.serial.*; Serial myPort = null; void setup() { textFont(createFont("GulimChe", 20)); size(1024, 768); } void draw() { if (myPort == null) { OpenSerialPortSelect(); } } void serialEvent(Serial myPort) { background(0); text(myPort.readStringUntil('\n'), 10, 20); } void OpenSerialPortSelect() { String[] SerialList = Serial.list(); background(0); for (int i = 0; i < SerialList.length && i < 10; i++) { text((i + 1) + " : " + SerialList[i], 10, 20 + (i * 20)); } int SerialSelect = -1; if (keyPressed) { SerialSelect = key - '1'; } if (SerialSelect >= 0 && SerialSelect < SerialList.length) { myPort = new Serial(this, SerialList[SerialSelect], 115200); myPort.bufferUntil('\n'); } }こんな感じです