所以我认为我不擅长数学,而且如果我知道自己在做什么,我认为将简单的数学距离公式转换成代码并不困难。显然我没有。长话短说,我应该计算两个3D点之间的距离,由于某种原因,我的公式不能正常工作。我不知道我是不是写错了,或者是否有什么东西是关闭的,因为我已多次写它并且它仍然无法正常工作。
这是我的public class Distance
,它有我的距离公式
public class Distance
{
Distance () {}
double d;
double x1, x2, y1, y2, z1, z2;
public void setD (double d)
{
this.d = d;
}
double distance ()
{
/* return Math.sqrt ( Math.pow (( x2 - x1 ), 2 )
+ Math.pow (( y2 - y1 ), 2 )
+ Math.pow (( z2 - z1 ), 2 ));
*/
return Math.sqrt ( ( x2 - x1 ) * ( x2 - x1 )
+ ( y2 - y1 ) * ( y2 - y1 )
+ ( z2 - z1 ) * ( z2 - z1 ) );
}
}
我尝试过两种方式编写它,两种方法都测试为0(我使用嵌套的for
循环,所有变量循环到3,在我为用户输入写入之前进行测试)。
如果有人能解释我为什么会遇到这个问题,我们将不胜感激。
编辑:我知道有人告诉我初始化为某个值。我很确定我在测试循环中初始化它,我知道为了清晰起见我应该发布它。
class Distance_test
{
public static void main ( String [] args )
{
Distance line = new Distance ();
double d;
for ( double x1 = 0; x1 <= 2; x1++ )
{
line.setD ( x1 );
d = line.distance();
for ( double x2 = 0; x2 <= 2; x2++ )
{
line.setD ( x2 );
for ( double y1 = 0; y1 <= 2; y1++ )
{
line.setD ( y1 );
for ( double y2 = 0; y2 <= 2; y2++ )
{
line.setD ( y2 );
for ( double z1 = 0; z1 <= 2; z1++ )
{
line.setD ( z1 );
for ( double z2 = 0; z2 <= 2; z2++ )
{
line.setD ( z2 );
System.out.printf ( "\n Distance of 3D line with points %.2f, %.2f, %.2f, %.2f, %.2f, %.2f is %.2f\n", x1, x2, y1, y2, z1, z2, line.distance() );
}
}
}
}
}
}
}
}
是的,我觉得它有点乱,但我只是想让它先工作才能让它看起来更好。
答案 0 :(得分:2)
x1, x2, y1, y2, z1, z2
未初始化。你应该初始化它们,而不是d,这是你计算的结果。
如果内存对我有用,Java正在将双精度初始化为零,如果这是C ++,则您的变量将包含随机数据,并且您的结果也将是随机的。
除了你的代码没问题。
此外,您应该将此实现为函数,而不是类。你得到了一些输入,你产生了一个结果 - 这是一个功能。
double calculateDistance(double[] point1, double[] point2)
{
x1 = point1[0]; // Or you can use enum or something for the index
y1 = point1[1];
z1 = point1[2];
x2 = point2[0];
y2 = point2[1];
z2 = point2[2];
return Math.sqrt ( Math.pow (( x2 - x1 ), 2 )
+ Math.pow (( y2 - y1 ), 2 )
+ Math.pow (( z2 - z1 ), 2 ));
}
由于这是Java,你可以将它包装在名为&#34; MathFunctions&#34;的静态类中。或类似的东西。
答案 1 :(得分:0)
这绝对是C#或Java,而不是C ++。
我没有看到的最重要的事情是对x,y和z变量的赋值。如果没有设置,那么我希望它们是未定义的或零,这意味着结果将是0。
您需要设置那些进入Pow和Sqrt的值才能获得有效的结果。