日常の進捗

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

Mod:Coding Challenge #23: 2D Supershapes

f:id:takawo:20170923220725g:plain

これの続き。

takawo.hatenablog.com

パラメーターが6つあるので、コントローラーをControlP5を使って制御してみた。

コード

import controlP5.*;

float n1;
float n2;
float n3;
float m;
float a;
float b;

float radius = 200;

ControlP5 cp5;

// setup関数 : 初回1度だけ実行される
void setup() {
  size(960, 540); // ウィンドウサイズを960px,540pxに
  colorMode(HSB, 360, 100, 100); // HSBでの色指定にする

  cp5 = new ControlP5(this);
  cp5.setColorCaptionLabel(color(0, 0, 0));
  cp5.addSlider("n1").setPosition(20, 20).setRange(0, 5).setValue(0.3);
  cp5.addSlider("n2").setPosition(20, 40).setRange(0, 5).setValue(0.3);
  cp5.addSlider("n3").setPosition(20, 60).setRange(0, 5).setValue(0.3);
  cp5.addSlider("m").setPosition(20, 80).setRange(0, 10).setValue(5);
  cp5.addSlider("a").setPosition(20, 100).setRange(0, 5).setValue(1);
  cp5.addSlider("b").setPosition(20, 120).setRange(0, 5).setValue(1);
}

// draw関数 : setup関数実行後繰り返し実行される
void draw() {
  background(0, 0, 50);
  pushMatrix();
  translate(width/2, height/2);
  rotate(frameCount*0.01);
  stroke(frameCount%360, 80, 100);
  noFill();
  beginShape();
  for (float angle = 0; angle < 360; angle += 0.1) {
    float theta = radians(angle);
    float r = superShape(theta);
    float x = radius * r * cos(theta);
    float y = radius * r * sin(theta);
    vertex(x, y);
  }
  endShape();
  popMatrix();
}

float superShape(float theta) {
  float part1 = (1 / a) * cos(theta * m / 4);
  part1 = abs(part1);
  part1 = pow(part1, n2);

  float part2 = (1 / b) * sin(theta * m / 4);
  part2 = abs(part2);
  part2 = pow(part2, n3);

  float part3 = pow(part1 + part2, 1 / n1);

  if (part3 == 0) {
    return 0;
  }

  return (1 / part3);
}

リファレンス