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

Хранение, вывод и изменение графических примитивов - C++

Восстановить пароль Регистрация
 
Vistum
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 9
03.04.2013, 09:03     Хранение, вывод и изменение графических примитивов #1
Здравствуйте! Помогите новичку организовать хранение, вывод и изменение графических примитивов. Буду благодарен за хорошую литературу.

Вообщем задача:
-нарисовать примитив;
-сохранить примитив;
-отрисовать все сохраненные примитивы;
-определять какой примитив выделен и осуществлять с ним различные операции (перетаксивание, изменение размеров и т.д.)

На данный момент я создал базовый класс Primitives с двумя насследниками Hex и Ryad. Так же создал класс для хранения примитивов, но почему то неправильно записываются данные. Параметы примитивов соответсвуют, а вот положение центра, при записи нового примитива перезаписывается. И подскажите пожалуйста, как организовать анализ поподания в область того или иного примитива и организовать прилипание одного примитива к другому (как окна Winamp)

Вот классы:
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
class Primitives
{
    public:
    int x,y,F;
 
    Primitives(int X, int Y, int F);
    virtual void Draw() {};
};
    Primitives::Primitives(int X, int Y, int f)
    {
    x=X;
    y=Y;
    F=f;
    }
 
class Ryad:public Primitives
{
public:
    int a,b;
 
    Ryad(int X,int Y,int F,int A,int B);
    void Draw(TCanvas *Canvas);
};
 
void Ryad::Draw(TCanvas *Canvas)
{
 
    int x1=x-a/2;
    int y1=y-b/2;
    int x2=x+a/2;
    int y2=y+b/2;
 
    Canvas->Rectangle(x1,y1,x2,y2);
 
};
 
Ryad::Ryad(int X, int Y,int F, int A, int B) : Primitives(X, Y,F)
{
    a=A;
    b=B;
};
 
class Hex:public Primitives
{
public:
    int R;
 
    Hex(int X, int Y,int F, int r);
    void Draw(TCanvas *Canvas);
};
 
Hex::Hex(int X, int Y,int F, int r) : Primitives(X, Y,F)
{
  R=r;
};
 
void Hex::Draw(TCanvas *Canvas)
{
    {
     double p=M_PI;
     int i=1,n;
     n=3;
 
     Canvas->MoveTo(x+cosl(F)*R, y+sinl(F)*R);
     while (i<=n*2)
     {
     Canvas->LineTo(x+cosl(i*p/n+F)*R, y+sinl(i*p/n+F)*R);
     i++;
     }
     }
}
 
class TContainer
{
    public:
    //Primitives *objs[100];
    Ryad *objs[100];
    int count;
 
    TContainer();
 
    void Add(Ryad *obj);
    void Del(int index);
    void Draw(TCanvas *Canvas);
    int Find(int x,int y);
};
 
TContainer::TContainer()
{
count=0;
};
 
void TContainer::Add(Ryad *obj)
{
     if (count >= 100)
      {
       return;
      }
     else
 
     objs[count] = obj;
     count++;
};
 
void TContainer::Del(int index)
{
delete objs[index];
for(int i = index+1; i<count; i++)
{
objs[i-1]=objs[i];
count--;
}
};
 
TContainer data;
А вот создание прямоугольника и вывод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (RadioButton4->Checked)
{
int a = StrToInt(Edit2->Text);
int b = StrToInt(Edit3->Text);
int f = StrToInt(Edit6->Text);
Ryad *rect=new Ryad(X,Y,f,a,b);
data.Add(rect);
delete rect;
rect = NULL;
};
 
if (RadioButton5->Checked)
{
Repaint();
for (int i = 0; i <= 4; i++)
{
data.objs[i]->Draw(Canvas);
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 09:03     Хранение, вывод и изменение графических примитивов
Посмотрите здесь:

C++ Создание графических приложений на C++
Организовать ввод, хранение в массиве, вывод на экран данных о сту¬дентах: фамилия, имя, отчество, рост, вес. Вычислить средний вес студентов. Определ C++
C++ отображение графических примитивов
C++ Чтение графических файлов
C++ Что использовать для рисования примитивов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.04.2013, 09:14     Хранение, вывод и изменение графических примитивов #2
Цитата Сообщение от Vistum Посмотреть сообщение
класс Primitives
Логичней имена классам объектов давать по единственном числу, а классам контейнеров или по множественному числу от объекта, или по единственному, от самого контейнера.

Добавлено через 1 минуту
Цитата Сообщение от Vistum Посмотреть сообщение
И подскажите пожалуйста, как организовать анализ поподания в область того или иного примитива и организовать прилипание одного примитива к другому (как окна Winamp)
В абстрактном случае это не решается, так как все примитивы разные, сначала определись с геометрией и способом описания потомка, а тогда уже математически выводи для него прилипание и тест попадания.
Vistum
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 9
03.04.2013, 09:25  [ТС]     Хранение, вывод и изменение графических примитивов #3
Цитата Сообщение от taras atavin Посмотреть сообщение
Логичней имена классам объектов давать по единственном числу, а классам контейнеров или по множественному числу от объекта, или по единственному, от самого контейнера.
Понял, учту

А почему у меня происходит перезапись x,y,F? Тоесть при создании первого примитива в контейнер помещаются x1,y1,F1,a1,b1; а после того как я добавил второй примитив, свойства первого примитива x2,y2,F2,a1,b1
Vistum
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 9
06.04.2013, 09:41  [ТС]     Хранение, вывод и изменение графических примитивов #4
Так... с первой проблемой я разобрался, а для поиска примитивов на канве я так понял мне нужно хранить ребра этих примитивов или координаты вершин и тогда я без проблем смогу реализовать задуманное методом бесконечного луча?
Еще хотелось бы, чтобы примитивы не пересекались, но это как я понимаю тоже можно будет решить если хранить координаты вершин? Может быть кто-нибудь знает другой способ реализации мною задуманного? Заранее благодарен!
Yandex
Объявления
06.04.2013, 09:41     Хранение, вывод и изменение графических примитивов
Ответ Создать тему
Опции темы

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