小鳥の足跡
What
マウスを小鳥がついてきます。
birdFootprint関数のように、原点中心のカスタム図形(基本図形を組み合わせた図形)を関数化しておくと、 drawから1行で図形を描画できるので、たくさん図形を描くときは便利です。移動はtranslate、回転はrotate、拡大縮小はscaleで行います。
足跡の向きについては、一つ前に描いた足跡の位置と現在のマウスの位置からcosの値を求め、
acosという関数でcosの値から角度を算出しています。directionRadius関数が2つの足跡から角度を求める関数です。
そして、描画時にrotateで算出した角度分回転させると、今マウスが向いてる方向へ足跡もついてきます。
How
var w = 400;
var h = 400;
var c;
var preX, preY;
var position = "right";
function setup() {
createCanvas(w, h);
background(255);
c = sqrt(3)/2;
stroke(0);
}
function draw() {
background(255, 3);
var preD = sqrt(sq(mouseX - preX) + sq(mouseY - preY));
if(preX === undefined){
preX = mouseX;
preY = mouseY;
}
if(preX !== undefined && preD > 30){
push();
var r = directionRadius(preX, preY, mouseX, mouseY);
translate(mouseX, mouseY);
rotate(r);
birdFootprint(10)
pop();
preX = mouseX;
preY = mouseY;
}
}
function birdFootprint(l){
strokeWeight(2);
if(position === "right"){
var d = l * 0.7;
position = "left";
}else{
var d = -l * 0.7;
position = "right";
}
line(d, 0, d, -l);
line(d, 0, d, l);
line(d, 0, l/2 + d, -c * l);
line(d, 0, -l/2 + d, -c * l);
}
function directionRadius(x1,y1,x2,y2){
var d = sqrt(sq(x1-x2) + sq(y1-y2));
var cs = (x2 - x1) / d;
var sn = (y2 - y1) / d;
var t = acos(cs);
if(sn < 0){
t = TWO_PI - t;
}
return t + PI / 2;
}
Where
関連するチュートリアル・リファレンスへのリンクです。