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

класс фигур - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
28.05.2011, 20:21     класс фигур #1
Доброго времени суток . Снова нужна помощь . Задание такое : создать абстрактный класс фигур и сделать 2 наследника (класс треугольников и прямоугольников) . Методы : нахождение площади фигуры , сравнение по площади , перемещение на заданный вектор , определение пересечения фигур и отношение включения друг в друга . В общем то прога написана , все работает , но вот не знаю , как определить включение . Если кто-то знает , подскажите плиз . Вот код :
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <fstream>
#include <math.h>
 
const double eps=0.0001;
 
using namespace std;
 
char bufRus[256];
char* Rus(char* mes)
{
 AnsiToOem(mes, bufRus);
 return bufRus;
}
 
struct point
{
       float x;
       float y;
};
 
class Figure
{
      protected:
      point* a;
      int n;
      Figure(void) {n=0;};
      Figure(const int &k) {n=k; a=new point [n]; for(int i=0;i<n;i++) {a[i].x=0; a[i].y=0;}};
      public:
      virtual float sqr(void) = 0;
      void print();
      void move();
      point getpoint(int);
      virtual void read()=0;
      ~Figure() {delete []a; n=0;};
};
class Triangle : public Figure
{
      public:
      Triangle(void):Figure(3) {};
      void read();
      float sqr();  
};
class Rect : public Figure
{
      public:
      Rect(void):Figure(4) {};
      void read();
      float sqr();      
};
 
 
 
//==================================================
 
 
 
bool prov(point p0,point p1,point p2,point p3);
bool pers(Figure* ob1,Figure* ob2);
int menu();
 
 
 
//==================================================
 
//==================================================
 
 
 
