Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: PunisherPCK от Декабрь 04, 2013, 23:14



Название: Селектирование 2D объектов, не через GraphicView
Отправлено: PunisherPCK от Декабрь 04, 2013, 23:14
Всем привет.

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

Спасибо за ответ.


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: Igors от Декабрь 05, 2013, 10:25
Селектирование - возможно выделить объект, изменить его размеры, передвинуть и т.д и т.п. К чему это изврат, не моя прихоть. Ясно дело, что используя графические представления все бы решилось намного быстрее. Но, увы.
Отобрали, отобрали вкусные плюшки! :) Как же можно жить без них  ???

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


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: Old от Декабрь 05, 2013, 12:09
Если нельзя использовать QGraphicsView, то придется реализовывать что-то подобное самому.
Кстати, QGraphicsScene может рендерить себя на картинку.

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


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: PunisherPCK от Декабрь 05, 2013, 19:22
Я так понимаю, что основные сложности здесь:
Селектирование - возможно выделить объект, изменить его размеры, передвинуть и т.д и т.п.
а не в определении куда попал клик мышкой.

Да, вы абсолютно правы. В этом вся соль вопроса. Не думаю, что найдется нормальное решение без изобретения велосипеда.


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: Old от Декабрь 05, 2013, 19:23
Да, вы абсолютно правы. В этом вся соль вопроса. Не думаю, что найдется нормальное решение без изобретения велосипеда.
Это учебный проект, поэтому нельзя QGraphicsView?


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: PunisherPCK от Декабрь 05, 2013, 19:43
Это используется в моем проекте на испытательный срок в одной конторе. Для них важна именно реализованная математика, а не программные фишки.


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: Old от Декабрь 05, 2013, 19:47
Это используется в моем проекте на испытательный срок в одной конторе. Для них важна именно реализованная математика, а не программные фишки.
Тогда своими руками придется делать что-то типа QGraphicsXXX.


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: PunisherPCK от Декабрь 05, 2013, 19:52
Спасибо за советы. Как нибудь ухитрюсь.


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: Igors от Декабрь 05, 2013, 20:43
Да, вы абсолютно правы. В этом вся соль вопроса. Не думаю, что найдется нормальное решение без изобретения велосипеда.
Не понял насчет "сложностей" и "соли". Ну так или иначе уже есть какой-то класс (напр "figure", "item") который имеет центр - иначе бы сейчас ничего не рисовалось. Изменить это центр таская мышь - ну полчаса максимум (на вникание в чужой код). С размером аналогично. Что здесь "ненормального"?  :)


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: Old от Декабрь 05, 2013, 20:54
Ну так или иначе уже есть какой-то класс (напр "figure", "item") который имеет центр - иначе бы сейчас ничего не рисовалось.
Я так понял, что нет, фигуры просто рисуются на поверхность.


Название: Re: Селектирование 2D объектов, не через GraphicView
Отправлено: PunisherPCK от Декабрь 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;
};