/* 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;
}