Форум программистов, компьютерный форум CyberForum.ru

Определить процедуру вычисления площади треугольника по координатам его вершин - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 5.00
Shob
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 13
08.11.2010, 21:07     Определить процедуру вычисления площади треугольника по координатам его вершин #1
Даны натуральное число n, действительные числа x1, y1, x2, y2,..., xn, yn. Найти площадь n угольника, вершины которого при некотором последовательным обходе имеют координаты (x1, y1), (x2, y2), ..., (xn, yn). (Определить процедуру вычисления площади треугольника по координатам его вершин).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2010, 21:07     Определить процедуру вычисления площади треугольника по координатам его вершин
Посмотрите здесь:

По координатам трех вершин некоторого треугольника найти его площадь и периметр. C++
Определить вид треугольника по координатам вершин C++
Определить функцию вычисления площади треугольника по трем его сторонами, заданными действительными числами C++
C++ Вычислить периметр и площадь треугольника по заданным координатам его вершин
Разработать методы вычисления длины отрезка по координатам вершин и периметра треугольника по длинам сторон C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.11.2010, 00:55     Определить процедуру вычисления площади треугольника по координатам его вершин #2
N-угольник выпуклый?

Добавлено через 34 минуты
Вроде так - для выпуклых многоугольников. Но особо не тестил...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <cmath>
 
double areaABC(double AB, double AC, double BC)
{
    double p = (AB + AC + BC) / 2;
 
    return sqrt(p * (p - AB) * (p - AC) * (p - BC));
}
 
