指向圆圈内和圆圈

时间:2016-03-10 10:00:58

标签: java math geometry

我已经解决了这个问题,但我不确定它是否正确..

用户应该给出一个点的坐标,我应该检查该点是在圆圈内,外面还是圆圈上。我使用距离公式来解决这个问题。 有关圆圈的给定信息是:

圆圈以(0,0)为中心 和半径是10

 public static void main(String[] strings) {


    Scanner scanner = new Scanner(System.in);

    System.out.println("Enter a point with two coordinates");
    double y1 = scanner.nextDouble();
    double x1 = scanner.nextDouble();

    //  circle is centered at 0,0
    double y2 = 0;
    double x2 = 0;

    double radius = 10;

    double distance;
    // using the distance formula to calculate the distance
    // from the point given from the user and point where circle is centered

    /**
     * distance formula
     *  d = √ ( x2 - x1 )^2 + (y2 - y1 )^2
     */

    distance = Math.pow( x2 - x1,2) + Math.pow(y2-y1,2);

    // find square root
    distance = Math.sqrt(distance);

    String result="";

    if(distance < radius) {
        result = "("+y1+" , "+x1+")" +" is within the circle";
    }
    else if(distance > radius) {
        result = y1+" , "+x1 +" is outside the circle";
    }
    else if(distance == radius) {
        result =y1+" , "+x1 +" is on the circle";
    }

    System.out.println(result);

}

3 个答案:

答案 0 :(得分:2)

这很好,但很草率。

无需计算平方根。以距离平方为单位工作。

然后使用distance < radius * radius等进行比较,或者为了清楚起见重命名distance。计算平方根是昂贵的,并且不精确可能难以控制。在您想要测试圆圈边缘的点的情况下,这一点尤为重要。

还考虑编写(x2 - x1) * (x2 - x1)而不是使用pow来获得第二种权力。虽然Java 可能(我永远不会记得哪些肯定是我没有使用它的足够好的理由)优化到更长的形式,其他语言(如C)没有,并且不精确可能会蔓延到那里也是。

答案 1 :(得分:0)

考虑使用Math.hypot()计算距离并使用一些小阈值比较双值:

static final double DELTA = 1E-5;  // not necessarily 1E-5; see comments

//...

distance = Math.hypot(x2 - x1, y2 - y1);    
if (Math.abs(distance - radius) < DELTA)
   // on the circle
else if (distance > radius)
   // outside
else
   // inside

使用DELTA的原因是通过计算获得相等双值的可能性非常小。如果它们至少有一点不同,则直接比较将返回false。

通过应用阈值,您不会检查该点是否完全位于圆上,而是位于radius - DELTAradius + DELTA之间的环内。所以DELTA是一种容忍限度,应该特别为应用选择值,例如: G。取决于绝对或相对输入的不准确性。

答案 2 :(得分:0)

你确定这个问题需要双打作为输入吗?给出的例子是整数。使用整数,您可以确定点位置,使用实数(双精度),您无法确定&#34; on circle&#34;或者不是我认为这个问题要求你使用整数的另一个原因。

性能和准确性的诀窍是不使用Math.sqrt并且只能使用整数。

int x;
int y;
int centreX;
int centreY;

int deltaX = x - centreX;
int deltaY = y - centreY;

int distanceSquared = deltaX * deltaX + deltaY * deltaY;

int radiusSquared = radius * radius;

if (distanceSquared == radiusSquared) { //distance == radius
  //on circle
} else if (distanceSquared < radiusSquared) { //distance < radius
  //in circle
} else {
  //out of circle
}