如何从文本文件中读取特殊格式的坐标以计算它们之间的距离?

时间:2019-04-09 13:12:49

标签: c++ string file format maps

我的初始程序被设计为从用户那里获取几何对象的类型,然后获取每条线的坐标以计算形状的面积。它有一个问题,就是每当我要求用户输入构成一条线的两个坐标时,第二个坐标将再次重复,作为下一行的第一个坐标。

示例: 他将输入的第一行0 0 0 1(代表x1 y1 x2 y2) 第二行输入为0 1 1 0(x2 y2 x3 y3)

您可以看到再次重复了0 1,这在程序的第一阶段不是问题。

第二阶段,当我尝试升级程序时,我开始从以下格式的文件中获取输入:矩形,(42,25),(68,25),(68,70),(42,70)< / p>

我可以使用

单独读取每个坐标
fscanf(file, "(%lf,%lf)", &X, &Y);

但是我该如何再次获取第二个坐标,并像上面示例中所解释的那样,在下一个输入中重复它。

旧类方法

Point::Point(double x, double y)
{
    X = x;
    Y = y;
} 

Point::Point()
{
    cout << "Point constructor called! enter the x and y co-ordinates" << endl;
    cin >> X >> Y;


    //this is what I want to modify 
}

double operator-(const Point& Start, const Point& End)
{
    // returns the distance between two points

    return sqrt(pow((End.X - Start.X), 2.0) + pow((End.Y - Start.Y), 2.0));
}

1 个答案:

答案 0 :(得分:0)

恕我直言,您应该重载operator>>才能读取坐标:

struct Coordinate
{
  double x;
  double y;
  friend std::istream& operator>>(std::istream& input, Coordinate& co);
};

std::istream& operator>>(std::istream& input, Coordinate& co)
{
    char c;
    input >> c; '('
    input >> co.x;
    input >> c; ','
    input >> co.y;
    input >> c; ')'
    return input;
}

接下来,您可以将坐标读入到容器中

std::vector<Coordinate> points;
Coordinate p;
while (input_file >> p)
{
    points.push_back(p);
    char c;
    input_file >> c;
}

您可以通过添加其他方法来扩展坐标结构:

struct Coordinate
{
    //...
    // Calculate y1 - this
    double absolute_distance(const Coordinate& y1) const;
};

double
Coordinate ::
absolute_distance(const Coordinate& y1) const
{
  const double x_diff(y1.x - x);
  const double y_diff(y1.y - y);
  const double x_diff_squared(x_diff * x_diff);
  const double y_diff_squared(y_diff * y_diff);
  return abs(sqrt(x_diff_squared + y_diff_squared));
}

这将允许您计算两个坐标之间的距离:

double distance = points[1].absolute_distance(points[0]);

按照这种方法,您应该能够计算出4个坐标的面积。