用于绘图的画布是一个圆圈;画布中的随机点

时间:2013-10-28 08:15:08

标签: java math

我正在练习考试,而且我正在做一个练习题。我有一个方法,它有两个参数:一个用于圆的半径,另一个用于放置在该圆内的点数。方法如下:

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)。“

我只是不确定如何理解这个数学。上面的代码是我最好的尝试,但输出很奇怪。

这是我失败的输出:

enter image description here

3 个答案:

答案 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坐标。