То, что вы пытаетесь сделать, напоминает мне модель диска Poincare .Что вы можете сделать, это случайно выбрать гиперболическое расстояние , h
, точки от центра диска и затем использовать преобразование r = tanh(h/2)
, чтобы преобразовать его в евклидово расстояние от центра.Подтверждение концепции:
function setup() {
createCanvas(250, 250);
background(0);
noStroke();
fill(255);
noLoop();
}
function draw() {
translate(width / 2, height / 2);
for (let i = 0; i < 5000; i++) {
let theta = random(0, TWO_PI);
let h = randomGaussian(3.3); //experiment with different means
let r = (exp(h) - 1) / (exp(h) + 1);
let x = width / 2 * r * cos(theta);
let y = height / 2 * r * sin(theta);
ellipse(x,y,1,1);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.2/p5.js"></script>
Типичный вывод показан ниже.Вы можете использовать различные средние и стандартные отклонения (кроме значения по умолчанию 1) в вызове randomGaussian()
, чтобы настроить внешний вид.