2013-05-06 4 views
1

Как я могу определить (это не право использовать термин я знаю), что для каждый положение мыши в window space, он преобразуется в OGL space (-1, 1). В этом случае пользователь очень быстро перемещает мышь, полагая, что все своих предыдущих позиций преобразуются в координаты OGL. Я пытаюсь сказать, что ... это обычный процессор достаточно быстро, чтобы сделать это (чтобы отслеживать все предыдущие события), даже если мой C++ OGL coordinates converter очень дорого вычисляется? скажем, я поставил там очень много времени? или .. очень быстрый method(). Как я могу заверить, что никакие координаты OGL не пройдены, если я достаточно быстро двигаю мышью? Я не подхожу к какому-либо заключению здесь или предполагаю что-то еще, что вы думаете.Windows, координаты мыши VS OpenGL координаты мыши

Edit:

Моя программа основной цикл, как это (псевдокод):

void Pollevents() 
{ 
    for everyt_obj in this 
    { 
     if Not Collide() 
     { 

      Move(x, y) // 

     } 
    } 
} 

void MousePos() 
{ 
    mouse.pos = To_OGL_Coord2f() 
} 

Это отдельные потоки, которые будут выполнены (Но на самом деле не настоящая нить) Пусть mouse.pos = (0, 0) я переместил мышь достаточно быстро, чтобы сделать новый mouse.pos (10, 10). В одном выполнении цикла позиция мыши изменилась очень далеко от того места, где она была раньше. Теперь, как я могу рассказать моей программе, выполнив Bresenham's line algorithm, как упоминал Кристиан Рау, что эти значения, сгенерированные этим алгоритмом (не отслеживаемые), были скрещены мышью. Я добавлю еще один цикл для этого, чтобы сделать шаг для всех этих позиций?

+1

Если ваш компьютер считался медленным * 13 лет назад *, он все равно мог бы выполнять более 100 * миллионов * вычислений в секунду. Есть ли что-то в том, чтобы превратить одну пару чисел в другую пару, которая заставляет вас думать, что ваш компьютер не сможет справиться с этим? –

+0

Я имею в виду, что программа в настоящее время работает. Не процессор вычисляется процессором. Взгляните на [это] (http://s23.postimg.org/uoyhevx2z/pos.png) – mr5

+0

@NicolBolas вы видите очень большую разницу в положениях мыши в ссылке, которую я дал, когда я наводил указатель мыши на окно. Нет, если это не проблема с печатью в bash – mr5

ответ

4

Как я могу заверить, что никакие координаты OGL не пройдены, если я перемещаю мышь достаточно быстро?

Это невозможно, так как невозможно заставить ОС генерировать события мыши для каждой точки, в которой перемещение мыши пересекалось бы при отслеживании с теоретически бесконечной точностью.

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

Если с другой стороны, нужны те посредническими ПОЗИЦИИ MOUSE себя для дальнейших вычислений, вы не получите вокруг вычисляя их самостоятельно, используя некоторые общие линии алгоритм растрирования (подобно Bresenham Algorithm, школы книги алгоритма для строки растеризации) , То, что это в основном делает, - это вычислить каждую точку на дискретной сетке, чтобы пересечь линию из одной точки в другую (аналогично тому, что делает ваша видеокарта при преобразовании линии в дискретные пиксели), поэтому это приведет к созданию каждой отдельной позиции мыши вашей виртуальной путь мыши пересек (игнорируя любое нелинейное движение мыши между точками измерения).

EDIT: Если вам не нужен дискретная линия с правильными равной шириной характеристиками гораздо более простым способ, чем возиться с линией растеризацией также будет просто работать с плавающей запятой и позицию сделать простую линейную интерполяцию конечные точки, такие как datenwolf пишет в своем комментарии. Это также даст вам лучшую точность синхронизации, чем отдельные позиции мыши. Но все зависит от того, что вы на самом деле хотите сделать с этими позициями мыши (и теперь это будет хороший способ рассказать нам).

EDIT: Из вашего обновленного вопроса, похоже, вам нужны позиции мыши с высокой степенью детализации, чтобы вычислить столкновение мыши с некоторыми объектами. В этом случае вам фактически не нужны промежуточные пункты. Просто возьмите линию из текущей позиции мыши в предыдущую (представленную как просто пара точек или любое теоретическое представление линии) и вычислите столкновение объектов с этой линией вместо отдельных точек.

+0

Очень хороший ответ. –

+0

За определенное количество времени, как я могу это сделать? скажем, через миллион секунд. Ах, я имею в виду, что моя программа управляется событиями в основном мышью. Как я могу сказать своей программе, что эта позиция была пересечена мышью. Кроме того, обратите внимание, что это не просто один флеш для выполнения. – mr5

+1

@ mr5 Ничего со временем (если вам не нужно определенное время). Если вы получаете событие мыши, просто вычислите все точки между позицией мыши и точкой мыши последнего события (которое вы где-то сохранили). Если вы говорите о создании событий виртуальной мыши самостоятельно для этих промежуточных точек, то я не думаю, что это особенно хорошая идея. –