Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 233
#1

Программа должна находить площадь произвольного многоугольника - C++

08.01.2014, 02:19. Просмотров 1900. Ответов 40
Метки нет (Все метки)

Здравствуйте. Моя программа должна находит площадь произвольного многоугольника, с предварительной проверкой, можно ли построить его вообще. Если вводит количество сторон = 4, то пишет, что построить нельзя и соответственно ничего не считает, хотя координаты правильные. А для 5,6,7,8 и т.д. сторон вообще ничего не выдает, на вводе координат ее работа заканчивается. Если не сложно, помогите, пожалуйста, найти ошибку. Я думаю она в основной функции Void main(), там я вызываю подфункцию Proverka и проверяю ее значение, т.е. все ее вызову должны быть равны 1 для подсчитки площади, и которая с xy[k]... вызывается несколько раз, может я со скобками напутала? Все подпрограммы я составляла по формулам, должно быть все правильно.
C++ (Qt)
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
100
101
102
103
#include<stdio.h>
#include<math.h>
float** create_xy(int n)
{
float** xy=new float*[n];
for(int i=0;i<n;i++)
xy[i]=new float[2];
return xy;
}
 
 
void Line(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4,float *x,float *y)
{
float A1,A2,B1,B2,C1,C2;
A1=y3-y1;A2=y4-y2;
B1=x1-x3;B2=x2-x4;
C1=x3*y1-x1*y3;
C2=x4*y2-x2*y4;
*x=(B1*C2-B2*C1)/(A1*B2-A2*B1);
*y=(C1*A2-C2*A1)/(A1*B2-A2*B1);
}
 
 
 
int Proverka(float x,float y,float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)
{
float maxx,maxy,minx,miny;
maxx=x1;
maxy=y1;
minx=x1;
miny=y1;
 
if(x2>x1 && x2>x3 && x2>x4)
maxx=x2;
if(x2<x1 && x2<x3 && x2<x4)
minx=x2;
if(x3>x1 && x3>x2 && x3>x4)
maxx=x3;
if(x3<x1 && x3<x2 && x3<x4)
minx=x3;
if(x4>x1 && x4>x3 && x4>x2)
maxx=x4;
if(x4<x1 && x4<x3 && x4<x2)
minx=x4;
if(y2>y1 && y2>y3 && y2>y4)
maxy=y2;
if(y2<y1 && y2<y3 && y2<y4)
miny=y2;
if(y4>y1 && y4>y3 && y4>y2)
maxy=y4;
if(y4<y1 && y4<y3 && y4<y2)
miny=y4;
if(y3>y1 && y3>y2 && y3>y4)
maxy=y3;
if(y3<y1 && y3<y2 && y3<y4)
miny=y3;
 
 
if(x>minx && x<maxx && y>miny && y<maxy)
return 1;
else return 0;
}
 
