Название: Программа типа xEyes Отправлено: gil9red от Июль 17, 2013, 20:40 Всем здрасти :)
Захотелось вот сделать такую и вроде бы почти все сделал, а вот как ограничить позицию "зрачка", чтобы из "глаза" не убежал я не могу допереть :) Вполне получилось узнавать, когда "зрачок" выходит за пределы "глаза", а вот как вернуть его не особо могу придумать ??? Помогите :) Код: h. Код: #include <QtGui> cpp Код: /// PUBLIC Название: Re: Программа типа xEyes Отправлено: Igors от Июль 17, 2013, 21:13 Создайте простенькую мат модель. Проще всего считать что центр глаза в точке (xe, ye, 0), а мыша в позиции (xm, ym, h) - эту высоту h Вы подберете. Тогда имеете вектор глаз - точка. Вычисляете угол этого вектор с осью Z, нормируете и получаете центр вписанного зрачка
Название: Re: Программа типа xEyes Отправлено: gil9red от Июль 17, 2013, 21:39 Зачем ось Z в двухмерной плоскости ???
Я вот такое делаю: (https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR_r_OdCluUK8Guw_1XJQEsHXcDt2qQnv0Qd3KrsMwiRvYDIIn-vw) Название: Re: Программа типа xEyes Отправлено: gil9red от Июль 18, 2013, 00:55 Проблему решил:
Сделал отрисовку от центра глаза к курсору линию и проверял в каком месте она пересекалась с окружностью ("глазом") Название: Re: Программа типа xEyes Отправлено: Igors от Июль 18, 2013, 11:02 Сделал отрисовку от центра глаза к курсору линию и проверял в каком месте она пересекалась с окружностью ("глазом") А на каком расстоянии (от центра глаза) Вы рисуете зрачок?Название: Re: Программа типа xEyes Отправлено: gil9red от Июль 18, 2013, 15:33 Расстояние от центра на прямую зависит от того, где в данный момент находится курсор мыши )
Но чтобы, "зрачок" не ушел вне "глаза" приходится делать проверку, и если он вышел за пределы, вернуть его к границе глаза :) А возвращаю "зрачок" так: 1. Создаю вторую меньшую окружность в центре глаза (это и будет ограничивающая окружность, вне которой не может быть перемещен зрачок) 2. Создаю прямую, ее начало в центре глаза, а конец - позиция курсора 3. Определяю координаты пересечения ограничивающей окружности с прямой и перемещаю зрачок в эти координаты На изображении показано определение куда вернуть "зрачок" PS. Выложил исходный код. В нем сделан только 1 глаз с зрачком, но добавить 1-n глаз не так будет сложно ;D PSS. Не люблю подобные задачки, но вроде бы "первый блин не получился комом" :) PSSS. Комментарии к функции isIntersectionEllipseAndDirect не мои :D Нашел функцию где то в инете - не помню где было (писал и гуглил ночью, когда очень хотелось добить алгоритм), в ней изменил название, интерфейс и упросил реализацию, остальное не трогал :) Название: Re: Программа типа xEyes Отправлено: Igors от Июль 18, 2013, 16:33 PSSS. Комментарии к функции isIntersectionEllipseAndDirect не мои :D Нашел функцию где то в инете - не помню где было (писал и гуглил ночью, когда очень хотелось добить алгоритм), в ней изменил название, интерфейс и упросил реализацию, остальное не трогал :) Да, комментарии заслуживют цитатыЦитировать // функция которая счетает пересиченния еллипса и прямой Свое решение было бы куда проще чем найденный кусок кала. Вам ведь нужно найти не любое пересечение (общий случай), а пересечение с прямой проходящей через центр эллипса, точнее даже радиус в данном напрвлении. Каноническое уравнение эллипса// когда пересечений нету возврасчает false иначе true и // в масив Res присваевается точки пересичение (x * x) / (a * a) + (y * y) / (b * b) = 1; // где a и b - полуоси эллипса Подставляя y = кх получаете квадратное уравнение, находите корни как учили в 6-м классе Понятно что зрачок "в пределах" но все же неясно, на каком расстоянии от центра? Всегда на максимально возможном? Тогда можно лучше сделать (если надо) Название: Re: Программа типа xEyes Отправлено: gil9red от Июль 18, 2013, 17:01 Ясно :)
Название: Re: Программа типа xEyes Отправлено: gil9red от Июль 18, 2013, 21:26 Прикалывает меня это :D
|