c ++从大型数组中读取3D坐标并计算它们之间的距离

时间:2018-03-12 13:33:25

标签: c++ arrays stream

我得到了一份任务,因为我真的很挣扎:

  

编写一个程序,将input-week6-ad-q3.txt(200点的3D坐标)读入数组并报告以下内容   1. point1与其他之间的距离(考虑第一个坐标是point1,第二个点2 ,,,)   2.最接近点1的点和点1与最近点之间的距离。

我试图启动它,但我现在无法获得坐标,我甚至不知道从哪里开始寻找最近的点。任何帮助将非常感激。

这是我到目前为止所得到的:

#include <iostream>
#include <fstream>

using namespace std;

const int MAX = 200;
typedef double x_coord[MAX];
typedef double y_coord[MAX];
typedef double z_coord[MAX];

int main()
{
    x_coord x;
    y_coord y;
    z_coord z;
    int count;
    ifstream in_stream;

    in_stream.open("input-week6-ad-q4-2.txt");
    in_stream.get(x, y, z);
    for (count = 0; count < MAX; count++)
    {
        x[count] = x;
        in_stream.get(x);

        y[count] = y;
        in_stream.get(y);

        z[count] = z;
        in_stream.get(z);
    }
    in_stream.close();

    system("pause");
    return 0;
}

输入文件的布局如下:

Coordinates of many points  
   x        y         z
-0.06325 0.0359793 0.0420873 
-0.06275 0.0360343 0.0425949 
-0.0645 0.0365101 0.0404362 

等。

2 个答案:

答案 0 :(得分:0)

回答问题的第二部分,通常2维空间中点之间的距离称为Euclidean distance

答案 1 :(得分:0)

我们在这里

杀死两只鸟

首先为点创建一个结构:

struct Point3d
{
  double x, y, z;
};

接下来,重载operator>>以读取点值:

struct Point3d
{
  double x, y, z;
  friend std::istream& operator>>(std::istream& input, Point3d& p);
};
std::istream& operator>>(std::istream& input, Point3d& p)
{
  input >> p.x >> p.y >> p.z;
  return input;
}

接下来,使用std::vector创建数据库:
typedef std :: vector Database_Type; Database_Type数据库;

这是输入循环:

std::string text_line;
// Ignore the header lines
std::getline(my_data, text_line);
std::getline(my_data, text_line);
Point3d p;
while (my_data >> p)
{
  database.push_back(p);
}

您可以在结构中插入距离函数:

struct Point3d
{
  //...
  double distance(const Point3d& p) const;
};
double
Point3d::
distance(const Point3d& p) const
{
  const double x_diff_squared = (x - p.x) * (x - p.x);
  const double y_diff_squared = (y - p.y) * (y - p.y);
  const double z_diff_squared = (z - p.z) * (z - p.z);
  return sqrt(x_diff_squared + y_diff_squared + z_diff_squared);
}

上述方法允许您执行以下操作:

const double distance_p1_p2 = database[0].distance(database[1]);

编辑1:独立距离功能
或者,你可以建立一个独立的距离函数:

double Distance(const Point3d& p1, const Point3d& p2)
{
      const double x_diff_squared = (p1.x - p2.x) * (p1.x - p2.x);
      const double y_diff_squared = (p1.y - p2.y) * (p1.y - p2.y);
      const double z_diff_squared = (p1.z - p2.z) * (p1.z - p2.z);
      return sqrt(x_diff_squared + y_diff_squared + z_diff_squared);
}

将其应用为:

const distance_p1_p2 = Distance(database[0], database[1]);