crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Нахождение точки пересечения QGraphicsLineItem
RazrFalcon
  опции профиля:
сообщение 30.3.2011, 20:26
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Гугл говорит о том, что можно узнать пересекаются они вообще или нет, а вот как получить именно координату пересечения не понятно.
Я говорю не о простой математике, а уже готовой функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vintik
  опции профиля:
сообщение 30.3.2011, 21:40
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 28.3.2011
Пользователь №: 2547

Спасибо сказали: 2 раз(а)




Репутация:   0  


Алгоритм такой.
Согласно Assistant конструктор QGraphicsLineItem такой.
QGraphicsLineItem ( const QLineF & line, QGraphicsItem * parent = 0 )
Значит туда передаётся некто QLineF.
По Assistant смотрим описание QLineF. Попутно вспоминаем как по англицки "пересекаться". Гугл подсказывает - intersect.
Ищем это слово на странице описания QLineF. И находим такую штуку
IntersectType QLineF::intersect ( const QLineF & line, QPointF * intersectionPoint ) const
Вот этот метод тебе и нужен.

Нафиг я всё так расписал, а не тупо ответил?
Просто потому, что стоит привыкнуть работать с документацией.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 30.3.2011, 23:03
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Да, не знал об этом, спасибо.

Но я не могу с этим разобраться.

QLineF* line1 = new QLineF(0, 0, 30, 30);
QLineF line2(0, 30, 30, 0);
QPointF* intersectionPoint = new QPointF(50, 50);
qDebug()<<line1->intersect(line2, intersectionPoint);
возвращает 1

QPointF* intersectionPoint = new QPointF(-50, -50);
тоже 1
QPointF* intersectionPoint = new QPointF(10, 10);
тоже 1
Я не пойму на что этот intersectionPoint вообще влияет.

Если линии параллельны - то выдает 0.
Если вообще в разных плоскостях то 2.
Но это и из хелпа понятно.

А мне нужна точка пересечения!

Сообщение отредактировал RazrFalcon - 30.3.2011, 23:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vintik
  опции профиля:
сообщение 30.3.2011, 23:36
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 28.3.2011
Пользователь №: 2547

Спасибо сказали: 2 раз(а)




Репутация:   0  


примерно так
QLineF l1(QPointF(0, 0), QPointF(10,0));
QLineF l2(QPointF(0, 0), QPointF(0,10));
QPointF pntIntersect;

int res = l1.intersect(l2, &pntIntersect); // сюда - pntIntersect будет записана точка пересечения, как ты понимаешь - эт (0,0)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 30.3.2011, 23:43
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 21.10.2010
Пользователь №: 2134

Спасибо сказали: 9 раз(а)




Репутация:   1  


Цитата(RazrFalcon @ 31.3.2011, 0:03) *
А мне нужна точка пересечения!


Функция возвращает enum QLineF::IntersectType
Тоесть все правильно: параллельны-0, скрещиваются прямые-2..

Насколько я понял, координата пишется во второй аргумент функции:

Цитата
IntersectType QLineF::intersect ( const QLineF & line, QPointF * intersectionPoint ) const
Returns a value indicating whether or not this line intersects with the given line.

The actual intersection point is extracted to intersectionPoint (if the pointer is valid). If the lines are parallel, the intersection point is undefined.


Тоесть

QLineF* line1 = new QLineF(0, 0, 30, 30);
QLineF line2(0, 30, 30, 0);
QPointF* intersectionPoint = new QPointF(50, 50);
qDebug()<<line1->intersect(line2, intersectionPoint);
qDebug()<<intersectionPoint->x();
qDebug()<<<<intersectionPoint->y();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 30.3.2011, 23:47
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Все работает!

QLineF* line1 = new QLineF(0, 0, 30, 30);
QLineF line2(0, 30, 30, 0);
QPointF intersectionPoint;
line1->intersect(line2, &intersectionPoint);
qDebug()<<intersectionPoint.x()<<intersectionPoint.y();

vankleef, тоже работает ваш вариант, но new QPointF(50, 50); не на что не влияет. Почему то.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 31.3.2011, 0:29
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 21.10.2010
Пользователь №: 2134

Спасибо сказали: 9 раз(а)




Репутация:   1  


Цитата(RazrFalcon @ 31.3.2011, 0:47) *
vankleef, тоже работает ваш вариант, но new QPointF(50, 50); не на что не влияет. Почему то.


потому что new QPointF(50, 50) перписывается, когда функция вызывается
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 31.3.2011, 0:43
Сообщение #8


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ааа!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.10.2018, 14:48