2015-05-07 2 views
0

Как найти область квадрата или прямоугольника, если пользователь ввел некоторые точные точки, чтобы сформировать квадрат или прямоугольник.C++ как найти площадь квадрата или прямоугольника с вектором координат

Мне нужно вычислить площадь внутри квадратного класса и класса прямоугольника соответственно.

У меня есть 2 координатных координаты координаты и координаты.

Моя идея в том, что либо x, либо y имеет то же значение, что и строка, и я могу найти расстояние x2, но я не уверен, как реализовать его в коде.

double Square::computeArea() { 

    double area; 

    for (int x = 0; x < coordX.size; x++) { 
     for (int y = 0; y < coordY.size; y++) { 
      if (coordX[x] == coordY[y]) 
      { 
       //.... 
      } 
     } 
    }  
    return area; 
} 

Это, как я заполнить мой вектор с пользовательским вводом

Square Square; 

    for (int i = 1; i <= 4; i++) { 

     cout << "Please enter x-coordinate of pt " << i << ": ";  

     cin >> x; 

     Square.setXCoordinate(x); 

     cout << "Please enter y-coordinate of pt " << i << ": ";  

     cin >> y;  

     Square.setYCoordinate(y); 

    } 

это моя мутатор функция в моем классе. Площадь унаследует от ShapeTwoD

void ShapeTwoD::setXCoordinate(int x) { 
    coordX.push_back(x); 
} 

void ShapeTwoD::setYCoordinate(int y) { 
    coordY.push_back(y); 
} 

ответ

2

Если предположить, что ваши координаты являются чем-то вроде

// 3-----------2 
// |   | 
// |   | 
// 0-----------1 

Тогда вы могли бы сделать

#include <cmath> 
double distance(double x1, double x2, double y1, double y2) 
{ 
    return std::sqrt(std::pow(x2 - x1, 2) + std::pow(y2 - y1, 2)); 
} 

double Square::computeArea() const 
{ 
    double length = distance(coordX[0], coordX[1], coordY[0], coordY[1]); 
    double width = distance(coordX[0], coordX[3], coordY[0], coordY[3]); 
    return length * width; 
} 

Это позволяет прямоугольнику быть в любой произвольной ориентации, вместо оси х выровнены. Вам просто нужно поддерживать соглашение об индексах углов, как в моей диаграмме.

+1

Вы также можете использовать ['std :: hypot (x2 - x1, y2 - y1)'] (http://en.cppreference.com/w/cpp/numeric/math/hypot), чтобы непосредственно вычислить расстояние , – vsoftco

+0

, но я использую вектор, как только я скомпилирую его с некоторой ошибкой итератора. Я не думаю, что могу просто использовать позицию [0]? –

+0

@TommyYap вы можете отредактировать свое сообщение, чтобы показать, как вы заполняете 'coordX' и' coordY'? – CoryKramer

4

Нет необходимости в квадратном корне. Возьмите два края из одной вершины, поверните на 90 °, возьмите точечный продукт.

double dx1 = coordX[3] - coordX[0]; 
double dy1 = coordY[3] - coordY[0]; 
double dx2 = coordX[1] - coordX[0]; 
double dy2 = coordY[1] - coordY[0]; 
double area = abs(dx1*dy2 - dy1*dx2) 

В качестве бонуса это вычислит правильную область для всех параллелограммов, а не только прямоугольников.

Это предполагает, что точки вводятся по часовой стрелке или по часовой стрелке. Если это не так, выясните, какая точка имеет наибольшее расстояние до точки [0], затем отбросьте ее и используйте два других вместо 1 и 3 выше.

+0

, но что, если мы не знаем, являются ли точки ребрами –

+0

Я предполагал, что 'coordX' и' coordY' являются векторами размера 4, содержащими координаты x и y вершин прямоугольника. Если это не так, пожалуйста, уточните свой вопрос. – Henrik

+1

Это крест продукта. Или, точнее, величина Z-составляющей поперечного произведения двух векторов на плоскости X-Y. – Lingxi