Russian Qt Forum
Сентябрь 30, 2024, 12:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Селектирование 2D объектов, не через GraphicView  (Прочитано 5171 раз)
PunisherPCK
Гость
« : Декабрь 04, 2013, 23:14 »

Всем привет.

Производится рисование примитивов типа: точка, отрезок, различные кривые на QPixmap. Чтобы было понятно: например эллипс рисуется ни как функция drawEllipse(), а по формуле(в параметрическом или обычно виде - неважно), с использованием определенного шага (например,по параметру). Полученные точки просто соединяется через drawLine. Требуется выполнить селектирование этих объектов. Селектирование - возможно выделить объект, изменить его размеры, передвинуть и т.д и т.п. К чему это изврат, не моя прихоть. Ясно дело, что используя графические представления все бы решилось намного быстрее. Но, увы.

Спасибо за ответ.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 05, 2013, 10:25 »

Селектирование - возможно выделить объект, изменить его размеры, передвинуть и т.д и т.п. К чему это изврат, не моя прихоть. Ясно дело, что используя графические представления все бы решилось намного быстрее. Но, увы.
Отобрали, отобрали вкусные плюшки! Улыбающийся Как же можно жить без них  Непонимающий

Да очень просто, напр проверим клик внутри эллипса. Каноническое ур-е эллипса с центром в начале координат
Код:
x * x / (a * a) + y * y / (b * b) = 1
Где a и b - полуразмеры по осям. Подставляем сюда координаты мыша x и y. Если значение < 1, точка внутри, иначе снаружи. Если эллипс не в начале координат - сначала вычитаем его центр из (х, y)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Декабрь 05, 2013, 12:09 »

Если нельзя использовать QGraphicsView, то придется реализовывать что-то подобное самому.
Кстати, QGraphicsScene может рендерить себя на картинку.

Отобрали, отобрали вкусные плюшки! Улыбающийся Как же можно жить без них  Непонимающий
Я так понимаю, что основные сложности здесь:
Селектирование - возможно выделить объект, изменить его размеры, передвинуть и т.д и т.п.
а не в определении куда попал клик мышкой.
« Последнее редактирование: Декабрь 05, 2013, 13:04 от Old » Записан
PunisherPCK
Гость
« Ответ #3 : Декабрь 05, 2013, 19:22 »

Я так понимаю, что основные сложности здесь:
Селектирование - возможно выделить объект, изменить его размеры, передвинуть и т.д и т.п.
а не в определении куда попал клик мышкой.

Да, вы абсолютно правы. В этом вся соль вопроса. Не думаю, что найдется нормальное решение без изобретения велосипеда.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Декабрь 05, 2013, 19:23 »

Да, вы абсолютно правы. В этом вся соль вопроса. Не думаю, что найдется нормальное решение без изобретения велосипеда.
Это учебный проект, поэтому нельзя QGraphicsView?
Записан
PunisherPCK
Гость
« Ответ #5 : Декабрь 05, 2013, 19:43 »

Это используется в моем проекте на испытательный срок в одной конторе. Для них важна именно реализованная математика, а не программные фишки.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Декабрь 05, 2013, 19:47 »

Это используется в моем проекте на испытательный срок в одной конторе. Для них важна именно реализованная математика, а не программные фишки.
Тогда своими руками придется делать что-то типа QGraphicsXXX.
Записан
PunisherPCK
Гость
« Ответ #7 : Декабрь 05, 2013, 19:52 »

Спасибо за советы. Как нибудь ухитрюсь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Декабрь 05, 2013, 20:43 »

Да, вы абсолютно правы. В этом вся соль вопроса. Не думаю, что найдется нормальное решение без изобретения велосипеда.
Не понял насчет "сложностей" и "соли". Ну так или иначе уже есть какой-то класс (напр "figure", "item") который имеет центр - иначе бы сейчас ничего не рисовалось. Изменить это центр таская мышь - ну полчаса максимум (на вникание в чужой код). С размером аналогично. Что здесь "ненормального"?  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Декабрь 05, 2013, 20:54 »

Ну так или иначе уже есть какой-то класс (напр "figure", "item") который имеет центр - иначе бы сейчас ничего не рисовалось.
Я так понял, что нет, фигуры просто рисуются на поверхность.
Записан
PunisherPCK
Гость
« Ответ #10 : Декабрь 09, 2013, 19:03 »

Ну так или иначе уже есть какой-то класс (напр "figure", "item") который имеет центр - иначе бы сейчас ничего не рисовалось.
Я так понял, что нет, фигуры просто рисуются на поверхность.

Нет, классы есть. Приведу фрагменты самых простых.
Все фигуры рисуются по точкам по точкам(MbCartPoint). Точки, из которых состоят фигуры, получаются при определенном параметре t, подстановка в параметрическую формулу фигуры.
Т.е, например, отрезок должен получиться из n-количества соединенных точек.
Как тогда все это рисовать?

Код:
class MbCartPoint
{
public:
  //конструктор по умолчанию
  MbCartPoint();
  //конструктор по координатам
  MbCartPoint( double, double );
private:
  //координаты точки
  double x;
  double y;
}

Код:
class MbLineSegment : public MbCurve
{
private:
//первая точка
  MbCartPoint p1;
  //вторая точка
  MbCartPoint p2;
  //длина сегмента
  mutable double lengthOfLineSegment;

public:
  /// Конструктор по умолчанию.
  MbLineSegment();
  //конструктор по двум точкам
  MbLineSegment( const MbCartPoint & pOne, const MbCartPoint & pTwo );
  //получить длину сегмента
  double GetLengthOfLineSegment() const;
  //получить первую точку
  const MbCartPoint & GetPointOne() const;
  //получить вторую точку
  const MbCartPoint & GetPointTwo() const;

  //найти следующую точку отрезка по параметру
  virtual void FindNextPointCurve(const double t, MbCartPoint & point) const;
};
« Последнее редактирование: Декабрь 09, 2013, 19:09 от PunisherPCK » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 23.