void massive(float** xy,int n)
{
printf("Vvedite koordinaty vershin:\n");
 
for(int k=0; k<n; k++)
{
   scanf("%f",&xy[k][0]);
   scanf("%f",&xy[k][1]);
 
printf("Koordinats: x[%d] = %5.2f;  y[%d] = %5.2f \n",k+1, xy[k][0], k+1, xy[k][1]);
}
}
void main()
{
float **xy;
int n,k,i;
float S,x,y,S2;
float S1=0;
 
printf("Vvedi kollichestvo vershin = ");
scanf("%d",&n);
 
float** points;
points=create_xy(n);
massive(points,n);
 
for(k=0;k+3<n;k++)
if(Proverka(xy[k][0],xy[k][1],xy[k+1][0],xy[k+1][1],xy[k+2][0],xy[k+2][1],xy[k+3][0],xy[k+3][1],x,y)==1)
{
if(Proverka(xy[n-3][0],xy[n-3][1],xy[n-2][0],xy[n-2][1],xy[n-1][0],xy[n-1][1],xy[0][0],xy[0][1],x,y)==1)
for(i=0;i+1<n;i++)
{
S1=S1+((xy[i][0]-xy[i+1][0])*(xy[i][1]+xy[i+1][1]));
}
S2=S1+(xy[n-1][0]-xy[0][0])*(xy[n-1][1]+xy[0][1]);
S=0.5*abs(S2);
printf("S mnogougolnika = %5.2f",S);
}
else printf("Oshibka v vode koordinats");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2014, 02:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа должна находить площадь произвольного многоугольника (C++):

Вычислить площадь многоугольника с использованием функции,которая определяет площадь по координатам его вершин - C++
Народ помогите пож нужно очень срочно. совсем запутался с этим задание,буду благодарен за помощь. Вычислить площадь многоугольника с...

Пользователь вводит 10 чисел программа должна выдать 2 максимальных(берём от 1 до 10,если выпадает 2 10,то программа должна выдать 2 10,а не 10,9) - C++
#include &lt;iostream&gt; using namespace std; int main () { int number, largest_1, largest_2, counter = 1; cout«&quot;Vvedite 1oe...

Количество точек с целочисленными координатами внутри (не включая границ) произвольного многоугольника - C++
Есть вот такая задача. Координаты вершин подаются в порядке обхода по часовой стрелке, многоугольник может быть и невыпуклым. Решение...

Площадь многоугольника - C++
Найти площадь невыпуклого многоугольника(n-угольник). Входные данные: координаты точек. На output вывести площадь.

Площадь многоугольника - C++
Всем добрый вечер! Есть задача: Заданы координаты n последовательных вершин многоугольника. Определить его площадь. Входные данные...

Площадь многоугольника - C++
Необходимо вычислить площади двух многоугольников(ну а в дальнейшем проверить, лежит ли один из них в другом, пока мне это не надо) по...

40
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.01.2014, 06:50 #31
Цитата Сообщение от -Arabella- Посмотреть сообщение
Я поменяла j на int, все так же работает
А до того, как поменяли, всё компилировалось и работало (но криво)?
Цитата Сообщение от -Arabella- Посмотреть сообщение
и выдает 2 раза Ошибка в воде координат
Что вводите? Пример ввода, при котором два раза выдаёт.
0
Alex5
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,933
26.01.2014, 14:51 #32
Найти площадь треугольника ABC можно, вычислив векторное произведение векторов AB и AC. Оно равно +2*S или -2*S.
Разобьём многоугольник на треугольники - см. рис.
Вычислим векторные произведения A0A1 на A0A2, A0A2 на A0A3, и т.д.
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
#include <stdio.h>
 
struct point
{
    float x, y;
};
 
// n - число сторон, A[] - координаты вершин 
float square_of_polygon( const int n, const point A[] )
{
    if( n <= 0  || A == 0 )
        return 0.0;
 
    typedef point vect;
    vect * diag = 0;
    diag = new vect[n];
    if( ! diag ) 
        return 0.0;
 
    // diag[i] это векторы A0A0, A0A1, A0A2, A0A3, ...
    for( int i=0; i<n; ++i ) 
    {
        diag[i].x = A[i].x - A[0].x;
        diag[i].y = A[i].y - A[0].y;
    }
 
    // вычисление площади 
    float S = 0.0;
    for( int i=2; i<n; ++i ) 
    {
        // площадь параллелограмма, стороны 
        // которого - векторы diag[i], diag[i-1]
        //
        // вычисляем векторное произведение diag[i] и diag[i-1]
        //
        S += diag[i].x * diag[i-1].y  -  diag[i].y * diag[i-1].x ;
    }
    S /= 2.0;
    if( S < 0 ) S = -S;
 
    // освобождаем память 
    delete[] diag;
 
    return S;
}
int main()
{
    point P[] = { { 4, 2 }, { 6, 3 }, { 5, 5 }, { 3, 4 } };
    int n = sizeof( P ) / sizeof( P[0] );
 
    float sq = square_of_polygon( n, P );
    printf( "\n square of polygon :  %10.3f \n", sq );
 
    getchar();
    return 0;
}
0
Миниатюры
Программа должна находить площадь произвольного многоугольника  
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 751
26.01.2014, 15:54 #33
Цитата Сообщение от Alex5 Посмотреть сообщение
Разобьём многоугольник на треугольники - см. рис.
прямоугольник по условию произвольный. по моим представлениям (не выпуклый) http://www.cyberforum.ru/cgi-bin/latex.cgi?\in (произвольные).
а вообще говоря, дорогой ТС, эта задача решается очень лаконично.
пусть vertex[1,...,n,1] - список вершин многоугольника (первую вершину запишем дважды для удобства). тогда общую площадь найдем так:
C++
1
2
3
4
5
6
7
8
9
double area(vertex v1, vertex v2) {
   return (v2.x - v1.x) * (v1.y + v2.y);
}
 
Area = 0;
for(int i=0; i < n; ++i)
   Area += area(vertex[i], vertex[i+1]);
Area /= 2;
Area = abs(Area); (тут лежит ответ)
суть состоит в том, что мы складываем ориентированные площади трапеций. за счет учета знака метод работает для произвольных многоугольников. порисуйте на бумажке - вам станет понятно.
0
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 233
26.01.2014, 22:44  [ТС] #34
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
А до того, как поменяли, всё компилировалось и работало (но криво)?
Да, как и после изменения, так и до, ничего не поменялось при смене j с float на int
Alex5, Спасибо за пример, но я очень плохо разбираюсь в програмировании и мне сложно будет перестроиться с одного на другое, я площадь нахожу по формуле площади многоугольника для любого произвольного многоугольника, выпуклого и невупуклого
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.01.2014, 22:52 #35
Цитата Сообщение от -Arabella- Посмотреть сообщение
Да,
???
Цитата Сообщение от alsav22 Посмотреть сообщение
Что вводите? Пример ввода, при котором два раза выдаёт.
0
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 233
27.01.2014, 00:20  [ТС] #36
alsav22, Вот, я пробую на примере шестиугольника http://www.cyberforum.ru/attachments/358225d1390587749
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.01.2014, 00:42 #37
У меня, при таком вводе (1-й скрин), такой результат.
0
Миниатюры
Программа должна находить площадь произвольного многоугольника   Программа должна находить площадь произвольного многоугольника  
Alex5
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,933
27.01.2014, 13:04 #38
Цитата Сообщение от -Arabella- Посмотреть сообщение
Вот, я пробую на примере шестиугольника http://www.cyberforum.ru/attachments/358225d1390587749
-Arabella-, площадь многоугольника у Вас здесь вычислена правильно.

Что касается сообщения "Oshibka v vode ... ", ошибка на самом деле не в вводе, а в
фунции Proverka, раз правильные данные она расценивает как ошибочные.

Цитата Сообщение от -Arabella- Посмотреть сообщение
Моя программа должна находит площадь произвольного многоугольника, с предварительной проверкой, можно ли построить его вообще
Что значит "можно ли построить его"? Любой многоугольник можно построить

Добавлено через 39 минут
Цитата Сообщение от Alex5 Посмотреть сообщение
ошибка на самом деле не в вводе, а в
фунции Proverka, раз правильные данные она расценивает как ошибочные
Я неверно выразился. Ошибка в структуре функции main()

Добавлено через 6 минут
Вот как выглядит main, если отформатировать код
Цитата Сообщение от -Arabella- Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* фрагмент функции main() */
/* этот код скопирован из #26, добавлено форматирование */
 
    for(j=0;j<n;j++)
        Line(xy[j][0],xy[j][1],xy[j+1][0],xy[j+1][1],xy[j+2][0],xy[j+2][1],xy[j+3][0],xy[j+3][1],&x,&y);
    /* цикл for( j... ) завершается до входа в цикл for( k ... ) Поэтому дальше используются
      значения x, y, вычисленные при j == n-1 */
 
    for(k=0;k+3<n;k++)
 
        if(Proverka(xy[k][0],xy[k][1],xy[k+1][0],xy[k+1][1],xy[k+2][0],xy[k+2][1],xy[k+3][0],xy[k+3][1],x,y)==1)
        {
            if(Proverka(xy[n-3][0],xy[n-3][1],xy[n-2][0],xy[n-2][1],xy[n-1][0],xy[n-1][1],xy[0][0],xy[0][1],x,y)==1)
 
                for(i=0;i+1<n;i++)
                {
                    S1=S1+((xy[i][0]-xy[i+1][0])*(xy[i][1]+xy[i+1][1]));
                }
                S2=S1+(xy[n-1][0]-xy[0][0])*(xy[n-1][1]+xy[0][1]);
                S=0.5*abs(S2);
                printf("S mnogougolnika = %5.2f ",S);
        }
        else printf("Oshibka v vode koordinats");
1
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 233
28.01.2014, 00:40  [ТС] #39
alsav22,
Может это изза того, что у меня старая программа и она не замечает какие-то ошибки?
Alex5,
Цитата Сообщение от Alex5 Посмотреть сообщение
Что значит "можно ли построить его"? Любой многоугольник можно построить
Я как всегда не совсем правильно выразилась Программа проверяет можно ли построить по данным координатам
Цитата Сообщение от Alex5 Посмотреть сообщение
/* цикл for( j... ) завершается до входа в цикл for( k ... ) Поэтому дальше используются
* * * значения x, y, вычисленные при j == n-1 */
Вы имеете в виду, что мне нужно цикл по k засунуть в цикл по j? При такой постановке скобок, у меня вылезает ошибка missplaced else, значит я не так поставила, я думаю, что цикл по k должен заканчиваться после посылке Proverka([k].....), но опять при закрытии скобки после первой Proverka ошибка о else
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  for(j=0;j<n;j++)
      [COLOR="Red"]{[/COLOR]  Line(xy[j][0],xy[j][1],xy[j+1][0],xy[j+1][1],xy[j+2][0],xy[j+2][1],xy[j+3][0],xy[j+3][1],&x,&y);
    
 
 for(k=0;k+3<n;k++)
 
        if(Proverka(xy[k][0],xy[k][1],xy[k+1][0],xy[k+1][1],xy[k+2][0],xy[k+2][1],xy[k+3][0],xy[k+3][1],x,y)==1)
        {
            if(Proverka(xy[n-3][0],xy[n-3][1],xy[n-2][0],xy[n-2][1],xy[n-1][0],xy[n-1][1],xy[0][0],xy[0][1],x,y)==1)
                  
                for(i=0;i+1<n;i++)
                {
                    S1=S1+((xy[i][0]-xy[i+1][0])*(xy[i][1]+xy[i+1][1]));
                }
                S2=S1+(xy[n-1][0]-xy[0][0])*(xy[n-1][1]+xy[0][1]);
                S=0.5*abs(S2);
                printf("S mnogougolnika = %5.2f ",S);
        } [COLOR="Red"]}[/COLOR]
        else printf("Oshibka v vode koordinats");
0
Alex5
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,933
28.01.2014, 11:49 #40
-Arabella-, во всяком случае, площадь Ваша программа вычисляет правильно. Ну а проверка данных должна выполняться перед вычислением площади.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    // ввод данных 
    // ... 
    int n;
    float** xy;
 
    bool b = PolnayaProverka( xy, n ); /* можно все циклы с проверкой поместить в отдельной функции */
 
    if( b )
    {
        // вычисляем площадь 
    }
 
    // вывод результатов 
    // ... 
}
1
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 233
13.02.2014, 22:27  [ТС] #41
Alex5, Я не очень поняла, что значит эта строчка
Цитата Сообщение от Alex5 Посмотреть сообщение
bool b = PolnayaProverka( xy, n )
Цитата Сообщение от Alex5 Посмотреть сообщение
можно все циклы с проверкой поместить в отдельной функции
А можно оставить так, как есть, я не думаю, что знаю, как сделать такую функцию...
0
13.02.2014, 22:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 22:27
Привет! Вот еще темы с ответами:

Площадь выпуклого многоугольника - C++
Доброго времени суток! Собственно, задача звучит как: &quot;Расчет площади выпуклого многоугольника при вводимых координатах вершин&quot;. ...

Вычислить площадь многоугольника - C++
Не могу понять почему VS 2015 всегда показывает площадь равную 0, в то время как dev C++ вычисляет её нормально. ...

Вычислить площадь многоугольника - C++
Задача 33* Выпуклый многоугольник задан координатами своих вершин. Вершины упорядочены. Вычислить площадь многоугольника. ...

Найти площадь многоугольника - C++
найти площадь многоугольника по заданным точкам его вершин(точки, даны по обходу многоугольника по часовой стрелке).


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.