| imho.ws |
![]() |
|
|
|
# 1 |
|
Newbie
Регистрация: 16.06.2005
Сообщения: 38
![]() |
Классы в Си++
В общем получил задачу по информатике:
Не очень понятно как определить центр тяжести многоугольника, как повернуть многоугольник. И что значит "псевдографического рисунка"? И вообще как проще всего это написать, в смысле алгоритма? 1.Разработать класс "многоугольник" в соответствии со следующим заданием: Состояние класса- Фигура определяется количеством вершин и массивом координат вершин на плоскости(типа float). Для описания вершины целесообразно использовать структуру. Память под массив вершин выделяется статически,во время компиляции,и задается массивом фиксированного предельного размера. Протокол класса- Определяет возможности создания и инициализации экземпляров класса и правила их использования(методы класса). Предусмотреть следующие возможности: -пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию. -создание экземпляров класса с инициализацией значением единственной вершины("точка"). -создание экземпляров класса с инициализацией количеством вершин и массивом координат вершин. -ввод экземпляров класса из входного потока и вывод ((*) псевдографического рисунка) в выходной поток(с помощью перегруженных операторов >> и << ). -определение "центра тяжести" многоугольника. -добавление вершины многоугольника(с помощью перегруженного оператора +=). -получение координат вершины многоугольника,заданной ее номером(с помощью перегруженного оператора []). -выполнение операции поворота многоугольника относительно заданной точки на определенный угол,кратный 90 градусам,против часовой стрелки((*) с помощью перегруженного оператора ()). -перемещение многоугольника((*)с помощью перегруженного оператора()) в направлении и на величину вектора,построенного из точки {0,0} в заданную. 2.Проектирование класса рекомендуется начать с представления состояния класса,учитывающего заданные операции,а затем реализации конструкторов и перегруженного оператора вывода. Для отладки и исчерпывающего тестирования других методов разработанного класса реализовать диалоговую программу,которая позволяет вводить параметры,отлаживаемых методов. 3.Повторить разработку класса при условии,что память под массив структур необходимой длины выделяется динамически,во время выполнения программы(с помощью оператора new;память задается указателем на структуру в состоянии класса). Дополнить интерфейс класса следующими возможностями: -создание экземпляра класса с его инициализацией другим экземпляром класса(копирующий конструктор). -переопределение экземпляра класса(с помощью перегруженного оператора присваивания). 4.Написать прикладную программу,использующую разработанныц класс. Примечание:пункты задания,отмеченные (*),являются дополнительными. Реализация в среде Microsoft Visual C++ 6.0. |
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 11.10.2005
Сообщения: 63
![]() |
1. "Центр тяжести"
Вычисляется из расчёта одинаковых грузов в вершинах. С точки зрения рассчёта - координаты точки, являющиеся средним арифметическим по каждой. 2. Как повернуть относительно точки O(x0,y0). т.е. для каждой точки Ai(xi,yi) вычисляются новые координаты для поворота на 90 градусов xi=x0+(yi-y0); yi=y0+(x0-xi); 180 градусов xi=x0+(x0-xi); yi=y0+(y0-yi); 270 градусов xi=x0-(yi-y0); yi=y0-(x0-xi); 3. Псевдографический рисунок Насколько я понимаю в вершинах нарисовать квадратики, форматирую строки вывода. Ну и возможно ещё координатную сетку нарисовать. Алгоритм: выбираешь минимум по Х-су, потом сортируешь точки по уменьшению координаты по У-ку. Ну и, проходя по отсортированному списку, соответствующим образом форматируешь строки и выводишь на экран. Или тебе нужна полная реализация класса?
|
|
|
|
|
# 4 |
|
Newbie
Регистрация: 16.06.2005
Сообщения: 38
![]() |
_Lynx_, кстати формулы для поворота немного не верны, они поворачивают по часовой стрелки, а нужно против, т.е. поменять местами 90 и 270...
Еще, я был бы очень благодарен, если ты сказал бы алгоритм как осуществить перемещение многоугольника в направлении и на величину вектора,построенного из точки {0,0} в заданную. |
|
|
|
|
# 5 |
|
Guest
Сообщения: n/a
|
Не уверен, если я правильно понял на счет вектора. Но по ходу елементарно, тебе просто нужно посчитат разность координат х и y вектора и прибавить соответствуюшие значения к координатам вершин многоугольника!
А псевдографика - ето походу рисунок не в графическом режиме, а с исползованием возможностей АСКИ таблицы! Последний раз редактировалось Shama_in_da_for; 27.10.2005 в 07:28. |
|
|
# 6 | |
|
Junior Member
Регистрация: 11.10.2005
Сообщения: 63
![]() |
Про стрелку проглядел
![]() Пусть у тебя вектор {x0,y0}. Тогда для каждой точки многоугольника xi+=x0; yi+=y0; Цитата:
Вопрос только в том надо ли рисовать стороны и делать заливку. В принципе стороны рисовать не так уж сложно, главное подобрать соответствующие значки. |
|
|
|
|
|
# 7 |
|
Newbie
Регистрация: 16.06.2005
Сообщения: 38
![]() |
Всем спасибо. Класс написал, вот код, если кому интересно:
Код:
#include <iostream.h>
const SIZE = 100;
struct Item {
float x;
float y;
int n;
};
class O {
private:
Item a[SIZE];
void create(Item &x) {x.n = 0;}
public:
O();
O(float[],float[],int);
O operator+=(Item);
void show(int) ;
void center(int);
void povorot(int, int, float, float);
void peremeshenie(int, float, float);
void operator [] (int);
friend ostream& operator<<(ostream&, O&);
friend istream& operator>>(istream&, O&);
};
O::O() {
for (int i = 0; i < SIZE; i++) create(a[i]);
}
O::O(float x1[], float y1[], int num) {
for (int i = 0; i < num; i++){
a[i].x=x1[i];
a[i].y=y1[i];
a[i].n=num;
}
}
void O::show(int num){
cout<<endl<<"Mnogougolnik s vershinami:\n";
for (int i=0; i<num; i++){
cout<<"("<<a[i].x<<","<<a[i].y<<"), ";
}
}
void O::center(int num){
cout<<endl<<"Mnogougolnik s koordinatami centra tyazesti:\n";
float x=0,y=0;
for (int i=0; i<num; i++){
x=x+a[i].x;
y=y+a[i].y;
}
x=x/num;
y=y/num;
cout<<"("<<x<<","<<y<<")"<<endl;
}
void O::povorot(int num, int ugol, float x, float y){
float q,w;
for (int i=0;i<num;i++){
if (ugol==90){
q=x+(y-a[i].y);
w=y+(a[i].x-x);
cout<<"("<<q<<","<<w<<") ";
}
if (ugol==180){
q=x+(x-a[i].x);
w=y+(y-a[i].y);
cout<<"("<<q<<","<<w<<") ";
}
if (ugol==270){
q=x+(a[i].y-y);
w=y+(x-a[i].x);
cout<<"("<<q<<","<<w<<") ";
}
}
}
void O::peremeshenie(int num, float x, float y){
for (int i=0; i<num; i++)
//float q=a[i].x+x, w=
cout<<"("<<a[i].x+x<<","<<a[i].y+y<<") ";
}
void O::operator [] (int num){
cout<<"("<<a[num].x<<","<<a[num].y<<") ";
}
O O::operator +=(Item item){
for (int i=0; i<SIZE; i++){
if (a[i].n==-858993460||a[i].n==0) {
a[i]=item;
break;
}
}
return *this;
}
ostream& operator<<(ostream& os, O& P){
for (int i=0; i<SIZE; i++){
if (P.a[i].n>0){
os<<"("<<P.a[i].x<<","<<P.a[i].y<<"), ";}
}
return os;
}
istream& operator>>(istream& is, O& P){
Item item;
int kol=0;
cout<<"Please, enter number of corners:\n"<<"->";
cin>>kol;
cout<<"Please, enter a kordinati\n";
for (int i=0;i<kol;i++){
cout<<"Enter a "<<i<<" koord x\n"<<"->";
cin>>item.x;
cout<<"Enter a "<<i<<" koord y\n"<<"->";
cin>>item.y;
item.n=kol;
P+=item;
}
cout<<"New mnogoug sformirovan\n";
return is;
}
void main() {
int choice, choise2=-1;
O P;
Item item;
int kol=0;
float xx[SIZE], yy[SIZE], povorot_x, povorot_y, rv_x,rv_y;
int i=0;
do {
cout<<"\nPlease, select a choise"<<endl;
cout << "1.New"<<endl<<"2.Add a mnogoug"<<endl<<"3.Vivod koordinat\n"<<"4.Opredelenie centra tyazesti\n"<<"5.Povorot figuri na ugol kratnii 90\n"<<"6.Peremeshenie\n"<<"7.Vivod koordinat vershin\n"<<"8.Dobavlenie tochki (+=)\n";
cout<<"9.Exit\n";
cin >> choice;
cout << endl;
switch (choice) {
case 1:
P = O();
cout<<"New pustoy mnogoug is created"<<endl;
break;
//////////////////
case 2:
cin>>P;
break;
/////////////////////////
case 3:
//P.show(kol);
cout<<P;
break;
////////////////////////
case 4:
P.center(kol);
break;
////////////////////////
case 5:
cout<<"Vvedite koordinati tochki, otnositelno kotoroy nuzno osushestvit povorot\n";
cout<<"X=";
cin>>povorot_x;
cout<<"Y=";
cin>>povorot_y;
cout<<"Viberite ugol:\n1.90 gradusov\n2.180 gradusov\n3.270 gradusov\n";
cin>>choise2;
switch (choise2) {
case 1:
cout<<"1.90 gradusov"<<endl;
P.povorot(kol,90,povorot_x,povorot_y);
break;
////////
case 2:
cout<<"2.180 gradusov"<<endl;
P.povorot(kol,180,povorot_x,povorot_y);
break;
////////
case 3:
cout<<"3.270 gradusov"<<endl;
P.povorot(kol,270,povorot_x,povorot_y);
break;
////////
}
break;
/////////////////////////
case 6:
cout<<"Peremeshenie na radius-vector\nVvedite koordinati radius-vectora:\nX=";
cin>>rv_x;
cout<<"Y=";
cin>>rv_y;
P.peremeshenie(kol,rv_x,rv_y);
break;
////////////////////////
case 7:
cout<<"Vvedite nomer vershini\n->";
cin>>rv_x;
P[rv_x];
break;
////////////////////////
case 8:
cout<<"Please, enter a kordinati\n X=";
cin>>item.x;
cout<<"Y=";
cin>>item.y;
item.n=1;
P+=item;
kol++;
break;
}
}
while (choice != 9);
}
|
|
|