Название: построение стрелочки вектора Отправлено: borik120 от Ноябрь 12, 2010, 22:18 вообщем рисую векторную диаграмму, несколько последовательных векторов на координатной плоскости. (декартова система)
столкнулся с такой проблемой: при отрисовке вектора не могу нарисовать стрелочку вектора. известны координаты начала(x1:y1) и конца (x2:y2) вектора. нужно найти координаты конца стрелки вектора (x3:y3); я пытался их искать через углы альфа и бета (см. вложение) находил бета из скалаярного произведения вектора, на направляющий вектор оси х. и потом находил x3:y3 исхоря из угла (бета - альфа + 90). в подробности вдаваться не буду, думаю не стоит. вообщем этот способ работает только для векторов в первой четверти координат. думаю, может кто то уже сталкивался с подобной задачей, и есть более простое решение? естественно вектор может быть направлен в любую сторону. Название: Re: построение стрелочки вектора Отправлено: ufna от Ноябрь 13, 2010, 07:37 Рисуешь линию, идешь в точку конца, делаешь QPainter'у поворот на посчитанное на основе вектора число градусов, чтобы стрелочку можно было рисовать в системе координат уже "с поворотом", просто как к примеру две линии (0, 0, -10, -10) и (0, 0, -10, 10).
Название: Re: построение стрелочки вектора Отправлено: GreatSnake от Ноябрь 13, 2010, 09:33 2 ufna
Чего-то я сомневаюсь, что borik120 тебя поймёт ) Название: Re: построение стрелочки вектора Отправлено: ufna от Ноябрь 13, 2010, 10:55 Надо юзать QPainter::translate() и QPainter::rotate(), ну а далее если сам не разберется, то велкам, хотя вроде зная "скалярное произведение", то все должно быть очевидно :)
Название: Re: построение стрелочки вектора Отправлено: borik120 от Ноябрь 13, 2010, 18:21 вот получился такой код:
вначале две функции возвращающие скалярное произведение, и длину вектора соответственно. Код: double AlgMultiplieVect(double x1,double y1,double x2, double y2) переменная k - это коэффицент, как относятстя единичный отрезок в пикселях на рисунке с значением единичного отрезка. (вычисляется ранее). вычисление x2,y2 тоже точно правильное. так вот теперь проблема в том, что стрелочка получается немного недокрученная\ перекрученная. (см рисунок). здесь еще более-менее, бывает вообще сильно неровная. Название: Re: построение стрелочки вектора Отправлено: GreatSnake от Ноябрь 13, 2010, 18:37 Копайте расчёт угла.
И я бы увеличил точность расчёта градусов - не стоит использовать 57.295 - всё-таки, например, (180 / 3.14159265) будет точнее - пусть машина считает) Название: Re: построение стрелочки вектора Отправлено: borik120 от Ноябрь 13, 2010, 18:43 увеличивал число до (beta*57.29577951308)и в виде (beta*180 / 3.14159265) но результат то же. может расчет угла из формулы скалярного произведения может давать неточный результат?
Название: Re: построение стрелочки вектора Отправлено: ufna от Ноябрь 13, 2010, 18:44 Как уже было сказано выше, проблема видится именно в рассчете угла - на рисунке видно что он однозначно посчитан где-то на четверть-треть меньшим чем должен быть. И не стоит использовать такие "градусные" константы.
Название: Re: построение стрелочки вектора Отправлено: ufna от Ноябрь 13, 2010, 18:46 блин, медленно пишу ))
ты проверь просто - задай отрезок, когда точно знаешь угол. И потом посмотри какой угол у тебя насчитает программа, выведи его. Сравни и можно начать искать ошибку. Название: Re: построение стрелочки вектора Отправлено: borik120 от Ноябрь 13, 2010, 18:56 только что посчитал, он все правильно вывел. получилось 45гр.
Код: testx1 = 4; testy1 = 4; во вложении другой вектор. тут по моему дело не в угле) Название: Re: построение стрелочки вектора Отправлено: ufna от Ноябрь 13, 2010, 19:01 где 45 градусов? Покажи вывод.
у тебя мастаб относительный осей какой? выложи минимальный код. Название: Re: построение стрелочки вектора Отправлено: borik120 от Ноябрь 13, 2010, 19:23 вообще я рисую на графике комплексные числа с помощью векторов.
Код: double step2 (Complex a) Название: Re: построение стрелочки вектора Отправлено: borik120 от Ноябрь 13, 2010, 21:28 все нашел ошибку. проблема была в моей невнимательности.
в функцию, где высчитывалась длина вектора, передавал не первоначальные координаты вектора, а координаты вектора сложенные с центром на рисунке. а из за того что оси Y на рисунке и в программе отличаются направлением, получался недочет. Спасибо всем за проявленный интерес! :) |