3

ここで概念的な助けが必要です。現在、キャンバス上に広がる 2 つのドット セット (オレンジとブルー) を作成するランダム ドット関数があります。しかし、画面のランダムな領域にドット密度を集中させる方法を探しています。

コードは基本的に次のようになります。

var createBlueDots = function () {
       for (var i = 0; i <=someRandomNum; i++) {
        context.beginPath();
        var rand_x = Math.random(i) * horz_max;
        var rand_y = Math.random(i) * vertical_max;
        context.arc(rand_x, rand_y, radius, 1, 2*Math.PI);
        context.fillStyle ="#0855A2";
        context.fill();
        context.closePath();   
        }
    }
createBlueDots();

... 別の OrangeDot 関数と組み合わせると、次のようなものが作成されます。 キャンバス上のランダムなドットの画像

...しかし、画面の1 つまたは複数の領域に集中する一連のドットを作成するにはどうすればよいでしょうか? もっとこういうの?

集中ドットエリア

概念的なヒントだけでもいただければ幸いです。ありがとうございました。

4

1 に答える 1

4

これを達成するために、指数関数を使用してランダムな角度で距離を決定できます。

// dot count
const dots = 500;
// center point
const center = { x: 100, y: 100 };
// max distance from the center
const radius = 150;
// centripetal force, the larger it gets the more concentrated the dots are
const centripetal = 2.5;

const context = document.querySelector('canvas').getContext('2d');

var createBlueDots = function () {
	for (var i = 0; i <= dots; i++) {
		context.beginPath();
		const dist = (Math.random() ** centripetal) * radius;
		const angle = Math.random() * Math.PI * 2;
		var rand_x = dist * Math.cos(angle) + center.x;
		var rand_y = dist * Math.sin(angle) + center.y;
		context.arc(rand_x, rand_y, 2, 1, 2 * Math.PI);
		context.fillStyle = "#0855A2";
		context.fill();
		context.closePath();
	}
}

createBlueDots();
<canvas width="200" height="200"></canvas>

于 2020-02-06T02:02:16.667 に答える