Форум сайта python.su
0
Добрый день, подскажите, пожалуйста:
Есть круг в центре экрана, поделенный на некоторое равное количество частей. При нажатии мышкой по этому кругу получаем координаты места нажатия (x, y).
Как определить, какая часть круга находится в момент нажатия под курсором, зная лишь его координаты (x, y) и радиус круга?
Другими словами щелкаем мышкой в часть круга под цифрой 3 и скрипт понимает, что было нажатие именно в области 3
Заранее спасибо за ответ
Отредактировано napuznik (Май 1, 2020 18:21:14)
Прикреплённый файлы:
cycle.jpg (76,1 KБ)
Офлайн
76
Вот тут ты должен найти, то что тебе надо
Офлайн
22
Как определить, какая часть круга находится в момент нажатия под курсором, зная лишь его координаты (x, y) и радиус круга?Вообще-то ещё координаты центра круга нужны. Ну, будем считать что они есть (x0, y0).
import math
if (x-x0)**2 + (y-y0)**2 > R: # Не попал в круг вообще return None
dx = x - x0 dy = y - y0 if dy == 0: # Попали на горизонтальный диаметр return 7 if dx > 0 else 1 cos_fi = dx/(dy**2 + dx**2) fi = math.acos(cos_fi) num_sector = math.floor(fi / math.pi) if dy > 0: # Это сверху return num_sector + 7 else: # Это снизу return 6 - num_sector
Офлайн
857
napuznik
Есть круг в центре экрана, поделенный на некоторое равное количество частей.
napuznik
Как определить, какая часть круга находится в момент нажатия под курсором, зная лишь его координаты (x, y) и радиус круга?
Офлайн
0
Всем большое спасибо за помощь. Решил с помощью векторов
import math def scalar (x1, y1, x2, y2): # скалярное произведение векторов return x1*x2 + y1*y2 def module (x, y): # модуль векторов return math.sqrt(x ** 2 + y ** 2) def degree (x1, y1, x2, y2, sectors): cos = scalar (x1, y1, x2, y2) / (module (x1, y1) * module (x2, y2)) a = (math.degrees (math.acos (cos))) # рассчет угла if x2 < 0: a = a * (-1) + 360 # при переходе на отрицательную сторону после 180 градусов начинает считать в обратную сторону. Эта формула меняет подсчет до 360 градусов b = math.trunc (math.floor (a/(360/sectors)) + 1) # определяет номер сектора под курсором return b v1 = [0, 350] # вертикальный вектор v2 = [cursor_x, cursor_y] sectors = 8 deg = degree(v1[0], v1[1], v2[0], v2[1], sectors) print deg
Офлайн
857
napuznikЕщё надо использовать радиус окружности, чтобы щелчки за пределами круга не рассматривать.
Решил с помощью векторов
Офлайн
0
py.user.next
Офлайн