0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 9
1

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

03.04.2013, 09:03. Показов 1399. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите новичку организовать хранение, вывод и изменение графических примитивов. Буду благодарен за хорошую литературу.

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

На данный момент я создал базовый класс 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);
}
}
0
03.04.2013, 09:03
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2013, 09:03
Ответы с готовыми решениями:

Отображение графических примитивов
не подскажите как нарисовать круг, треугольник и домик. Ищу в интернете не как не могу найти(

Рисование графических примитивов
Приложение, которое читает данные из файла о координатах и размерах различных графических примитивов (отрезок, прямоугольник, эллипс,...

Операция объединения для графических примитивов
Есть задача: создать систему классов, реализующих графические примитивы (круг, треугольник, квадрат) на плоскости с реализацией операций...

3
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.04.2013, 09:14 2
Цитата Сообщение от Vistum Посмотреть сообщение
класс Primitives
Логичней имена классам объектов давать по единственном числу, а классам контейнеров или по множественному числу от объекта, или по единственному, от самого контейнера.

Добавлено через 1 минуту
Цитата Сообщение от Vistum Посмотреть сообщение
И подскажите пожалуйста, как организовать анализ поподания в область того или иного примитива и организовать прилипание одного примитива к другому (как окна Winamp)
В абстрактном случае это не решается, так как все примитивы разные, сначала определись с геометрией и способом описания потомка, а тогда уже математически выводи для него прилипание и тест попадания.
0
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
0
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 9
06.04.2013, 09:41  [ТС] 4
Так... с первой проблемой я разобрался, а для поиска примитивов на канве я так понял мне нужно хранить ребра этих примитивов или координаты вершин и тогда я без проблем смогу реализовать задуманное методом бесконечного луча?
Еще хотелось бы, чтобы примитивы не пересекались, но это как я понимаю тоже можно будет решить если хранить координаты вершин? Может быть кто-нибудь знает другой способ реализации мною задуманного? Заранее благодарен!
0
06.04.2013, 09:41
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2013, 09:41
Помогаю со студенческими работами здесь

Вывод графических примитивов на XNA
Как на XNA выводить на экран примитивы линию или полосу?

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

Движение графических примитивов
Не работает движение нижней части клюва , помогите понять почему и помогите исправить . using System; using...

Использование графических примитивов
Добрый вечер уважаемые форумчане! Необходима ваша помощь в решении следующей задачи. Требуется построить в Delphi рисунок (файл...

Создание графических примитивов
Здравствуйте ,помогите пожалуйста С помощью средства Visual C++ создать на экране чертеж.


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Пользуясь нейросетью возвращаюсь к вопросу альтернативных приводов поступательного движения.
Hrethgir 14.02.2025
Описание тут https:/ / habr. com/ ru/ articles/ 778118/ . Вопрос ответ You Привет. Скажи, есть-ли вещества, которые могут менять жидкое состояние на желеобразное под воздействием ультразвука? . . .
Ошибка "Another git process seems to be running in this repository"
hw_wired 14.02.2025
При работе с git можно столкнуться с довольно раздражающей ошибкой "Another git process seems to be running in this repository". Эта ситуация возникает, когда система контроля версий пытается. . .
Ошибка "java.lang.NoCl­assDefFou­ndErro­r: javax/xml/bind/JAXBException"
hw_wired 14.02.2025
Как разработчики Java-приложений, мы сталкиваемся с разными ошибками, но одна из них - java. lang. NoClassDefFoundError: javax/ xml/ bind/ JAXBException - стала особенно актуальной после выхода Java 9. . . .
Отличия for-in от for-of в JavaScript
hw_wired 14.02.2025
Когда-то единственным способом перебора элементов массива или свойств объекта был классический цикл for с счетчиком. Да, он отлично справлялся с задачей, но код получался громоздким и не очень. . .
Отличия implementation, api и compile в Gradle
hw_wired 14.02.2025
Управление зависимостями - одна из ключевых задач при разработке современных приложений на Java и Kotlin. Система сборки Gradle предоставляет гибкие и мощные средства для работы с зависимостями,. . .
Что лучше: require или import/export в JavaScript
hw_wired 14.02.2025
Модульность в JavaScript прошла долгий путь эволюции, и сегодня у разработчиков есть два основных способа организации модулей: старый добрый require из системы CommonJS и современные import/ export из. . .
Ошибка "Uncaught SyntaxError: Cannot use import statement outside a module"
hw_wired 14.02.2025
Думаю, многие разработчики сталкивались с ошибкой "Uncaught SyntaxError: Cannot use import statement outside a module" при попытке использовать современный синтаксис импорта в JavaScript. Эта. . .
Ошибка Docker "Got permission denied while trying to connect to the Docker daemon socket at"
hw_wired 14.02.2025
Разработка с использованием Docker может иногда преподносить неожиданные сюрпризы, и одним из самых распространенных камней преткновения становится ошибка с отказом в доступе к демону Docker. . . .
Ошибка "No 'Access-Control-Allow-Origin' header is present on the requested resource"
hw_wired 14.02.2025
При разработке современных веб-приложений нередко сталкиваешься с ошибкой "No 'Access-Control-Allow-Origin' header is present on the requested resource". Эта проблема возникает из-за политики. . .
Как закрыть порт в Linux
hw_wired 14.02.2025
Управление сетевыми портами в Linux - непростая, но важная задача для обеспечения безопасности системы. Каждый открытый порт - это потенциальная уязвимость, через которую злоумышленики могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru