Чтобы определить направление, вы должны сохранить previous position
и использовать его для вычисления направления движения (нормализованного вектора) до actual position
.Эти переменные должны обновляться по мере движения.
Вот небольшой пример, который рисует вектор (стрелку), соответствующий направлению перетаскивания мыши на холсте:
import math
import tkinter as tk
from collections import deque
class Vector:
"""small class for vector arithmetic convenience
"""
def __init__(self, x: float=0, y: float=0) -> None:
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __mul__(self, scalar: float) -> 'Vector':
return Vector(self.x * scalar, self.y * scalar)
def magnitude(self) -> float:
return math.hypot(self.x, self.y)
def normalize(self) -> 'Vector':
mag = self.magnitude()
return Vector(self.x / mag, self.y / mag) if mag != 0 else Vector()
def __repr__(self) -> str:
return str(self)
def __iter__(self) -> float:
yield self.x
yield self.y
class Point:
"""small class for point arithmetic convenience
"""
def __init__(self, x: float, y: float):
self.x = x
self.y = y
def __sub__(self, other: 'Point') -> Vector:
return Vector(other.x - self.x, other.y - self.y)
def __add__(self, vec: Vector) -> 'Point':
return Point(self.x + vec.x, self.y + vec.y)
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __repr__(self) -> str:
return str(self)
def __iter__(self) -> float:
yield self.x
yield self.y
def draw_dir(canvas, start_point: Point, _vid=[None]) -> None:
"""draws and updates the scaled normalized direction vector
on the canvas.
Keeps track of the id of the canvas item last drawn
"""
if _vid[0] is not None:
canvas.delete(_vid[0])
normed_scaled_v = direct.normalize() * -50
end_point = start_point + normed_scaled_v
_vid[0] = canvas.create_line(*start_point, *end_point, arrow=tk.LAST)
_maxlen = 4
def direction(event, _direct=deque([Vector(0, 0) for _ in range(_maxlen)], maxlen=_maxlen)) -> None:
"""stores previous position, and uses it to calculate the direction
from the current position.
updates these variables
"""
global direct
_direct.append(Point(event.x, event.y))
p0, p1 = _direct[0], _direct[-1]
direct = p1 - p0
draw_dir(canvas, p1)
# print(_direct, direct)
direct = Vector(0, 0)
root = tk.Tk()
canvas = tk.Canvas(root, bg='cyan')
canvas.pack()
canvas.bind('<B1-Motion>', direction)
root.mainloop()