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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QPainterPath и невидимая часть. [РЕШЕНО]  (Прочитано 11364 раз)
Bepec
Гость
« : Сентябрь 26, 2012, 08:28 »

Утро/День/Вечер добрый.

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

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

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

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

PS собственно делаю анимацию захлопывающихся створок. Изза этого лишнего куска ответную часть приходится увеличивать в 2 раза, иначе передвижение (translate) заставляет ответную часть улетать за пределы отрисовки.
« Последнее редактирование: Сентябрь 28, 2012, 10:17 от Bepec » Записан
V1KT0P
Гость
« Ответ #1 : Сентябрь 26, 2012, 08:37 »

Ты имеешь ввиду уменьшить изображение за счет того что слева стало пусто? Если до, то просто вызови QPainterPath::boundingRect() получишь ширину и высоту которую занимает твой рисунок. Вычитаешь из ширины рисунка ширину твоей фигуры и на это расстояние отрезаешь слева.
Записан
Bepec
Гость
« Ответ #2 : Сентябрь 26, 2012, 08:42 »

Меня собственно и это... Волнует Улыбающийся
Как урезать QPainterPath? Как от него кусок отфигачить? Улыбающийся

То ли я не вижу очевидного, то ли хз Улыбающийся

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

Записан
V1KT0P
Гость
« Ответ #3 : Сентябрь 26, 2012, 08:47 »

Меня собственно и это... Волнует Улыбающийся
Как урезать QPainterPath? Как от него кусок отфигачить? Улыбающийся
По идее если создать новый QPainterPath который описывает вырезаемую область и воспользоваться функцией QPainterPath subtracted ( const QPainterPath & p ) const то должно произойти отрезание.
Записан
Bepec
Гость
« Ответ #4 : Сентябрь 26, 2012, 08:50 »

Собственно на subtracted и засыпка. Он отрезает часть и оставляет её незаполненной Веселый

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

Собственно в этом и вопрос - он её оставляет, а не отрезает Улыбающийся И получается размер получаемого QPainterPath равен оставшейся части + невидимая отрезанная.
Записан
_OLEGator_
Гость
« Ответ #5 : Сентябрь 26, 2012, 12:19 »

Можно при отрисовке резать выезжающую часть, например:
Код
C++ (Qt)
QPainter::setClipRect( ... )
Записан
Bepec
Гость
« Ответ #6 : Сентябрь 26, 2012, 18:35 »

Хм. А что резать предлагаете?

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

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

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

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

PS вроде простейшая задача. Но что-то не ладится у меня с этой графикой Улыбающийся Никто не набросает примерчик? (могу свой код выложить, он простейший )   
Записан
_OLEGator_
Гость
« Ответ #7 : Сентябрь 26, 2012, 19:47 »

Прикрепи тогда проект, а то я лично мало что понял из объяснений.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 26, 2012, 19:56 »

А такая уж "произвольная" та форма? Прямоугольник известен? Последовательность точек ломаной известна? Ну и сделайте 2 полигона и рисуйте их как хотите
Записан
Bepec
Гость
« Ответ #9 : Сентябрь 26, 2012, 21:18 »

Умм.. Мда.

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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 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 );   // выходной полигон
 
Реализация очевидна

Записан
Bepec
Гость
« Ответ #11 : Сентябрь 26, 2012, 22:32 »

Извиняюсь, но у меня на этом то и затык Веселый
Общий смысл понимаю. Понимаю что лучше рисовать их по относительным. Но вот как так нарисовать, потом эти 2 полигона совместить - ноу панимайн. :/
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Сентябрь 26, 2012, 22:43 »

Извиняюсь, но у меня на этом то и затык Веселый
Общий смысл понимаю. Понимаю что лучше рисовать их по относительным. Но вот как так нарисовать, потом эти 2 полигона совместить - ноу панимайн. :/
Сейчас уже почти 11 и я хочу посмотреть детективу Улыбающийся  Завтра до обеда нарисую
Записан
Bepec
Гость
« Ответ #13 : Сентябрь 27, 2012, 06:52 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 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 и отрисовке полученных полигонов
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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