我已经解决了这个问题,但我不确定它是否正确..
用户应该给出一个点的坐标,我应该检查该点是在圆圈内,外面还是圆圈上。我使用距离公式来解决这个问题。 有关圆圈的给定信息是:
圆圈以(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);
}
答案 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 - DELTA
和radius + 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
}