如何在不包括另一个下圆的圆中找到一个点?
How to find a point in a circle excluding another lower circle?
我想在红圈中随机取一个点,并避开蓝圈:
我做了这个:
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>
如何获得红色圆圈中不包括蓝色圆圈的随机点?
进行下一步更改:
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
是红色环的外半径
这种方法提供了正确的最小和最大距离以及红环中点的均匀分布。
我想在红圈中随机取一个点,并避开蓝圈:
我做了这个:
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>
如何获得红色圆圈中不包括蓝色圆圈的随机点?
进行下一步更改:
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
是红色环的外半径
这种方法提供了正确的最小和最大距离以及红环中点的均匀分布。