int main()
{
      Figure *f1,*f2,*f3,*f4,*f5,*f6;
      f1=new Triangle;
      f2=new Rect;
      f3=new Triangle;
      f4=new Rect;
      f5=new Triangle;
      f6=new Rect;     
                       //  нечетные фигуры - треугольники , четные - прямоугольники ;
                       // для единичных ("унарных") операций используются фигуры под номерами 5 и 6 (т.е вычисление площади,вывод на экран и т.д) ;
                       // для бинарных(например , сравнение по площади) операций ипользуются фигуры 1,3 и 2,4 
 
 
      while (true)
      {
      switch(menu())
       {
        case 1: cout<<Rus("Введите координаты вершин треугольника")<<endl; f5->read(); cout<<Rus("Данные приняты")<<endl; break;
        case 2: cout<<Rus("Введите координаты вершин прямоугольника")<<endl; f6->read(); cout<<Rus("Данные приняты")<<endl; break;
        case 3: cout<<"S="<<f5->sqr()<<endl; break;
        case 4: cout<<"S="<<f6->sqr()<<endl; break;
        case 5: cout<<Rus("Ввод первого треугольника")<<endl;f1->read();
                cout<<Rus("Ввод второго треугольника")<<endl;f3->read();
                if((f1->sqr())>(f3->sqr())) cout<<"S1 > S2"<<endl;
                if((f1->sqr())<(f3->sqr())) cout<<"S1 < S2"<<endl;
                if((f1->sqr())==(f3->sqr()))cout<<"S1=S2"<<endl;
                break;
        case 6: cout<<Rus("Ввод первого прямоугольника")<<endl;f2->read();
                cout<<Rus("Ввод второго прямоугольника")<<endl;f4->read();
                if((f2->sqr())>(f4->sqr())) cout<<"S1 > S2"<<endl;
                if((f2->sqr())<(f4->sqr())) cout<<"S1 < S2"<<endl;
                if((f2->sqr())==(f4->sqr()))cout<<"S1=S2"<<endl;
                break;
        case 7: if(pers(f1,f2)) {cout<<Rus("Фигуры пересекаются")<<endl;} else {cout<<Rus("Фигуры не пересекаются")<<endl;} break;
        case 8: f5->move(); cout<<Rus("Данные приняты")<<endl; break;
        case 9: f6->move(); cout<<Rus("Данные приняты")<<endl; break;
        case 10: f5->print(); cout<<Rus("Данные приняты")<<endl; break;
        case 11: f6->print(); cout<<Rus("Данные приняты")<<endl; break;
        case 12:  f1->~Figure(); f2->~Figure();f3->~Figure();f4->~Figure();f5->~Figure();f6->~Figure();return 0; break;
        default: cout<<(Rus("Ошибка ввода!"))<<endl; break;     
       } 
    }
      
}
//Triangle
float Triangle::sqr()
{
    point A,B,C;
     double p,s;
     A.x=a[0].x; A.y=a[0].y;
     B.x=a[1].x; B.y=a[1].y;
     C.x=a[2].x; C.y=a[2].y;
 
     double a=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
     double b=sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y));
     double c=sqrt((A.x-C.x)*(A.x-C.x)+(A.y-C.y)*(A.y-C.y));
      
     p=(a+b+c)/2;
 
      s=sqrt(p*(p-a)*(p-b)*(p-c));
      return s;
 
}
void Triangle::read()
{
     for(int i=0;i<3;i++)
      cin>>a[i].x>>a[i].y;
}
//Rectanle
float Rect::sqr()
{
    point A,B,C,D;
      double s;
    A.x=a[0].x; A.y=a[0].y;
     B.x=a[1].x; B.y=a[1].y;
    C.x=a[2].x; C.y=a[2].y;
    D.x=a[3].x; D.y=a[3].y;
 
    double a=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
     double b=sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y));
     double c=sqrt((D.x-C.x)*(D.x-C.x)+(D.y-C.y)*(D.y-C.y));
     double d=sqrt((A.x-D.x)*(A.x-D.x)+(A.y-D.y)*(A.y-D.y));
      
    s=a*b;      
      return s;
      
 
}
void Rect::read()
{
     for(int i=0;i<4;i++)
      cin>>a[i].x>>a[i].y;
}
//Figure
void Figure::print()
{
     if(n==4) {
              cout<<Rus("Прямоугольник с  вершинами:")<<endl<<a[0].x<<";"<<a[0].y<<endl<<a[1].x<<";"<<a[1].y<<endl<<a[2].x<<";"<<a[2].y<<endl<<a[3].x<<";"<<a[3].y<<endl;
              }
     if(n==3) {
              cout<<Rus("Треугольник с вершинами:")<<endl<<a[0].x<<";"<<a[0].y<<endl<<a[1].x<<";"<<a[1].y<<endl<<a[2].x<<";"<<a[2].y<<endl;
              }
     if(n>4) {
                        cout<<Rus("Многоугольник с вершинами:")<<endl;
                        for(int i=0;i<n;i++)
                        {
                                cout<<a[i].x<<";"<<a[i].y<<endl;
                        }
                        }
}
void Figure::move()
{
     point tmp;
     cout<<Rus("Введите вектор переноса:")<<endl;
     cin>>tmp.x>>tmp.y;
     for(int i=0;i<n;i++)
     {
     a[i].x+=tmp.x;
     a[i].y+=tmp.y;
     }
     cout<<Rus("Перенос выполнен")<<endl;
} 
point Figure::getpoint(int tmp)
{
      point temp;
      temp.x=a[tmp].x;
      temp.y=a[tmp].y;
      return temp;
}
//=====================================================
bool prov(point p0,point p1,point p2,point p3)
{
     float a1,a2,b1,b2,c1,c2,x,y;
     a1=p1.x-p0.x;
     a2=p1.y-p0.y;
     b1=p2.x-p3.x;
     b2=p2.y-p3.y;
     c1=p2.x-p0.x;
     c2=p2.y-p0.y;
     if(fabs(a1*b2-b1*a2)<eps) return false;
     else
     {
         x=(c1*b2-c2*b1)/(a1*b2-a2*b1);
         y=(a1*c1-a2*c1)/(b2*a1-b1*a2);         
     }
     if (((x+eps)>0)&&((x-eps)<1)&&((y+eps)>0)&&((y-eps)<1)) return true;
     else return false;
}
bool pers(Figure* ob1,Figure* ob2)
{
     bool tmp=false;
     int m,l;
     point tr[3],kv[4];
     for(int i=0;i<3;i++)
     tr[i]=ob1->getpoint(i);
     kv[0]=ob1->getpoint(0);
     kv[2]=ob1->getpoint(1);
     kv[1].x=kv[0].x;
     kv[1].y=kv[2].y;
     kv[3].x=kv[2].x;
     kv[3].y=kv[0].y;
     for(/*int*/ i=0;i<3;i++)  //стояло  незнаю зачем.. компилятор ругался
      for(int j=0;j<4;j++)
      {
              if (i=2) m=0; else m=i+1;
              if (j=3) l=0; else l=j+1;
              if (prov(tr[i],tr[m],kv[j],kv[l])) {tmp=true; break;}
      }
     return tmp;
}
 
