как прочитать специально отформатированные координаты из текстового файла, чтобы вычислить расстояние между ними?

#c #string #file #format #maps

#c #строка #файл #формат #Карты

Вопрос:

Моя первоначальная программа была разработана для определения типа геометрического объекта у пользователя, а затем принимает координаты каждой строки для вычисления площади фигуры. У него была одна проблема, которая заключалась в том, что всякий раз, когда я просил пользователя ввести две координаты, которые образуют строку, вторая координата будет повторяться снова как первая для следующей строки.

пример: в первой строке он должен ввести 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)

Я могу прочитать каждую координату отдельно, используя

 fscanf(file, "(%lf,%lf)", amp;X, amp;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 Pointamp; Start, const Pointamp; End)
{
    // returns the distance between two points

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

Комментарии:

1. Кстати, вы можете рассмотреть возможность использования x * x вместо pow(x, 2) . Обычно умножение выполняется быстрее, поскольку позволяет избежать накладных расходов на вызов функции и возврат.

2. Я рекомендую не использовать ввод-вывод в конструкторе. Вы можете создавать методы для чтения в разных форматах, и вы можете рассмотреть возможность перегрузки operator>> .

3. См . Также списки инициализации , такие как Point(double x, double y) : X(x), Y(y) {} .

4. @ThomasMatthews Спасибо, но можете ли вы предложить решение этой проблемы?

5. @ThomasMatthews моя программа может вычислять площадь при задании каждой координаты дважды, как я могу избежать этого, я действительно не могу найти решение.

Ответ №1:

ИМХО, вы должны перегрузить operator>> чтение в координате:

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

std::istreamamp; operator>>(std::istreamamp; input, Coordinateamp; 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 Coordinateamp; y1) const;
};

double
Coordinate ::
absolute_distance(const Coordinateamp; 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 координатами.