> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.mAVWDnRcyUh/rev.328
 * 
 * authors: 
 *   Koji Sakai

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



float radius = 200;
float dotPitch = 10;
float vPitch = dotPitch * sin(PI/3);

void setup() {
  size(600, 600);
  noStroke();
}

void draw()
{
  background(0);
  float cX = 0, cY = 0;

  for (int i = 0; i * dotPitch <= width; i++) {
    for (int j = 0; j * vPitch <= height; j++) {
      float cXMoved = (j % 2 == 0) ? cX + dotPitch/2 : cX; 

      /*
      distMToP  カーソル・点間の距離
       param     その距離と定義円の半径との比率(半径を1としたとき点は0<p<1のどれぐらいの位置にあるか)
       ratio     paramと、paramを円弧(球面)にリマップしたときの距離の拡大比率
       */
       
      float distMToP = dist(mouseX, mouseY, cXMoved, cY);
      float param = distMToP / radius;
      float ratio = (radius * sin(HALF_PI * param)) / distMToP;
      
      fill(200, 200, 255, 55);

      if (param < 1) {     //定義円の中のとき

        pushMatrix();

        translate(ratio * (cXMoved - mouseX) - (cXMoved - mouseX), ratio * (cY - mouseY) - (cY - mouseY));
        fill(200, 200, 255, (1 - param) * 200 +  55);

        ellipse( cXMoved, cY, 4 + (1-param)*10, 4 + (1-param)*10);

        popMatrix();
      } else {  //定義円の外のとき
        ellipse( (j % 2 == 0) ? cX + dotPitch/2 : cX, cY, 3, 3);
      }
      cY += vPitch;
    }
    cY = 0;
    cX += dotPitch;
  }
  cX = 0;
}