int menu()
{
     char buf[10];
     int option;
     do
     {
     system("pause");
     system("cls");
     cout<<Rus("1 - Ввести координаты вершин треугольника.")<<endl;
     cout<<Rus("2 - Ввести координаты вершин прямоугольника.")<<endl;
     cout<<Rus("3 - Вывести площадь треугольника.")<<endl;
     cout<<Rus("4 - Вывести площадь прямоугольника.")<<endl;
     cout<<Rus("5 - Сравнить 2 треугольника по площади.")<<endl;
     cout<<Rus("6 - Сравнить 2 прямоугольника по площади.")<<endl;
     cout<<Rus("7 - Проверить на пересечения.")<<endl;
     cout<<Rus("8 - Перенести треугольник на заданный вектор.")<<endl;
     cout<<Rus("9 - Перенести прямоугольник на заданный вектор.")<<endl;
     cout<<Rus("10 - Вывести треугольник на экран.")<<endl;
     cout<<Rus("11 - Вывести прямоугольник на экран.")<<endl;
     cout<<Rus("12 - Выход.")<<endl;
     cin>>buf;
     option = atoi(buf);
     }
     while(!option);
     return option; 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.05.2011, 23:06     класс фигур #2
Плохо, что у тебя нет комментов. Как ты определяешь пересечение фигур? Расскажи алгоритм.

Добавлено через 1 час 23 минуты
А вообще так: я не разбирался с алгоритмом пересечения фигур, но похоже он такой: проверяются все вершины треугольника на вхождение в прямоуголник, если хотя бы одна входит, есть пересечение.

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

Так, а тебе для вхождения нужно делать то же самое но ДЛЯ ВСЕХ ВЕРШИН.
То есть проверяешь ТРИ ВЕРШИНЫ треугольника на вхождение в прямоугольник. Если входят- есть включение. Если нет- проверяешь ВСЕ ЧЕТЫРЕ вершины прямоугольника на вхождение в треугольник, если входят- есть включение.

В противном случае включения нет.
++++++++++++++++++++++++++++++++++++++++++++++++
Фишка в том, что алгоритм пересечения у тебя неправильный.
Попробуй треугольник с координатами: 1 2 3 4 5 7 и прямоугольник: 0 0 0 5 6 5 6 0
Увидишь, что пересечения нет.
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
29.05.2011, 18:31  [ТС]     класс фигур #3
а как проверить вхождение точки в треугольник / прямоугольник ?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
29.05.2011, 19:46     класс фигур #4
Отдельная тема, тут не раз обсуждалась уже, поищи. Несколько дней назад видел что-то вроде "принадлежит ли точка плоскости"
Yandex
Объявления
29.05.2011, 19:46     класс фигур
Ответ Создать тему
Опции темы

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