Lý do chọn đề tàiKhi học hình học, việc vẽ hình học là một cách để học sinh tạo ra một hình ảnh về các khái niệm hình học một cách trực quan.. Bằng cách vẽ các hình, học sinh có thểthấy
Trang 1KHOA TIN HỌC
ĐỀ TÀINGHIÊN CỨU KHOA HỌC
XÂY DỰNG HỆ THỐNG HỖ TRỢVẼ HÌNH HỌC ĐƠN GIẢN
Nhóm sinh viên : Hà Minh Quân
Nguyễn Thi Như KiềuMai Văn Hậu
ĐÀ NẴNG, 02/2023
Trang 2MỤC LỤC
1 Lý do chọn đề tài 1
2 Mục tiêu đề tài 1
3 Đối tượng và phạm vi nghiên cứu 2
3.1 Đối tượng nghiên cứu 2
6 Bố cục của bài báo cáo 2
CHƯƠNG 1: GIỚI THIỆU VỀ CHƯƠNG TRÌNH HỖ TRỢ VẼ HÌNH HỌCĐƠN GIẢN 3
CHƯƠNG 2: CÁC THUẬT TOÁN VẼ HÌNH 3
CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆM 10
Chương trình vẽ hình học đơn giản 10
7 Kế hoạch dự kiến triển khai đề tài 22
Trang 31 Lý do chọn đề tài
Khi học hình học, việc vẽ hình học là một cách để học sinh tạo ra một hình ảnh về các khái niệm hình học một cách trực quan Bằng cách vẽ các hình, học sinh có thểthấy được mối quan hệ giữa các đối tượng hình học và các thuộc tính của chúng Chẳng hạn, khi vẽ một tam giác, học sinh sẽ thấy rằng tam giác có ba cạnh và ba góc, mỗi góc nằm trong khoảng từ 0 đến 180 độ và tổng của ba góc bằng 180 độ Việc hình dung và vẽ các hình này giúp học sinh hiểu sâu hơn về các khái niệm hình học và cách chúng tương tác với nhau
Ngoài ra, việc vẽ hình học cũng giúp học sinh phát triển kỹ năng tư duy hình học, tăng cường khả năng trực quan hóa vấn đề và giúp học sinh dễ dàng hình dung và giải quyết các bài toán hình học Bằng cách vẽ các hình và chú thích các thuộc tínhcủa chúng, học sinh có thể hiểu rõ hơn về cách giải quyết các bài toán hình học và trả lời các câu hỏi liên quan đến chúng
Cuối cùng, việc vẽ hình học cũng giúp giáo viên trình bày các khái niệm hình học một cách trực quan và sinh động hơn, giúp học sinh dễ dàng hình dung và nhớ lại các khái niệm đó Việc sử dụng hình ảnh và minh họa trong giảng dạy có thể giúp học sinh tăng cường khả năng ghi nhớ và hiểu sâu hơn về các khái niệm hình học.Để hỗ trợ việc học nói chung và học hình học nói riêng, chúng em đã xây dựng một chương trình hỗ trợ vẽ các đối tượng hình học đơn giản
2 Mục tiêu đề tài
Vẽ được các hình học cơ bản. Sản phẩm có giao diễn cơ bản, dễ hiểu Demo sản phẩm
Trang 43 Đối tượng và phạm vi nghiên cứu3.1 Đối tượng nghiên cứu
Pass
3.2 Phạm vi nghiên cứu
Tìm hiểu và vận dụng các thuật toán cơ bản để vẽ đường thẳng, hình tròn,hình vuông, hình chữ nhật và cài đặt chương trình Demo, cho phép liệt kêcác cấu hình của từng thuật toán vừa nêu trên
4 Phương pháp nghiên cứu
Tổng hợp, phân tích các phần mềm tương tự trước đây và từ đó rút ra, tìm racác vấn đề cần giải quyết và đúc kết phương án giải quyết vấn đề
Tham khảo các văn bản, tài liệu liên quan đến vấn đề nhằm tìm kiếm các phương pháp cải tiến và xây dựng thuật toán vẽ hình dựa vào đó. Thực nghiệm với các hình học cơ bản để chứng minh tính khả thi của thuật
toán
5 Kết quả dự kiến5.1 Lý thuyết
Hoàn thành tìm hiểu lý thuyết xây dựng các thuật toán vẽ hình. Áp dụng thuật toán và vẽ hình với con trỏ chuột |vào các bài toán liệt kê
các đối tượng với điều kiện cho trước
5.2 Thực tiễn
Trình bày rõ ràng, cụ thể từng bước thực hiện để đi đến kết quả. Xây dựng được chương trình để áp dụng cho nhiều trường hợp của nhiều
bài toán
6 Bố cục của bài báo cáo
Bài báo cáo được chia thành 3 mục chính:
Trang 5- Chương 1: Giới thiệu về chương trình.- Chương 2: Các thuật toán vẽ hình.- Chương 3: Kết quả thực nghiệm.
CHƯƠNG 1: GIỚI THIỆU VỀ CHƯƠNG TRÌNH HỖ TRỢ VẼ HÌNH HỌC ĐƠN GIẢN
Chương trình hỗ trợ vẽ hình học cơ bản là chương trình giúp mọi người có thể vẽ các hình học một cách đơn giản và chính xác, sử dụng thư viện Pygame viết trên ngôn ngữ Python
Dựa vào các tiện ích đã có như GeoGebra, Paint, Geometer’s Sketchpad, chương trình đã phát triển được một số công cụ cơ bản
Các chức năng cơ bản chương trình hỗ trợ: Vẽ điểm
Vẽ đường thẳng Vẽ đường tròn Vẽ hình chữ nhật Vẽ hình vuông
CHƯƠNG 2: CÁC THUẬT TOÁN VẼ HÌNH2.1 Chức năng vẽ điểm
Sử dụng mảng để lưu những vị trí của con trỏ khi nhấp chuột, sau đó vẽ lại với hàm pygame.draw.circle()
def Point(): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
list_pos_point.append(pos)
Trang 6if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_point.pop()
mouse = pygame.mouse.get_pos() if mouse[0] <= 150:
mouse = (155, mouse[1]) pygame.draw.circle(screen, BLUE, mouse, 5)def DrawPoint():
for i in list_pos_point: if i[0] <= 150: list_pos_point.pop() pygame.draw.circle(screen, BLUE, i, 5)
2.2 Chức năng vẽ đường thẳng
Sử dụng mảng để lưu vị trí của con trỏ khi nhấp chuột, sau đó sử dụng hàm pyame.draw.line() để vẽ đường thẳng với mỗi cặp vị trí được lưu
def Line(): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
list_pos_line.append(pos) if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_line.pop()
Trang 7if len(list_pos_line)%2 == 1 : point = list_pos_line[-1] mouse = pygame.mouse.get_pos() if mouse[0] <= 150:
mouse = (155, mouse[1]) pygame.draw.line(screen, BLACK, point, mouse, 2) pygame.draw.circle(screen, BLUE, point, 5)
def DrawLine(): if len(list_pos_line) >= 1: if list_pos_line[-1][0] <= 150: list_pos_line.pop() if len(list_pos_line) %2 == 1: list_pos_line.pop() number_of_lines = int (len(list_pos_line)/2) for i in range(number_of_lines): a = list_pos_line[2*i]
b = list_pos_line[2*i+1] pygame.draw.line(screen, BLACK, a, b, 2) pygame.draw.circle(screen, BLUE, a, 5) pygame.draw.circle(screen, BLUE, b, 5)
2.3 Chức năng vẽ đường tròn
Sử dụng mảng để lưu vị trí con trỏ khi nhấp chuột lần đầu tiên, sau đó dựa vào vịtrí của con trỏ trong lần nhấp chuột tiếp theo để tính toán bán kính và dựa vào hàmpygame.draw.circle() để vẽ hình tròn
def Circle(): for event in pygame.event.get():
Trang 8if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
list_pos_circle.append(pos) if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_circle.pop()
if len(list_pos_circle)%2 == 1 : point = list_pos_circle[-1] mouse = pygame.mouse.get_pos() R = math.sqrt(pow(mouse[0] - point[0], 2)+ pow(mouse[1] - point[1], 2)) if R >= point[0] - 150:
R = point[0] - 150 pygame.draw.circle(screen, BLUE, point, 5) pygame.draw.circle(screen, BLACK, point, R ,2)def DrawCircle():
if len(list_pos_circle) >= 1: if list_pos_circle[-1][0] <= 150: list_pos_circle.pop() if len(list_pos_circle) %2 == 1: list_pos_circle.pop() number_of_circle = int (len(list_pos_circle)/2) for i in range(number_of_circle): a = list_pos_circle[2*i]
b = list_pos_circle[2*i+1] pygame.draw.circle(screen, BLUE, a, 5)
Trang 9R = math.sqrt(pow(a[0] - b[0], 2)+ pow(a[1] - b[1], 2)) if R >= a[0] - 150:
R = a[0] - 150 pygame.draw.circle(screen, BLACK, a, R ,2)
2.4 Chức năng vẽ hình chữ nhật
Thư viện Pygame sử dụng điểm đầu tiên, chiều rộng và chiều dài để vẽ hình chữnhật Vì vậy để vẽ hình nhật, phải sử dụng mảng để lưu vị trí con trỏ khi nhấpchuột lần đầu tiên, sau đó tính toán chiều rộng và chiều dài của hình chữ nhật dựavào vị trí con trỏ trong lần nhấp tiếp theo, cuối cùng sử dụng hàmpygame.draw.rect() để vẽ hình chữ nhật
def Rectangle(): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
list_pos_rectangle.append(pos) if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_rectangle.pop()
if len(list_pos_rectangle)%2 == 1 : point = list_pos_rectangle[-1] mouse = pygame.mouse.get_pos() if mouse[0] <= 150:
mouse = (155, mouse[1]) pygame.draw.circle(screen, BLUE, point, 5) length = abs(point[0]-mouse[0])
width = abs(point[1]-mouse[1])
Trang 10point_x = min(point[0],mouse[0]) point_y = min(point[1],mouse[1]) pygame.draw.rect(screen, BLACK, (point_x, point_y, length, width), 2)def DrawRectangle():
if len(list_pos_rectangle) >= 1: if list_pos_rectangle[-1][0] <= 150: list_pos_rectangle.pop() if len(list_pos_rectangle) %2 == 1: list_pos_rectangle.pop()
number_of_rectangle = int (len(list_pos_rectangle)/2) for i in range(number_of_rectangle):
a = list_pos_rectangle[2*i] b = list_pos_rectangle[2*i+1] length = abs(a[0]-b[0]) width = abs(a[1]-b[1]) point_x = min(a[0],b[0]) point_y = min(a[1],b[1]) pygame.draw.rect(screen, BLACK, (point_x, point_y, length, width), 2)
2.5 Chức năng vẽ hình vuông
Tương tự với cách vẽ hình vuông, nhưng sẽ sử dụng tọa độ x/y ngắn nhất để thay vào chiều rộng và chiều cao trong hàm vẽ
def Square(): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
Trang 11list_pos_square.append(pos) if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_square.pop()
if len(list_pos_square)%2 == 1 : point = list_pos_square[len(list_pos_square)-1] mouse = pygame.mouse.get_pos()
if mouse[0] <= 150: mouse = (155, mouse[1]) length = min (abs(point[0]-mouse[0]), abs(point[1]-mouse[1])) if point[0] > mouse[0]:
point_x = point[0] - length else: point_x = point[0] if point[1] > mouse[1]: point_y = point[1] - length else: point_y = point[1] pygame.draw.circle(screen, BLUE, point, 5) pygame.draw.rect(screen, BLACK, (point_x, point_y, length, length), 2) def DrawSquare():
if len(list_pos_square) >= 1: if list_pos_square[-1][0] <= 150: list_pos_square.pop() if len(list_pos_square) %2 == 1: list_pos_square.pop()
number_of_square = int (len(list_pos_square)/2) for i in range(number_of_square):
a = list_pos_square[2*i]
Trang 12b = list_pos_square[2*i+1] length = min (abs(a[0]-b[0]), abs(a[1]-b[1])) if a[0] > b[0]:
point_x = a[0] - length else:
point_x = a[0] if a[1] > b[1]: point_y = a[1] - length else:
point_y = a[1] pygame.draw.rect(screen, BLACK, (point_x, point_y, length, length), 2)
CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆMChương trình vẽ hình học đơn giản
Chương trình có mẫu code hoàn chỉnh như sau:
import pygameimport math
WHITE = (255, 255, 255)RED = (255, 0, 0)BLACK = ( 0, 0, 0)GREY = (220, 220, 220)BLUE = ( 0, 0, 255)
class Button: def init (self, x, y, width, height, count, image=None , font_size=32):
Trang 13self.rect = pygame.Rect(x, y, width, height) self.image = None
if image: self.image = pygame.image.load("circle.svg") self.image = pygame.transform.scale(self.image, (width, height)) self.count = count
self.font = pygame.font.Font(None, font_size) self.color = (255, 255, 255)
def draw(self, surface): if self.image: surface.blit(self.image, self.rect)
def is_clicked(self, pos): return self.rect.collidepoint(pos)
def checkForInput(self, pos): if pos[0] in range(self.rect.left, self.rect.right) and pos[1] in range(self.rect.top, self.rect.bottom):
return True return False
pygame.init()screen = pygame.display.set_mode((800, 600))# screen1 = pygame.display.set_mode((150, 600))
Trang 14list_pos_point = []list_pos_line = []list_pos_circle = []list_pos_rectangle = []list_pos_square = []
def Point(): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
list_pos_point.append(pos) if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_point.pop()
mouse = pygame.mouse.get_pos() if mouse[0] <= 150:
mouse = (155, mouse[1]) pygame.draw.circle(screen, BLUE, mouse, 5)
def DrawPoint():
for i in list_pos_point:
Trang 15if i[0] <= 150: list_pos_point.pop() pygame.draw.circle(screen, BLUE, i, 5)
def Line(): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
list_pos_line.append(pos) if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_line.pop()
if len(list_pos_line)%2 == 1 : point = list_pos_line[-1] mouse = pygame.mouse.get_pos() if mouse[0] <= 150:
mouse = (155, mouse[1]) pygame.draw.line(screen, BLACK, point, mouse, 2) pygame.draw.circle(screen, BLUE, point, 5)
def DrawLine():
Trang 16if len(list_pos_line) >= 1: if list_pos_line[-1][0] <= 150: list_pos_line.pop() if len(list_pos_line) %2 == 1: list_pos_line.pop() number_of_lines = int (len(list_pos_line)/2) for i in range(number_of_lines): a = list_pos_line[2*i]
b = list_pos_line[2*i+1] pygame.draw.line(screen, BLACK, a, b, 2) pygame.draw.circle(screen, BLUE, a, 5) pygame.draw.circle(screen, BLUE, b, 5)
def Circle(): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN : pos = pygame.mouse.get_pos()
list_pos_circle.append(pos) if event.type == pygame.KEYDOWN: key_word = pygame.key.get_pressed() if key_word[pygame.K_ESCAPE]: list_pos_circle.pop()
if len(list_pos_circle)%2 == 1 :
Trang 17point = list_pos_circle[-1] mouse = pygame.mouse.get_pos() R = math.sqrt(pow(mouse[0] - point[0], 2)+ pow(mouse[1] - point[1], 2)) if R >= point[0] - 150:
R = point[0] - 150 pygame.draw.circle(screen, BLUE, point, 5) pygame.draw.circle(screen, BLACK, point, R ,2)
def DrawCircle(): if len(list_pos_circle) >= 1: if list_pos_circle[-1][0] <= 150: list_pos_circle.pop() if len(list_pos_circle) %2 == 1: list_pos_circle.pop()
number_of_circle = int (len(list_pos_circle)/2) for i in range(number_of_circle): a = list_pos_circle[2*i]
b = list_pos_circle[2*i+1] pygame.draw.circle(screen, BLUE, a, 5) R = math.sqrt(pow(a[0] - b[0], 2)+ pow(a[1] - b[1], 2)) if R >= a[0] - 150:
R = a[0] - 150 pygame.draw.circle(screen, BLACK, a, R ,2)
def Rectangle(): for event in pygame.event.get():