double lenAB(double x1, double y1, double x2, double y2)
{
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
 
int main()
{
    double *coords[2];
    double area = 0.0;
    int n;
 
    std::cout << "Enter N: ";
    std::cin >> n;
 
    for (int i = 0; i < 2; i++)
        coords[i] = new double [n];
 
    for (int i = 0; i < n; i++)
    {
        std::cout << "Enter x" << i << ": ";
        std::cin >> coords[0][i];
        std::cout << "Enter y" << i << ": ";
        std::cin >> coords[1][i];
    }
 
    for (int i = 1; i < n - 1; i++)
        area += areaABC(lenAB(coords[0][0], coords[1][0], coords[0][i], coords[1][i]),
                        lenAB(coords[0][0], coords[1][0], coords[0][i + 1], coords[1][i + 1]),
                        lenAB(coords[0][i], coords[1][i], coords[0][i + 1], coords[1][i + 1]));
 
    std::cout << std::endl << "Area = " << area << std::endl;
 
    for (int i = 0; i < 2; i++)
        delete [] coords[i];
 
    std::cin.get();
    return 0;
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
09.11.2010, 09:46     Определить процедуру вычисления площади треугольника по координатам его вершин #3
Еще один вариант для выпуклого многоугольника:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <complex>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
typedef double                  T_coord;
typedef std::complex<T_coord>   T_vertice;
typedef std::vector<T_vertice>  T_vertices;
typedef std::vector<T_coord>    T_triangle_areas;
//////////////////////////////////////////////////////////////////////////////////////
T_coord  det(T_vertice  A, T_vertice  B)
{
    return  A.real() * B.imag() - B.real() * A.imag();
}
//////////////////////////////////////////////////////////////////////////////////////
struct  T_get_triangle_area
{
    T_coord  operator() (T_vertice  A, T_vertice  B)
    {
        return  abs(det(A, B)) / 2.0;
    }
};
//////////////////////////////////////////////////////////////////////////////////////
T_coord  get_polygon_area(const T_vertices&  polygon_vertices)
{
    //Находим набор (n - 1) векторов с началом в первой вершине, и концами в каждой
    //из остальных.
    T_vertices  polygon_vectors(polygon_vertices.size() - 1);
 
    std::transform
        (
            polygon_vertices.begin() + 1, polygon_vertices.end(), 
            polygon_vectors.begin(),             
            std::bind2nd(std::minus<T_vertices::value_type>(), polygon_vertices.front())
        );
 
    //Теперь находим площади треугольников, образованных соседними векторами, 
    //и складываем их.  
    return std::inner_product
               (
                   polygon_vectors.begin(), polygon_vectors.end() - 1,
                   polygon_vectors.begin() + 1, 0.0, 
                   std::plus<T_coord>(), T_get_triangle_area()
               );
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int VERTICES_COUNT_MIN = 3;
    int n = 0;
    do
    {
        std::cout << "Введите число вершин многоугольника >= "
                  << VERTICES_COUNT_MIN
                  << ": ";
 
        std::cin >> n;    
    }while(n < VERTICES_COUNT_MIN);
 
    std::cout << "Введите координаты "
              << n
              << " вершин выпуклого многоугольника"
              << std::endl
              << "(в порядке последовательного обхода границы):"
              << std::endl;
 
    T_vertices  polygon_vertices;
    for(int i = 0; i < n; ++i)
    {
        std::cout << std::endl
                  << '\t'
                  << "X"
                  << i + 1
                  << " = ";
 
        T_coord  X = 0;        
        std::cin >> X;        
 
        std::cout << '\t'
                  << "Y"
                  << i + 1
                  << " = ";
 
        T_coord  Y = 0;        
        std::cin >> Y;
 
        polygon_vertices.push_back(T_vertice(X, Y));
    }
 
    std::cout << "Площадь заданного выпуклого "
              << n
              << "-угольника равна: "
              << get_polygon_area(polygon_vertices)
              << std::endl;             
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.11.2010, 10:04     Определить процедуру вычисления площади треугольника по координатам его вершин #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
N-угольник выпуклый?
А есть разница? Какими бы ни был многоугольник, он раскладывается на треугольники, а площадь треугольников уже считается единообразно.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
09.11.2010, 12:17     Определить процедуру вычисления площади треугольника по координатам его вершин #5
Для выпуклого можно еще проще посчитать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//////////////////////////////////////////////////////////////////////////////////////
#include <complex>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
typedef double                  T_coord;
typedef std::complex<T_coord>   T_vertice;
typedef std::vector<T_vertice>  T_vertices;
//////////////////////////////////////////////////////////////////////////////////////
T_coord  det(T_vertice  A, T_vertice  B)
{
    return  A.real() * B.imag() - B.real() * A.imag();
}
//////////////////////////////////////////////////////////////////////////////////////
struct  T_get_triangle_signed_area
{
    T_coord  operator() (T_vertice  A, T_vertice  B)
    {
        return  det(A, B) / 2.0;
    }
};
//////////////////////////////////////////////////////////////////////////////////////
T_coord  get_polygon_area(T_vertices&  polygon_vertices)
{
    //Добавляем в конец вектора polygon_vertices его первый элемент.
    polygon_vertices.push_back(polygon_vertices.front());
    
    //Теперь находим ориентированные площади треугольников, образованных 
    //соседними вершинами (считая их векторами с началом в начале координат), 
    //и складываем их.  
    return abs
        (
            std::inner_product
                (
                    polygon_vertices.begin(), polygon_vertices.end() - 1,
                    polygon_vertices.begin() + 1, 0.0, 
                    std::plus<T_coord>(), T_get_triangle_signed_area()
                )
        );
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int VERTICES_COUNT_MIN = 3;
    int n = 0;
    do
    {
        std::cout << "Введите число вершин многоугольника >= "
                  << VERTICES_COUNT_MIN
                  << ": ";
 
        std::cin >> n;    
    }while(n < VERTICES_COUNT_MIN);
 
    std::cout << "Введите координаты "
              << n
              << " вершин выпуклого многоугольника"
              << std::endl
              << "(в порядке последовательного обхода границы):"
              << std::endl;
 
    T_vertices  polygon_vertices;
    for(int i = 0; i < n; ++i)
    {
        std::cout << std::endl
                  << '\t'
                  << "X"
                  << i + 1
                  << " = ";
 
        T_coord  X = 0;        
        std::cin >> X;        
 
        std::cout << '\t'
                  << "Y"
                  << i + 1
                  << " = ";
 
        T_coord  Y = 0;        
        std::cin >> Y;
 
        polygon_vertices.push_back(T_vertice(X, Y));
    }
 
    std::cout << "Площадь заданного выпуклого "
              << n
              << "-угольника равна: "
              << get_polygon_area(polygon_vertices)
              << std::endl;             
}
Добавлено через 33 минуты
Вообще-то для невыпуклого эта программа тоже годится.
Yandex
Объявления
09.11.2010, 12:17     Определить процедуру вычисления площади треугольника по координатам его вершин
Ответ Создать тему
Опции темы

Текущее время: 12:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru