• Предмет: Информатика
  • Автор: crazzzydoc
  • Вопрос задан 11 месяцев назад

Ответы присылать в течении часа. Язык программирования - C++.

Відомо координати вершин чотирикутника. Скласти програму з використанням функції для визначення площі та периметру чотирикутника


fivaproldzh1337: Две стороны всегда параллельны y = 0?
crazzzydoc: Как я понимаю задачу: есть 4 точки четырехугольника; каким-то образом нужно высчитать стороны (длину каждой стороны), а потом высчитывать периметр и площадь. Только я без понятия, как это решать, как эти стороны найти.
fivaproldzh1337: Задача элементарная, если две стороны параллельны y = x. Длины сторон тогда разность координат, периметр, площадь все элементарно. А вот если вершины (0;1), (0.5;1.5), (1.5, 0.5), (1;0), то тут уже думать надо
fivaproldzh1337: Хотя я, видимо, глупый, чотирикутник - это четырехугольник?
fivaproldzh1337: Решаемо, сейчас решу
ragoon: Теорема Пифагора спасёт отца русской демократии:
L2 = (x2-x1)2+(y2-y1)2 - разницы соответствующих координат возвести в квадрат и сложить - получим квадрат расстояния между точками.
fivaproldzh1337: Более мужское решение было бы через ориентированную площадь треугольника относительно начала координат. Площадь четырехугольника будет равна половине суммы площадей всех ориентированных треугольников через начало координат и двух точек, задающих ребро четырехугольника. Доказательство оставим читателю.

Ответы

Ответ дал: igorShap
1

/*Решение с помощью обобщения формула Брахмагупты для произвольного четырехугольника. Функция perimeter(double x[], double y[]) возвращает значение периметра, функция area(double x[], double y[]) возвращает значение площади, пример использования и реализация приведены ниже. */

#include <iostream>

#include <math.h>

double perimeter(double x[], double y[]);

double area(double x[], double y[]);

int main()

{

   double x[4], y[4];

   std::cout << "Quadrangle ABCD\n";

   for (auto i = 0; i < 4; i++)

   {

       std::cout << "Input coordinates of point " << char(i + 'A') << ": ";

       std::cin >> x[i] >> y[i];

   }

   std::cout << perimeter(x, y) << " " << area(x, y);

   

   return 0;

}

double perimeter(double x[], double y[])

{

   double a[4], p = 0;

   for (auto i = 0; i < 4; i++)

   {

       a[i] = sqrt((x[i]-x[(i + 1) % 4]) * (x[i]-x[(i + 1) % 4]) + (y[i]-y[(i + 1) % 4]) * (y[i]-y[(i + 1) % 4]));

       p += a[i];

   }

   return p;

}

double area(double x[], double y[])

{

   double a[4], p = 0, s = 1, d[2];

   for (auto i = 0; i < 4; i++)

   {

       a[i] = sqrt((x[i]-x[(i + 1) % 4]) * (x[i]-x[(i + 1) % 4]) + (y[i]-y[(i + 1) % 4]) * (y[i]-y[(i + 1) % 4]));

       p += a[i];

   }

   for (auto i = 0; i < 4; i++)

   {

       s *= (p / 2- a[i]);

   }

   for (auto i = 0; i < 2; i++)

   {

       d[i] = sqrt((x[i]-x[i + 2]) * (x[i]-x[i + 2]) + (y[i]-y[i + 2]) * (y[i]-y[i + 2]));

   }

   s -= (a[0] * a[2] + a[1] * a[3] + d[0] * d[1]) * (a[0] * a[2] + a[1] * a[3] - d[0] * d[1]) / 4;

   s = sqrt(s);

   return s;

}

Вас заинтересует