Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Bepec от Сентябрь 26, 2012, 08:28



Название: QPainterPath и невидимая часть. [РЕШЕНО]
Отправлено: Bepec от Сентябрь 26, 2012, 08:28
Утро/День/Вечер добрый.

Имеется QPainterPath произвольной формы. (1)

Из произвольного прямоугольника высотой равной QPainterPath вырезается ответная часть. (2)

И тут начинается вопрос и проблема. Вырезанная часть (2) имеет в начале прозрачную вырезанную часть (3).

Соответсвенно вопрос - как можно убрать из QPainterPath  лишний кусок, вот этот (4).

PS собственно делаю анимацию захлопывающихся створок. Изза этого лишнего куска ответную часть приходится увеличивать в 2 раза, иначе передвижение (translate) заставляет ответную часть улетать за пределы отрисовки.


Название: Re: QPainterPath и невидимая часть.
Отправлено: V1KT0P от Сентябрь 26, 2012, 08:37
Ты имеешь ввиду уменьшить изображение за счет того что слева стало пусто? Если до, то просто вызови QPainterPath::boundingRect() получишь ширину и высоту которую занимает твой рисунок. Вычитаешь из ширины рисунка ширину твоей фигуры и на это расстояние отрезаешь слева.


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 26, 2012, 08:42
Меня собственно и это... Волнует :)
Как урезать QPainterPath? Как от него кусок отфигачить? :)

То ли я не вижу очевидного, то ли хз :)

PS если не трудно, псевдокодом напиши, я в графике полный 0 :D



Название: Re: QPainterPath и невидимая часть.
Отправлено: V1KT0P от Сентябрь 26, 2012, 08:47
Меня собственно и это... Волнует :)
Как урезать QPainterPath? Как от него кусок отфигачить? :)
По идее если создать новый QPainterPath который описывает вырезаемую область и воспользоваться функцией QPainterPath subtracted ( const QPainterPath & p ) const то должно произойти отрезание.


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 26, 2012, 08:50
Собственно на subtracted и засыпка. Он отрезает часть и оставляет её незаполненной :D

(3) получается как раз при subtracted от первого QPainterPath.

Собственно в этом и вопрос - он её оставляет, а не отрезает :) И получается размер получаемого QPainterPath равен оставшейся части + невидимая отрезанная.


Название: Re: QPainterPath и невидимая часть.
Отправлено: _OLEGator_ от Сентябрь 26, 2012, 12:19
Можно при отрисовке резать выезжающую часть, например:
Код
C++ (Qt)
QPainter::setClipRect( ... )


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 26, 2012, 18:35
Хм. А что резать предлагаете?

Рисуется всё на 1 виджете 1 QPainter'ом.

Первая часть отрисовывается нормально. Далее нужно отрисовать вторую часть, т.е. передвинуть начало координат и отрисовать QPainterPath вырезанный.

Куда тыкать ClipRect? Он вроде ограничивает прямоугольник в котором идёт отрисовка, а не обрезает.

Получится так же как и у меня сейчас. Он не обрубит начало - он просто невидимую часть не отрисует, но место она занимать будет так же.

PS вроде простейшая задача. Но что-то не ладится у меня с этой графикой :) Никто не набросает примерчик? (могу свой код выложить, он простейший )   


Название: Re: QPainterPath и невидимая часть.
Отправлено: _OLEGator_ от Сентябрь 26, 2012, 19:47
Прикрепи тогда проект, а то я лично мало что понял из объяснений.


Название: Re: QPainterPath и невидимая часть.
Отправлено: Igors от Сентябрь 26, 2012, 19:56
А такая уж "произвольная" та форма? Прямоугольник известен? Последовательность точек ломаной известна? Ну и сделайте 2 полигона и рисуйте их как хотите


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 26, 2012, 21:18
Умм.. Мда.

Уважаемые форумчане - подскажите мне пожалуйста как лучше сделать(нарисовать) анимацию захлопывающихся/открывающихся створок.
С использованием каких классов?

Идея насчёт вырезки была мной выбрана потому, что требуется нарисовать только одну часть произвольной формы. Вторая же будет создана автоматом.



Название: Re: QPainterPath и невидимая часть.
Отправлено: Igors от Сентябрь 26, 2012, 22:21
Уважаемые форумчане - подскажите мне пожалуйста как лучше сделать(нарисовать) анимацию захлопывающихся/открывающихся створок.
С использованием каких классов?
Ну я понимаю так что "зубы" все равно кроме Вас никто не задаст. Предлагаю задавать их в относительных координатах, напр
Код
C++ (Qt)
(0, 0)
(-0.1, 0.2)
(0, 0.5)
(-0.1, 0.75)
(0, 1)
 
Это примерно соответствует Вашему малюнку. Ну а дальше просто создаете 2 полигона,
Код
C++ (Qt)
void CreatePoly( const QRectF & R,  // исходный прямоугольник
                       const QVector <QPointF> & edge,  // зубы (см выше)
                       int index,    // 0 - создать левый полигон, 1 - правый
                       QPolygonF & poly );   // выходной полигон
 
