我想在紅色圓圈中隨機獲得一個點,并避開藍色圓圈:

我做的:
double r = radius * Math.sqrt(R.nextDouble());
double theta = R.nextDouble() * 2 * Math.PI;
int x = (int) (r * Math.cos(theta));
int z = (int) (r * Math.sin(theta));
但它只在紅色圓圈中找到。
所以,當 X 或 Z 低于藍色的圓半徑時,我嘗試添加一些內容,但我得到了這個結果:

當隨機點與中心(0/0)之間的距離太近時,我還嘗試升級 X 或 Z。
我還制作了這個片段來測驗很多 X/Z 位置,但它每次都會嘗試。它顯然沒有優化,因為我必須過濾所有生成的值,而不是直接生成所需范圍內的值。
function getNumberIn(min, max) {
return Math.random() * (max - min) min;
}
var canvas = document.getElementById("circlecanvas");
var context = canvas.getContext("2d");
context.beginPath();
context.arc(150, 150, 150, 0, Math.PI * 2, false);
context.fillStyle = "yellow";
context.fill();
context.closePath();
context.beginPath();
context.arc(150, 150, 50, 0, Math.PI * 2, false);
context.fillStyle = "red";
context.fill();
context.closePath();
context.fillStyle = "black";
let nb = 0;
for (let i = 0; i < 1000; i ) {
let x = getNumberIn(0, 300);
let z = getNumberIn(0, 300);
let distance = Math.sqrt((x - 150) * (x - 150) (z - 150) * (z - 150));
if ((distance >= 50 || distance <= -50) && !(distance >= 150 || distance <= -150)) {
context.fillRect(x, z, 3, 3);
} else {
nb ;
}
}
console.log("Amount of skipped values: " nb);
<canvas id="circlecanvas" width="300" height="300"></canvas>
如何在紅色圓圈中獲得隨機點,不包括藍色圓圈?
uj5u.com熱心網友回復:
做下一個改變:
double r = Math.sqrt(
r_small*r_small
R.nextDouble() * (r_large*r_large-r_small*r_small));
//next lines remain the same
double theta = R.nextDouble() * 2 * Math.PI;
int x = (int) (r * Math.cos(theta));
int z = (int) (r * Math.sin(theta));
其中r_small藍色半徑r_large是紅色環的外半徑
這種方法提供了適當的最小和最大距離以及紅環中點的均勻分布。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/380767.html
