В настоящее время я кодирую ящик с конгруэнтным треугольником, он выглядит так: 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, я не знаю, как изменить размер треугольника и сделать его подходящим.
Вы можете использовать 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
Я сделал это, но он не рисует треугольник, и я не вижу никаких изменений:
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)
?
Как насчет того, если a_x
или a_y
отрицательно?
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)
напечатать его: 1, 1, 112, 90, 189, 152
Размер холста 1x1, что означает, что вы вызываете код сразу после создания холста. Добавьте self.canvas.update()
перед кодом.
Вот и все! Спасибо! Я многому научился у вас!
Я сделал это, и это не сработало, я добавлю код в ответ.