Уведомления

Группа в Telegram: @pythonsu

#1 Май 1, 2020 18:20:00

napuznik
Зарегистрирован: 2012-07-25
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Определить, что курсор находится в определенной части экрана

Добрый день, подскажите, пожалуйста:

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

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

Отредактировано napuznik (Май 1, 2020 18:21:14)

Прикреплённый файлы:
attachment cycle.jpg (76,1 KБ)

Офлайн

#2 Май 1, 2020 19:04:33

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Определить, что курсор находится в определенной части экрана

Вот тут ты должен найти, то что тебе надо

Офлайн

#3 Май 1, 2020 19:12:40

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Определить, что курсор находится в определенной части экрана

Как определить, какая часть круга находится в момент нажатия под курсором, зная лишь его координаты (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

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




Офлайн

#4 Май 1, 2020 19:24:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

Определить, что курсор находится в определенной части экрана

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

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

Угол между векторами
https://ru.onlinemschool.com/math/library/vector/angl/



Офлайн

#5 Май 3, 2020 14:33:19

napuznik
Зарегистрирован: 2012-07-25
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Определить, что курсор находится в определенной части экрана

Всем большое спасибо за помощь. Решил с помощью векторов

 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

Офлайн

#6 Май 3, 2020 22:53:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

Определить, что курсор находится в определенной части экрана

napuznik
Решил с помощью векторов
Ещё надо использовать радиус окружности, чтобы щелчки за пределами круга не рассматривать.



Офлайн

#7 Май 5, 2020 14:49:54

napuznik
Зарегистрирован: 2012-07-25
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Определить, что курсор находится в определенной части экрана

py.user.next

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

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

event.x(), y() - положение курсора
Image.width(), height - ширина и высота рисунка (соответственно и окна)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version