Реализация очевидна



Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 26, 2012, 22:32
Извиняюсь, но у меня на этом то и затык :D
Общий смысл понимаю. Понимаю что лучше рисовать их по относительным. Но вот как так нарисовать, потом эти 2 полигона совместить - ноу панимайн. :/


Название: Re: QPainterPath и невидимая часть.
Отправлено: Igors от Сентябрь 26, 2012, 22:43
Извиняюсь, но у меня на этом то и затык :D
Общий смысл понимаю. Понимаю что лучше рисовать их по относительным. Но вот как так нарисовать, потом эти 2 полигона совместить - ноу панимайн. :/
Сейчас уже почти 11 и я хочу посмотреть детективу :)  Завтра до обеда нарисую


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 27, 2012, 06:52
Та ради бога, хоть всю ночь аниме с шерлоком холмсом смотрите :) Но за надежду спасибо :D


Название: Re: QPainterPath и невидимая часть.
Отправлено: Igors от Сентябрь 27, 2012, 11:23
Код
C++ (Qt)
void CreatePoly( const QRectF & R, // rectangle to fit
const QPolygonF & seam, // seam points (in relative coordinates)
int polyIndex, // 0 = left poly
qreal posX, // seam position (relative) [0..1]
QPolygonF & poly ) // output polygon
{
qreal x0 = R.left();
qreal y0 = R.top();
qreal x1 = R.right();
qreal y1 = R.bottom();
qreal w = x1 - x0;
qreal h = y1 - y0;
 
// add seam points
poly.clear();
for (int i = 0; i < seam.size(); ++i)
poly.push_back(QPointF(x0 + (seam[i].x() + posX) * w, y0 + seam[i].y() * h));
 
// left poly (CW)
if (!polyIndex) {
poly.push_back(QPointF(x0, y1)); // add left bottom
poly.push_back(QPointF(x0, y0)); // add left top
}
 
// right poly (CCW)
else {
poly.push_back(QPointF(x1, y1)); // add right bottom
poly.push_back(QPointF(x1, y0)); // add right top
}
}
 
Анимация сводится к вызову этой ф-ции с различными posX и отрисовке полученных полигонов


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 27, 2012, 12:04
Пока что глаза разбегаются :) Буду разбираться, благодарю.


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 27, 2012, 14:38
Igors а можно хоть 1 вызов этой функции проиллюстрировать?

Я так понимаю первый параметр - прямоугольник собственно виджета, второй - какой то полигон в относительных координатах(это как? Да, я знаю что если x*0.01 это будет 1%, но как такой полигон сделать?), третий направление. Четвертый - это % ширины виджета. Пятый - выходной полигон.

PS Как сделать относительный?
 
PPS Максимум чего я добился - непонятного результата с вот таким кодом. ЧЯДНТ?

Код:
		QPainter painter(this);
painter.setBrush(QColor(Qt::red));
QPolygonF f,d;
f << QPoint(0, 0) << QPoint(50, 50) << QPoint(0, 50) << QPoint(0, 0);
CreatePoly(rect(), f, 0, 0.4, d);
painter.drawPolygon(d);


Название: Re: QPainterPath и невидимая часть.
Отправлено: Igors от Сентябрь 27, 2012, 16:19
Не в процентах а от 0 до 1
Код
C++ (Qt)
f << QPointF(0, 0) << QPointF(-0.1, 0.2) << QPointF(0, 0.5) << QPointF(-0.1, 0.75)  << QPointF(0, 1);
 


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 27, 2012, 17:25
Я копировал с вашего предыдущего сообщения, но получается простой прямоугольник. Возможно его кромка и неровная, но в пикселизаторе незаметно.

PS Простой пример - зубчики хотя бы на 20 пикселей мб сделаете? А то я вообще не врубаюсь. Такое чувство функцию rand пытаюсь понять по выводимому результату :)


Название: Re: QPainterPath и невидимая часть.
Отправлено: Igors от Сентябрь 27, 2012, 17:42
Я копировал с вашего предыдущего сообщения, но получается простой прямоугольник. Возможно его кромка и неровная, но в пикселизаторе незаметно.

PS Простой пример - зубчики хотя бы на 20 пикселей мб сделаете? А то я вообще не врубаюсь. Такое чувство функцию rand пытаюсь понять по выводимому результату :)
Киньте проектик (так проще)


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 27, 2012, 18:28
Завтра в 8.00 по МСК он тут будет. К сожалению сейчас его нет и студии нет :) Много чего нет в общем. 


Название: Re: QPainterPath и невидимая часть.
Отправлено: Bepec от Сентябрь 28, 2012, 08:14
Чуть потыкал - так и не понял как происходит построение...

Проект в аттаче.


Название: Re: QPainterPath и невидимая часть.
Отправлено: Igors от Сентябрь 28, 2012, 10:09
А что не работает? (аттач). Просто у Вас по дефаулту мусор, надо нажать сначала верхний "применить", потом 3 нижних "применить" - ну то проблемы ввода


Название: Re: QPainterPath и невидимая часть. [РЕШЕНО]
Отправлено: Bepec от Сентябрь 28, 2012, 10:17
Тек потыкал после чая - теперь врубился что за относительные координаты :D

Благодарю за функцию :)