Найти - Пользователи
Полная версия: Определить, что курсор находится в определенной части экрана
Начало » Python для новичков » Определить, что курсор находится в определенной части экрана
1
napuznik
Добрый день, подскажите, пожалуйста:

Есть круг в центре экрана, поделенный на некоторое равное количество частей. При нажатии мышкой по этому кругу получаем координаты места нажатия (x, y).
Как определить, какая часть круга находится в момент нажатия под курсором, зная лишь его координаты (x, y) и радиус круга?
Другими словами щелкаем мышкой в часть круга под цифрой 3 и скрипт понимает, что было нажатие именно в области 3

Заранее спасибо за ответ

Romissevd
Вот тут ты должен найти, то что тебе надо
Striver
Как определить, какая часть круга находится в момент нажатия под курсором, зная лишь его координаты (x, y) и радиус круга?
Вообще-то ещё координаты центра круга нужны. Ну, будем считать что они есть (x0, y0).
Тогда это задачка на тригонометрию школьного уровня.

Где-то вначале нужно проимпортировать модуль math:
 import math

Вот части определяющей функции:

1) Нужно убедиться, что курсор не вышел за пределы круга.
 if (x-x0)**2 + (y-y0)**2 > R: # Не попал в круг вообще
    return None
2) Нужно определить, в каком секторе курсор.
 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

Я не проверял, работает ли мой бред, мог где-нибудь и накосячить…


py.user.next
napuznik
Есть круг в центре экрана, поделенный на некоторое равное количество частей.
napuznik
Как определить, какая часть круга находится в момент нажатия под курсором, зная лишь его координаты (x, y) и радиус круга?

Центр экрана можно использовать как центр окружности. Радиус используется как радиус окружности. Дальше можно отложить от центра окружности вертикальный вектор. При щелчке в полученную точку из центра окружности можно провести второй вектор. Потом можно найти угол между двумя этими векторами. Для этого хватит вычисления скалярного произведения векторов и арккосинуса.

Угол между векторами
https://ru.onlinemschool.com/math/library/vector/angl/
napuznik
Всем большое спасибо за помощь. Решил с помощью векторов
 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
py.user.next
napuznik
Решил с помощью векторов
Ещё надо использовать радиус окружности, чтобы щелчки за пределами круга не рассматривать.
napuznik
py.user.next

Да, спасибо за совет. Это было вне рамок вопроса, поэтому не стал озвучивать. Если кому-то пригодится:

radius = math.sqrt ((event.x() - Image.width() / 2) ** 2 + (event.y() - Image.height() / 2) ** 2)

event.x(), y() - положение курсора
Image.width(), height - ширина и высота рисунка (соответственно и окна)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB