Как мне изменить размер многоугольника, чтобы он поместился на холсте? Python Ткинтер

В настоящее время я кодирую ящик с конгруэнтным треугольником, он выглядит так: GUI ящика В основном это работает следующим образом: вы вводите длину основания, которое является стороной BC, затем вы вводите градусы точки ⋪B и ⋪C, а затем вычисляет пересечение между двумя линиями, сделанными из углов ( A указать нарисовать ∆ABC ), я нарисовала их визуально, чтобы вы лучше поняли здесь,

b = (b_x, b_y)
b_a = (b_x + math.cos(to_radian(-b_angle)) * 400, b_y + math.sin(to_radian(-b_angle)) * 400)

c = (c_x, c_y)
c_a = (c_x - math.cos(to_radian(c_angle)) * 400, c_y - math.sin(to_radian(c_angle)) * 400)

Теперь проблема в том, что когда вы вводите длинные градусы, пересечение двух линий (координаты точки A) точка A создается за пределами холста, поэтому вы не можете видеть весь треугольник (как вы можете видеть на первом изображении) ), поэтому я здесь для решения изменить размер треугольника (или многоугольника) и сделать его подходящим для холста, я уже подумал о проверке, больше ли координаты A, чем размер холста, но поскольку я не знаком с tkinter и python, я не знаю, как изменить размер треугольника и сделать его подходящим.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
688
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать scale(), чтобы изменить размер многоугольника.

Предположим, что canv — это экземпляр Canvas, а triangle — идентификатор полигонального объекта:

x1, y1, x2, y2 = canv.bbox(triangle) # get the bounding box of the triangle
w, h = x2-x1+10, y2-y1+10  # make the w and h a bit larger
canv_w, canv_h = canv.winfo_width(), canv.winfo_height() # get canvas width and height
r = min(canv_w/w, canv_h/h) # determine the scale ratio
canv.scale(triangle, 0, 0, r, r) # resize triangle
canv.config(scrollregion=canv.bbox(triangle)) # adjust the view window

Я сделал это, и это не сработало, я добавлю код в ответ.

José Ulises Reyes Aragón 15.12.2020 21:46

Я сделал это, но он не рисует треугольник, и я не вижу никаких изменений:

triangle = self.canvas.create_polygon(coords, fill = "light blue", outline = "black")
canvas_w, canvas_h = self.canvas.winfo_width(), self.canvas.winfo_height()
if a[0] > canvas_w or a[1] > canvas_h:
    x1, y1, x2, y2 = self.canvas.bbox(triangle)
    w, h = x2 - x1 + 10, y2 - y1 + 10 
    scale_r = min(canvas_w / w, canvas_h / h)
    self.canvas.scale(triangle, 0, 0, scale_r, scale_r)
    self.canvas.config(scrollregion=self.canvas.bbox(triangle))

Примечание: "а" равно кортежу координат точки "А"

a = (a_x, a_y)

Каковы значения coords? Что вы получаете от print(canvas_w, canvas_h, x1, y1, x2, y2)?

acw1668 16.12.2020 02:17

Как насчет того, если a_x или a_y отрицательно?

acw1668 16.12.2020 03:24
coords это список всех точек, A, B и C, a = (a_x, a_y) b = (b_x, b_y) c = (c_x, c_y) coords = [] for i in a + b + c: coords.append(i)
José Ulises Reyes Aragón 19.12.2020 21:20

напечатать его: 1, 1, 112, 90, 189, 152

José Ulises Reyes Aragón 19.12.2020 21:22

Размер холста 1x1, что означает, что вы вызываете код сразу после создания холста. Добавьте self.canvas.update() перед кодом.

acw1668 20.12.2020 02:44

Вот и все! Спасибо! Я многому научился у вас!

José Ulises Reyes Aragón 20.12.2020 17:38

Другие вопросы по теме

Похожие вопросы

Как перейти на последнюю страницу представления Flask-Admin с разбивкой на страницы по умолчанию... без сортировки по убыванию
RuntimeError: работа вне контекста запроса при попытке отправить запрос POST в приложение Flask из другого скрипта Python
Как discord.py обнаруживает, что сообщение отправляется с использованием только сопрограммы, которая определяется в самом коде?
Правильно отображать изображение cv2 массива numpy в wxpython
Python: проверьте, не содержит ли строка в списке строк переменную
Numba/numPy разница в скорости многократного запуска/оптимизация
Эффективный питонический способ умножения элементов (которые являются кортежами) каждой строки, представленной в структуре np.array
Как заменить значение строки только целыми числами в значении с помощью Pandas?
Как получить внешний ключ с гиперссылкой в ​​сериализаторе Django REST Framework?
Как я могу привязать клавишу <"Return"> и виджет кнопки к одной и той же функции в Tkinter?