Đệ quy có thể tạo ra những hình ảnh đẹp và đáng kinh ngạc có các phần con giống nhau. Các thiết kế được gọi là fractals. Một trong những fractal nổi tiếng nhất là tam giác Sierpinki, được đặt tên theo nhà toán học người Ba Lan Waclaw Sierpinski [1882–1969]
Cũng như nhiều mẫu tự tương tự, nó được định nghĩa đệ quy
- Một tam giác Sierpinki có thứ tự 0 là một tam giác được lấp đầy
- Một tam giác Sierpinki bậc n, trong đó n > 0, bao gồm ba tam giác Sierpinki bậc n – 1, có độ dài các cạnh bằng một nửa độ dài các cạnh ban đầu, được sắp xếp sao cho chúng cắt nhau từ góc này sang góc khác
Ví dụ: đây là hình tam giác Sierpinki của một vài đơn đặt hàng đầu tiên.
Hãy dành một chút thời gian để xác nhận rằng tam giác Sierpinki bậc 1 thực sự bao gồm ba bản sao nhỏ hơn của tam giác Sierpinki bậc 0, rằng tam giác Sierpinki bậc 2 được hình thành từ ba bản sao nhỏ hơn của tam giác Sierpinki bậc 1, v.v.
Mặc dù các hình tam giác bậc cao có thể trông giống như chúng ta đã vẽ một hình tam giác lớn màu đen với nhiều hình tam giác màu trắng lộn ngược khác nhau ở trên, nhưng thực tế không phải vậy. Mỗi hình tam giác được vẽ là màu đen; . Mã của bạn chỉ nên vẽ các hình tam giác màu đen đã điền. Các phần màu trắng là “không gian âm” hoặc các vùng không có gì được vẽ
Bạn phải thực hiện chức năng
int drawSierpinskiTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three, int order]
trong đó lấy đầu vào là ba điểm góc của một tam giác và thứ tự. Hàm vẽ một tam giác Sierpinki được xác định bởi ba điểm góc đó và theo thứ tự đã chỉ định. Giá trị trả về từ drawSierpinskiTriangle
là tổng số hình tam giác màu đen được vẽ. Mặc dù có thể tính trực tiếp số lượng hình tam giác bằng một công thức đơn giản, nhưng thay vào đó, chúng tôi muốn bạn áp dụng phương pháp đệ quy để tính tổng số lượng từ các lệnh gọi đệ quy
Chúng tôi cung cấp hàm trợ giúp fillBlackTriangle
để điền vào một hình tam giác được xác định bởi ba điểm góc của nó
void fillBlackTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three]
Sổ tay
- Vẽ tranh. Một phần quan trọng là tìm ra vị trí cho từng góc của tam giác và điều đó sẽ dễ dàng thực hiện hơn với sơ đồ trước mặt bạn
- Trung điểm của mỗi cạnh của tam giác lớn bên ngoài trở thành một góc của một trong những tam giác bên trong nhỏ hơn. Cho một đoạn thẳng có hai đầu mút là
{x1, y1}
và{x2, y2}
, trung điểm của nó là
0void fillBlackTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three]
- Ba điểm góc của tam giác có thể được đặt tùy ý. Chúng không nhất thiết phải tạo thành một tam giác đều và đáy không phải song song với đáy cửa sổ. Việc lựa chọn góc nào được xác định là
1 so vớivoid fillBlackTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three]
2 so vớivoid fillBlackTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three]
3 là hoàn toàn tùy ývoid fillBlackTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three]
- Cấu trúc
0 được sử dụng để chỉ định tọa độ x, y trong cửa sổ đồ họa. Đây là tài liệu về GPoint. Ngoài ra còn có một số mã mẫu điều khiển GPoints trong [Bài giảng Thứ Sáu về fractals][09-recursion2]void fillBlackTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three]
- Chức năng vẽ duy nhất bạn cần là
fillBlackTriangle
do chúng tôi cung cấp. Bạn không cần phải đào sâu vào bất kỳ chức năng vẽ nào khác trong thư viện Stanford
đồ họa thử nghiệm
Một chức năng tạo ra đầu ra đồ họa, chẳng hạn như Sierpinki, không cho phép thử nghiệm đơn vị, vì vậy chúng tôi đã cung cấp một bản trình diễn GUI đơn giản mà bạn có thể sử dụng để thử nghiệm tương tác. Mã khởi động cho
void fillBlackTriangle[GWindow& gw, GPoint one, GPoint two, GPoint three]
2 chứa một bài kiểm tra được cung cấp để chạy bản trình diễn GUI của chúng tôi. Không sửa đổi bài kiểm tra được cung cấp này. Chạy thử nghiệm này sẽ hiển thị một cửa sổ đồ họa để kiểm tra tương tác bản vẽ fractal của bạn. Xem đoạn phim ghi hình này để xem minh họa hoạt động của GUITrong GUI, sử dụng thanh trượt để thay đổi thứ tự và kéo các góc để thay đổi kích thước tam giác. Bạn sẽ tùy thuộc vào việc kiểm tra trực quan tính chính xác của bản vẽ và xác nhận rằng số lượng hình tam giác được trả về là như mong đợi. Khi bạn kiểm tra xong, hãy đóng cửa sổ đồ họa để thoát khỏi GUI
Tiện ích mở rộng
Tam giác Sierpinki chỉ là một trong nhiều hình ảnh tự đồng dạng; . Chúng tôi muốn xem những gì bạn tạo ra
Bolzano
Con én không tải
Bài đăng. 1
Chủ đề. 1
Đã tham gia. Tháng 3 năm 2021
Danh tiếng. 0
#1
23-03-2021, 07. 40 PM [Bài đăng này đã được sửa đổi lần cuối. 24-03-2021, 09. 49 giờ sáng tới Bolzano. ]Xin chào,
Tôi mới bắt đầu lập trình trong python [hoàn toàn mới bắt đầu lập trình] và tôi muốn nhờ bạn giúp đỡ.
Đây là vấn đề của tôi.
Tôi đang cố lập trình tam giác Sierpinki cho n lần lặp. Đây là những gì tôi đã nhận được cho đến nay.
import numpy as np from math import sqrt # a b c P = np.array[[[0, 0], [1, 0], [1, [1/sqrt[2]]]], dtype=float] # I could start with any point, but decided to start with a a = np.array[[0, 0], dtype=float] new_point: #1.iteration # a + b p1 = P[0] + P[1] new_point #2.iteration t1 = P[0] + p1 t2 = P[1] + p1 t3 = P[2] + p1 # b + c p2 = P[1] + P[2] new_point #2.iteration t4 = P[0] + p2 t5 = P[1] + p2 t6 = P[2] + p2 # c + a p3 = P[2] + P[0] new_point #2.iteration t7 = P[0] + p3 t8 = P[1] + p3 t9 = P[2] + p3Vấn đề của tôi là viết tất cả những điều này theo cú pháp đệ quy trong python [đệ quy là bắt buộc].
Tôi còn vẽ mọi thứ ra giấy nên tôi hiểu thuật toán, nhưng không biết viết cú pháp như thế nào.
Còn việc vẽ đồ thị cho tất cả các điểm thì sao? . zeros[], nhưng người ta giải thích rằng đây là một hàm dành cho ma trận, vì vậy tôi không chắc cách triển khai hàm này vào chương trình.
Bạn có thể giúp gì không?
Đáp lại
Tìm thấy
Đáp lại
deanhystad
Cân như con vịt
Bài đăng. 4.386
Chủ đề. 16
Đã tham gia. Tháng 2 năm 2020
Danh tiếng. 259
#2
24-Mar-2021, 02. 37 PM [Bài đăng này đã được sửa đổi lần cuối. 24-03-2021, 02. 37 PM by deanhystad. ]Tại sao bạn lại sử dụng numpy? .
Bạn có thể viết mã giải quyết vấn đề trong 1 lần lặp không? . Khi bạn có mã tính toán ba hình tam giác giống nhau, phần đệ quy rất đơn giản.
Đáp lại
Tìm thấy
Đáp lại
SheeppOSU
Bộ trưởng của những bước đi ngớ ngẩn
Bài đăng. 481
Chủ đề. 86
Đã tham gia. Tháng 2 năm 2018
Danh tiếng. 21
#3
03-04-2021, 06. 11 giờ sáng [Bài đăng này đã được sửa đổi lần cuối. 03-04-2021, 06. 11 giờ sáng bởi SheeppOSU. ]Mình sẽ viết hàm lấy 3 điểm cho tam giác, lấy 3 điểm cho tam giác nằm trong nó để được 3 bộ 3 điểm như vậy. [A, p1, p3], [B, p1, p2], [C, p2, p3]. Sau đó, nó tự thực hiện với mỗi bộ ba điểm. Bạn có thể tìm ra những việc cần làm với các điểm và cách yêu cầu chương trình dừng lại.
Mã ví dụ. [Nhân tiện, mã gần như chưa được kiểm tra]
import numpy as np from math import sqrt def recursive[points]: p1 = [points[0] + points[1]] / 2 p2 = [points[1] + points[2]] / 2 p3 = [points[2] + points[0]] / 2 for p_set in np.array[[points[0], p1, p3], [points[1], p1, p2], [points[2], p3, p2]]: recursive[p_set] recursive[np.array[[[0, 0], [1, 0], [1, 1/sqrt[2]]]]]
Đáp lại
Tìm thấy
Đáp lại