좌표평면 클릭 → 점 표시 → 넓이 버튼 → 신발끈 공식 계산 과정 출력
import tkinter as tk
class PolygonAreaApp:
def __init__(self, root):
self.root = root
self.root.title("n각형 넓이 구하기")
self.w = 600
self.h = 600
self.scale = 20
self.points = []
self.canvas = tk.Canvas(root, width=self.w, height=self.h, bg="white")
self.canvas.pack(side=tk.LEFT)
self.text = tk.Text(root, width=45, height=35)
self.text.pack(side=tk.RIGHT)
self.btn_area = tk.Button(root, text="넓이 구하기", command=self.show_area)
self.btn_area.pack()
self.btn_clear = tk.Button(root, text="초기화", command=self.clear)
self.btn_clear.pack()
self.draw_plane()
self.canvas.bind("<Button-1>", self.add_point)
def to_screen(self, x, y):
sx = self.w / 2 + x * self.scale
sy = self.h / 2 - y * self.scale
return sx, sy
def to_math(self, sx, sy):
x = (sx - self.w / 2) / self.scale
y = (self.h / 2 - sy) / self.scale
return round(x, 2), round(y, 2)
def draw_plane(self):
self.canvas.create_line(0, self.h / 2, self.w, self.h / 2, fill="black")
self.canvas.create_line(self.w / 2, 0, self.w / 2, self.h, fill="black")
for i in range(0, self.w, self.scale):
self.canvas.create_line(i, 0, i, self.h, fill="#eeeeee")
for i in range(0, self.h, self.scale):
self.canvas.create_line(0, i, self.w, i, fill="#eeeeee")
self.canvas.create_text(self.w / 2 + 15, self.h / 2 + 15, text="O")
def add_point(self, event):
x, y = self.to_math(event.x, event.y)
self.points.append((x, y))
sx, sy = self.to_screen(x, y)
num = len(self.points)
self.canvas.create_oval(sx - 4, sy - 4, sx + 4, sy + 4, fill="red")
self.canvas.create_text(
sx + 35,
sy - 10,
text=f"P{num}({x}, {y})",
fill="blue"
)
if len(self.points) >= 2:
x1, y1 = self.points[-2]
x2, y2 = self.points[-1]
sx1, sy1 = self.to_screen(x1, y1)
sx2, sy2 = self.to_screen(x2, y2)
self.canvas.create_line(sx1, sy1, sx2, sy2, fill="green", width=2)
self.text.insert(tk.END, f"P{num} = ({x}, {y})\n")
def show_area(self):
if len(self.points) < 3:
self.text.insert(tk.END, "\n점은 3개 이상 필요합니다.\n")
return
x1, y1 = self.points[-1]
x2, y2 = self.points[0]
sx1, sy1 = self.to_screen(x1, y1)
sx2, sy2 = self.to_screen(x2, y2)
self.canvas.create_line(sx1, sy1, sx2, sy2, fill="green", width=2)
self.text.insert(tk.END, "\n[신발끈 공식 계산 과정]\n")
sum1 = 0
sum2 = 0
n = len(self.points)
for i in range(n):
x1, y1 = self.points[i]
x2, y2 = self.points[(i + 1) % n]
t1 = x1 * y2
t2 = y1 * x2
self.text.insert(tk.END, f"\nP{i+1} → P{(i+1)%n+1}\n")
self.text.insert(tk.END, f"{x1} × {y2} = {t1}\n")
self.text.insert(tk.END, f"{y1} × {x2} = {t2}\n")
sum1 += t1
sum2 += t2
area = abs(sum1 - sum2) / 2
self.text.insert(tk.END, "\n[합 계산]\n")
self.text.insert(tk.END, f"앞쪽 합 = {sum1}\n")
self.text.insert(tk.END, f"뒤쪽 합 = {sum2}\n")
self.text.insert(tk.END, "\n[넓이 계산]\n")
self.text.insert(tk.END, f"넓이 = |{sum1} - {sum2}| / 2\n")
self.text.insert(tk.END, f"n각형의 넓이 = {area}\n")
def clear(self):
self.points.clear()
self.canvas.delete("all")
self.text.delete("1.0", tk.END)
self.draw_plane()
root = tk.Tk()
app = PolygonAreaApp(root)
root.mainloop()
tk라는 짧은 이름으로 사용합니다.show_area 메서드가 실행됩니다.clear 메서드가 실행됩니다.add_point 메서드가 실행되도록 연결합니다.event에 들어 있습니다.-2는 바로 이전 점, -1은 마지막으로 클릭한 점입니다.self.points는 클릭한 점들의 좌표를 저장하는 리스트이다. self.points[-1]은 첫 번째 점을 의미한다. self.points[0]은 첫 번째 점을 의미한다. abs()는 넓이가 음수로 나오는 것을 방지한다. bind("<Button-1>", ...)는 마우스 왼쪽 클릭 이벤트를 연결한다. to_screen()은 화면 좌표를 수학 좌표로 바꾸는 함수이다. (i + 1) % n은 마지막 점 다음에 첫 번째 점으로 돌아가기 위해 사용한다. clear() 메서드는 좌표평면, 점, 텍스트 내용을 초기화한다. self.canvas.bind("<Button-1>", self.add_point)self.points[(i + 1) % n]area = abs(sum1 - sum2) / 2에서 abs를 쓰는 이유는?clear() 메서드가 하는 일로 옳지 않은 것은?class, __init__, self, list, for, if, Canvas, Button, Text