251030

const { animate } = anime;

const W = 800;
const H = 800;

const SPHERE_SIZE = 30;
const SPHERE_NUM = 10;
const SATE_SIZE = 8;
const SATE_NUM = 30;

let palette = [];
let gridPoints = [];
let innerAngles = [];

let animeValue = {
  count: 0,
};

function setup() {
  createCanvas(W, H, WEBGL);
  palette = colorArray[2].colors;
  background(palette[4]);
  frameRate(60);

  noFill();
  animate(animeValue, {
    count: 1,
    duration: 5000,
    ease: "inOutCirc",
    loop: true,
    loopDelay: 0,
    alternate: true,
  });
}

function draw() {
  orbitControl();
  background(palette[4]);

  for (let i = 0; i < SPHERE_NUM; i++) {
    push();
    let r = W / 4;
    let angle = (TAU / SPHERE_NUM) * i;
    let x = cos(angle) * r;
    let y = sin(angle) * r;
    let f = map(animeValue.count, 0, 1, 0, TAU * 2);
    let sr = SPHERE_SIZE + SATE_SIZE;
    let sAngle = f - i;
    translate(x, y, 0);
    noFill();
    stroke(palette[0]);
    strokeWeight(SATE_SIZE);
    beginShape();
    for (let j = 0; j < SATE_NUM; j++) {
      push();
      let lon =
        (cos(sAngle + (TAU / 8 / SATE_NUM) * j) *
          (sin(sAngle + (TAU / 8 / SATE_NUM) * j) * TAU)) /
        2;
      let lat = (sin(sAngle + (TAU / 8 / SATE_NUM) * j) * TAU) / 2;

      let sx = sr * cos(lat) * cos(lon);
      let sy = sr * cos(lat) * sin(lon);
      let sz = sr * sin(lat);

      splineVertex(sx, sy, sz);
      pop();
    }
    endShape();

    noStroke();
    if (sAngle > TAU / 2) {
      fill(palette[3]);
    } else {
      fill(palette[2]);
    }
    sphere(SPHERE_SIZE);
    pop();
  }

  // noLoop();
}

const colorArray = [
  {
    id: 0,
    colors: ["#253276", "#dfdad3", "#ffffff", "#000000"],
  },
  {
    id: 1,
    colors: ["#2E5400", "#dfdad3", "#ffffff", "#000000"],
  },
  {
    id: 2,
    colors: ["#253276", "#f9d3cc", "#f07433", "#437800", "#dfdad3"],
  },
];
  • 極座標→直交座標の変換

Last Update :