amarao (amarao_san) wrote,
amarao
amarao_san

охота пуще неволи

Обычно от таких вещей у меня в продакте начинают болеть зубы.

    def set_cells_by_strike(self,value,pos,rel):
        '''operates on every cell under single mouse move'''
        if max(rel) < min(self.cell_size):
            self.set_cell_by_pos(value,pos) #trivial - one cell changed
            return
        print "non-trivial case:", pos, rel
        div_round_to_infinity = lambda a, b: (a+(-a%b))//b # http://stackoverflow.com/questions/7181757/how-to-implement-division-with-round-towards-infinity-in-python
        point_calc = lambda pos,rel, step, steps, size, index: pos[index] - rel[index] + div_round_to_infinity(rel[index]*step, steps)
        steps = div_round_to_infinity(max(rel), min(self.cell_size))
        for step in range(0, steps):
            print "step:", step
            x = point_calc(pos, rel, step, steps, self.cell_size, 0)
            y = point_calc(pos, rel, step, steps, self.cell_size, 1)
            print "doing:", x, y
            self.set_cell_by_pos(value, (x,y))



Насколько я понимаю, это отдалённая форма алгоритма для отрезка Брезенхерма.

В процессе отладки нарвался на забавное поведение клитора на thinkpad'ах: при быстром движении в pygame (по крайней мере в pygame) он даёт события движения мыши с разрывами, то есть сумма пройденного в rel для всех событий MOUSEMOTION меньше, чем итоговое изменение положения курсора.

Для обычной мыши и точпада такого не наблюдается.

UPD: На мыше так же можно сделать. Интересно, это так acceleration выглядит?
Tags: pygame, thinkpad
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments