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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
#1

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

28.05.2011, 20:21. Просмотров 1388. Ответов 3
Метки нет (Все метки)

Доброго времени суток . Снова нужна помощь . Задание такое : создать абстрактный класс фигур и сделать 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; 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2011, 20:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос класс фигур (C++):

Класс двухмерных фигур в c++ - C++
Здравствуйте! У меня такая задача: Разработать базовый класс фигуры и три производных класса – линии, прямоугольника и окружности....

Создать абстрактный класс фигур и сделать 2 наследника (треугольник, прямоугольник) - C++
Доброго времени суток. Задание такое : создать абстрактный класс фигур и сделать 2 наследника( треугольник, прямоугольник) и сделать...

Создать абстрактный базовый класс объектов на декартовой плоскости CShape и разработать иерархию классов конкретных фигур - C++
Создать абстрактный базовый класс объектов на декартовой плоскости CShape (фигура). Спроектировать и реализовать иерархию классов...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Отдельно класс данных, класс формул и главный класс - C++
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

3
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
28.05.2011, 23:06 #2
Плохо, что у тебя нет комментов. Как ты определяешь пересечение фигур? Расскажи алгоритм.

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

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

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

В противном случае включения нет.
++++++++++++++++++++++++++++++++++++++++++++++++
Фишка в том, что алгоритм пересечения у тебя неправильный.
Попробуй треугольник с координатами: 1 2 3 4 5 7 и прямоугольник: 0 0 0 5 6 5 6 0
Увидишь, что пересечения нет.
0
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
29.05.2011, 18:31  [ТС] #3
а как проверить вхождение точки в треугольник / прямоугольник ?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
29.05.2011, 19:46 #4
Отдельная тема, тут не раз обсуждалась уже, поищи. Несколько дней назад видел что-то вроде "принадлежит ли точка плоскости"
0
29.05.2011, 19:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2011, 19:46
Привет! Вот еще темы с ответами:

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

Класс, производный класс, паблик-класс - C++
Задание: Создать класс колесо, которое имеет радиус. Определить конструкторы и метод доступа. Создать класс машин, содержащий класс колесо....

Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка - C++
Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки...

Пересечение фигур - C++
Даны две фигуры: Окружность с центром в точке (x0,y0) и радиусом r, и пятиугольник заданный координатами вершин. Как можно определить факт...


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

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

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