我正在练习考试,而且我正在做一个练习题。我有一个方法,它有两个参数:一个用于圆的半径,另一个用于放置在该圆内的点数。方法如下:
private void drawDots(int radius, int numDots){
double ycord;
double xcord;
for(int q = 0; q < numDots; q++){
ycord = -radius + random()*(radius+radius+1);
xcord = pow((pow(radius,2)-pow(ycord,2)),0.5);
turt.moveTo(xcord,ycord);
turt.penDown();
turt.forward(0);
turt.penUp();
}
}
turt
是我用来绘制的对象,penDown()
/ penUp()
分别放置和删除画布中的对象。
我正在尝试定义turt
对象的x坐标和y坐标以保持在半径范围内。假设半径为100
,点数为200
,如何将对象保持在该半径范围内?
问题表明:
“为了将点保持为半径为r的圆,在区间-r中选择随机y坐标,选择r。然后在区间-b,b中随机选择x-coord,其中b = sqrt (r ^ 2 - y ^ 2)。“
我只是不确定如何理解这个数学。上面的代码是我最好的尝试,但输出很奇怪。
这是我失败的输出:
答案 0 :(得分:5)
从中心(0,0)
到点的距离必须小于圆的半径r
。距离可以表示为sqrt(x² + y²)
。因此,如果您在y
之间随机选择[-r, r]
坐标,则只需确保您的x
坐标符合上一个等式,因此您的数学就可以了。
示范
sqrt(x² + y²) < r
x² + y² < r²
x² < r² - y²
x < sqrt(r² - y²)
#
您的算法应如下所示。选择y坐标后,只要符合距离约束,就可以随机选择x。
private void drawDots(int radius, int numDots){
double y;
double x;
double xMax;
for (int q = 0; q < numDots; q++){
// y is chosen randomly
y = -radius + random() * (radius + radius + 1);
// x must respect x² + y² < r²
xMax = pow((pow(radius,2)-pow(ycord,2)), 0.5);
x = random() * 2 * xMax - xMax;
turt.moveTo(x, y);
turt.penDown();
turt.forward(0);
turt.penUp();
}
}
答案 1 :(得分:1)
目前你在圆圈上绘制点,而不是在圆圈内。那是因为你没有正确遵循指南。
b = pow((pow(radius,2)-pow(ycord,2)),0.5); // this should be b
xcord = -b + random()*(b+b);
答案 2 :(得分:1)
查看随机文档,默认情况下会看到它生成0到1之间的数字。
基本上这意味着您要寻找的表达式是: ycord = -radius +随机()*(半径* 2);
这为你在-radius和radius之间的y轴上提供了一个点(考虑random()是否返回0得到-radius,它返回1得到-radius +(2 * radius())= radius。< / p>
x坐标的计算是正确的,但是它给出了圆上的x坐标点(我们称之为b)。我怀疑你想使用一个新的随机选择b和-b之间的x坐标。