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

Площадь многоугольника - C++

Восстановить пароль Регистрация
 
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
09.08.2012, 13:24     Площадь многоугольника #1
Необходимо вычислить площади двух многоугольников(ну а в дальнейшем проверить, лежит ли один из них в другом, пока мне это не надо) по известным вершинам. У меня получилось вот это."Это" не работает.Где ошибки? Заранее спасибо

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
float Ploshad(float x[],float y[], const int n);
int main(){
int i,n1,n2;
cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n1;i++){
cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<" ";
cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
x1[n1+1]=x1[1];
y1[n1+1]=y1[1];
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n2;i++){
cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<" ";
cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
x2[n2+1]=x2[1];
y2[n2+1]=y2[1];
float s1,s2;
s1=Ploshad(x1,y1,n1+1);
cout<<"S1="<<s1;
s2=Ploshad(x2,y2,n2+1);
cout<<"S2="<<s2;
return(0);};

float Ploshad(float x[],float y[], const int n){
int min=1,max=1,i;
// находим крайние вершины по оси 0х
for(int i=0;i<=n;i++){
if (x[min]<x[i]) min=i;
if (x[max]>x[1]) max=i;};
float s1=0, s2=0,s=0;
// площадь многоугольника, разбивая на трапеции ( 2 случая)
if (max>min) {
i=min; while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=max; while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
}
else {
i=max; while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=min; while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
s=abs(s1-s2);
return(s);};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 13:24     Площадь многоугольника
Посмотрите здесь:

C++ Найти площадь вогнутого многоугольника
Площадь многоугольника C++
Вычислить площадь многоугольника C++
Программа должна находить площадь произвольного многоугольника C++
найти площадь многоугольника C++
Вычислить площадь многоугольника вершины которого заданы координатами. Исправить ошибки в программе C++
C++ Вычислить площадь простого многоугольника
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
09.08.2012, 13:35     Площадь многоугольника #2
Выделите кусок кода под тэги CPP и отформатируйте с оступами. А так разбираться ну уж очень тяжко.
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
09.08.2012, 13:42  [ТС]     Площадь многоугольника #3
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
float Ploshad(float x[],float y[], const int n);
int main(){
int i,n1,n2;
cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n1;i++){
cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<" ";
cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
x1[n1+1]=x1[1];
y1[n1+1]=y1[1];
// вводим координаты вершин 1 многоугольника
for(i=1;i<=n2;i++){
cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<" ";
cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
x2[n2+1]=x2[1];
y2[n2+1]=y2[1];
float s1,s2;
s1=Ploshad(x1,y1,n1+1);
cout<<"S1="<<s1;
s2=Ploshad(x2,y2,n2+1);
cout<<"S2="<<s2;
return(0);};

float Ploshad(float x[],float y[], const int n){
int min=1,max=1,i;
// находим крайние вершины по оси 0х
for(int i=0;i<=n;i++){
if (x[min]<x[i]) min=i;
if (x[max]>x[1]) max=i;};
float s1=0, s2=0,s=0;
// площадь многоугольника, разбивая на трапеции ( 2 случая)
if (max>min) {
i=min; while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=max; while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
}
else {
i=max; while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=min; while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
i=1; while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
s=abs(s1-s2);
return(s);};
titans2011
294 / 255 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
09.08.2012, 13:46     Площадь многоугольника #4
Первое что могу сказать, строка
C++
1
float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
У вас статический массив а не динамический.
Или делайте так (например)
float x1[2+1]
Или выделяйте динамическую память, решите этот вопрос, посмотрим дальше.
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
09.08.2012, 13:48  [ТС]     Площадь многоугольника #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
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
float Ploshad(float x[],float y[], const int n);
int main(){
  int i,n1,n2;
  cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
  cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
  float x1[n1+1],y1[n1+1],x2[n2+1],y2[n2+1];
  cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
  cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
  // вводим координаты вершин 1 многоугольника
   for(i=1;i<=n1;i++){
       cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<" ";
       cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
  x1[n1+1]=x1[1];
  y1[n1+1]=y1[1];
      // вводим координаты вершин 1 многоугольника
  for(i=1;i<=n2;i++){
     cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<" ";
     cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
  x2[n2+1]=x2[1];
  y2[n2+1]=y2[1];
  float s1,s2;
  s1=Ploshad(x1,y1,n1+1);
  cout<<"S1="<<s1;
  s2=Ploshad(x2,y2,n2+1);
  cout<<"S2="<<s2;
return(0);};
 
float Ploshad(float x[],float y[], const int n){
    int min=1,max=1,i;
    // находим крайние вершины по оси 0х
    for(int i=0;i<=n;i++){
     if (x[min]<x[i]) min=i;
     if (x[max]>x[1]) max=i;};
   float s1=0, s2=0,s=0;
   // площадь многоугольника, разбивая на трапеции ( 2 случая)
  if (max>min) {
     i=min; while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=max; while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=1; while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     }
  else {
     i=max; while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=min; while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
     i=1; while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
  s=abs(s1-s2);
    return(s);};
Добавлено через 1 минуту
обязательно выделять динамический массив?
titans2011
294 / 255 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
09.08.2012, 14:10     Площадь многоугольника #6
На ваше усмотрение. Если вы делаете статический массив, то размер массива должна определять константа. Исходя из этого решайте. что вам лучше.
Это раз, а во вторых, что означает строка ?:
C++
1
2
3
 int i,n1,n2;
  cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1;
  cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
Переменные не проинициализированны, и если вы хотите ввести число, то нужно использовать cin.
Динар19
0 / 0 / 0
Регистрация: 21.07.2012
Сообщений: 13
09.08.2012, 14:28  [ТС]     Площадь многоугольника #7
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
#include<iostream>
#include<cstdlib> 
#include<cmath> 
using namespace std;
float Ploshad(float *x[],float *y[], const int n);
int main(){
    int i,n1,n2;
    cout<<"Vvedite kolichectvo uglov 1 mnogouglnika="<<n1; 
    cout<<"Vvedite kolichectvo uglov 2 mnogouglnika="<<n2;
    float *x1= new float [n1+1];
    float *y1= new float [n1+1];
    float *x2= new float [n2+1];
    float *y2= new float [n2+1];
    cout<<"Vvedite koordinaty vershin 1 mnogouglnika=";
    cout<<"Vvedite koordinaty vershin 2 mnogouglnika=";
    // ââîäèì êîîðäèГ*Г*ГІГ» âåðøèГ* 1 Г¬Г*îãîóãîëüГ*ГЁГЄГ*
    for(i=1;i<=n1;i++){
      cout<<"x1["<<i<<"]="; cin>>x1[i]; cout<<"  ";
      cout<<"y1["<<i<<"]="; cin>>y1[i]; cout<<endl;};
    x1[n1+1]=x1[1];
    y1[n1+1]=y1[1];
      // ââîäèì êîîðäèГ*Г*ГІГ» âåðøèГ* 1 Г¬Г*îãîóãîëüГ*ГЁГЄГ*
    for(i=1;i<=n2;i++){
      cout<<"x2["<<i<<"]="; cin>>x2[i]; cout<<"  ";
      cout<<"y2["<<i<<"]="; cin>>y2[i]; cout<<endl;};
    x2[n2+1]=x2[1];
    y2[n2+1]=y2[1];
    float s1,s2;
    s1=Ploshad(&x1,&y1,n1+1);
    cout<<"S1="<<s1;
    s2=Ploshad(&x2,&y2,n2+1);
    cout<<"S2="<<s2;
    delete []x1;
    delete []x2;
    delete []y1;
    delete []y2;
    return(0);};
 
float Ploshad(float *x[],float *y[], const int n){
 int min=1,max=1,i;
 // Г*Г*õîäèì ГЄГ°Г*Г©Г*ГЁГҐ âåðøèГ*Г» ГЇГ® îñè 0Гµ
 for(int i=0;i<=n;i++){
         if (x[min]<x[i]) min=i;
         if (x[max]>x[1]) max=i;};
 float s1=0, s2=0,s=0;
 // ïëîùГ*äü Г¬Г*îãîóãîëüГ*ГЁГЄГ*,  Г°Г*çáèâГ*Гї Г*Г* ГІГ°Г*ïåöèè ( 2 ñëó÷Г*Гї) 
 if (max>min) {
  i=min;    while(i<max){s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=max;    while(i<n+1){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=1;      while(i<min){s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
 }
 else {
  i=max;     while(i<min) {s1=s1+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=min;     while(i<n+1) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};
  i=1;       while(i<max) {s2=s2+(y[i+1]+y[i])*(x[i+1]-x[i])/2;i++;};};
   s=abs(s1-s2);
 return(s);};
выделил динамический массив, но сейчас выходит ошибка.Что сделано не так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 14:32     Площадь многоугольника
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
titans2011
294 / 255 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
09.08.2012, 14:32     Площадь многоугольника #8
Указатели надо было разыменовывать. Привожу пример для первой ошибки, дальше уже сами исправите:
C++
1
2
3
4
5
6
  i=min;    
  while(i<max)
      {
      s1=s1+(*y[i+1]+*y[i])*(*x[i+1]-*x[i])/2;
      i++;
      };
Yandex
Объявления
09.08.2012, 14:32     Площадь многоугольника
Ответ Создать тему
Опции темы

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