【问题标题】:Populating a circle with dots, using bias towards the edge of the cirlcle用圆点填充一个圆,使用对圆边缘的偏差
【发布时间】:2018-09-22 03:47:30
【问题描述】:

这就是我想要达到的目标

到目前为止,我对我拥有的代码感到满意,它借鉴了 Wolfram 和其他一些数学资源。

但我不知道如何整合一些偏差计算,或者只是一种分配随机但有组织的方法!

谁能指出我正确的方向?

这是我的代码,它将使用 P5 在浏览器中运行

var numDots = 3000;
var dotSize = 1.5;
var dotCoordinates = [];
var randomHue;
var xoff = 0;
var fps = 30;

function setup() {
  createCanvas(600,600);
  ellipseMode(CENTER);
  colorMode(HSB,360,100,100);
  randomHue = random(360);
  frameRate(fps);

  for(i=0; i < numDots; i++) {
    var rnd = map(noise(xoff),0,1,0,width);
    var R = 300; //circle radius
    var a = random(rnd) * TWO_PI; //random angle

    // var r = R * noise(rnd); 					// donuts
    // var r = R * noise(random()); 		// dust rings
    // var r = R * random(noise(rnd)); 	// starburst
    var r = R*0.6 * sqrt(random()); 		// solid

    var x = width/2 + r * cos(a);
    var y = height/2 + r * sin(a);  
    result = createVector(x,y);
    dotCoordinates.push(result);
    xoff += 0.001;
  }    

}

function draw() {
  background(randomHue,100,10);
  noStroke();

  for(i=0; i < dotCoordinates.length; i++) {  
    fill(randomHue,50,80);
    ellipse(dotCoordinates[i]['x'], dotCoordinates[i]['y'], dotSize, dotSize);
  }

}
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.2/p5.min.js"&gt;&lt;/script&gt;

【问题讨论】:

  • 如果您了解如何正确地从圆或球体中采样点,那么偏向采样函数以其他方式对其进行采样应该很容易
  • 感谢您的回复。不确定我是否理解你 - 我目前不是从一个圆圈中取样,我是在一个圆圈中任意分布。我可以看到一种方法,也许我迭代了 dotCoordinates 数组中的每个点,并且任何靠近圆边缘的点都被推到了边缘。你指的是这个吗?
  • 不,我的意思是随机抽样。在所需几何形状中生成随机点的过程,该随机点具有关于该几何形状的所需概率分布。常用于蒙特卡洛模拟。
  • @tehhowch 我不知道蒙特卡洛模拟。感谢分享。

标签: plot processing geometry p5.js


【解决方案1】:

你正在尝试做的事情让我想起了Poincare disk model。你可以做的是随机选择一个双曲线距离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); 
  }
}
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.2/p5.js"&gt;&lt;/script&gt;

典型输出如下图所示。您可以在调用randomGaussian() 时尝试不同的均值和标准差(默认值 1 除外)来调整外观。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多