10 minute read
5_6_On Data Trees
5_6_ Cây dữ liệu
Bây giờ là lúc mở ra một chủ đề mới về quản lý dữ liệu trong Grasshopper được gọi là cây dữ liệu để nói về tham số không gian và việc sử dụng các component liên quan, bạn thực sự cần Cây dữ liệu này khi làm việc với các model phức tạp, đặc biệt là đối với những tham số không gian của đường cong và bề mặt. Một trong những tiềm năng to lớn của các thuật toán tạo ra tham số là chúng cho phép ta thiết kế và quản lý hàng trăm component liên kết chặt chẽ với nhau . Để làm việc với một số lượng lớn component, đôi khi cần phải áp dụng lệnh cho tất cả và thỉnh thoảng chỉ cần chọn một mục và áp dụng một lệnh để nó. Vì vậy, chúng ta cần phải có quyền truy cập vào các component và quản lý dữ liệu (các component ) theo nhiều cách khác nhau .
Advertisement
Hãy tưởng tượng chúng ta có 5 đường cong trong không gian thiết kế và chúng ta chia nó thành 10 phần. Bây giờ chúng ta muốn chọn tất cả các điểm thứ hai của những đường cong này và kết nối chúng lại với nhau với một đường cong nội suy mới.
Hình.5.27. Một component <curve> với 5 đường cong, tất cả đều <Divide> d 10. Nếu bạn chọn số chỉ số là 1 với component <item> từ điểm phân chia, bạn sẽ thấy rằng tất cả các điểm thứ hai của đường cong được lựa chọn, không chỉ là điểm thứ hai của dòng đầu tiên. Nhưng nếu bạn nối những điểm này với một component <interpolate> để vẽ một đường cong, bạn sẽ thấy <interpolate> cho thấy lỗi và không rút ra bất cứ điều gì!
Ở đây để hiểu được vấn đề chúng ta hãy giới thiệu một component hữu ích và quan sát tình hình. Đây là component <param Viewer> từ Params> Special. Hãy so sánh kết quả:
98
Hình .5.28. Component <param Viewer> cho thấy một số thông tin dữ liệu khác bên trong các component chỉ ra lý do các lỗi trong <interpolate>.
Những gì bạn nhìn thấy trong <param Viewer> là khái niệm của cây dữ liệu trong Grasshopper. Như bạn có thể nhìn thấy trong Hình.5.28 component <curve> có 5 đường nhưng khi <divide> d những đường cong và tạo ra một số điểm cho mỗi đường cong, những điểm đã được sắp xếp vào danh sách dữ liệu khác nhau được gọi là nhánh. Điều này có nghĩa rằng kết quả của component <divide> là không chỉ có một danh sách các dữ liệu bao gồm 55 điểm,mà bây giờ chúng ta có năm danh sách các dữ liệu đều có 11 điểm bên trong. Vì vậy, các dữ liệu chính của "Cây" đã được chia thành các nhánh để tạo điều kiện thuận lợi hơn nữa trong việc sử dụng và truy cập dễ dàng hơn khi thiết kế.Đó là lý do tại sao khi chúng ta chọn <item> với chỉ số là 1,thì tức là chọn mục có chỉ số 1 trong mỗi danh sách.
HÌnh.5.29. <param Viewer> với tùy chọn kiểm tra Draw Tree trong context menu để chỉ ra sự khác biệt giữa các nhánh dữ liệu trong mỗi component.
Bây giờ, tại sao component <interpolate> không thể vẽ một đường cong ? Vấn đề là gì ? Hãy có một cách nhìn gần hơn vào các thông tin mà chúng ta thu thập được :
99
Hình.5.30. <param Viewer> và <Panel> A: đường cong và B: lựa chọn chỉ số 1 điểm. Trong hình Hình đầu tiên của Hìnhure.5.30 <param viewer> của component <curve> cho thấy một trong những nhánh dữ liệu chính .Nếu bạn nhìn tại <Panel> của nó, bạn thấy có một danh sách các đường cong dưới tiêu đề của {0}. Trong Grasshopper {} là biểu tượng cho cây dữ liệu và hiển thị các nhánh mà đối tượng đó được định vị. Vì vậy, tất cả các đường cong trong hình Hình đầu tiên bên dưới biểu tượng {0} nằm trong các nhánh chính. Nếu bạn quay trở lại Hình.5.28 bạn thấy rằng <param viewer> của các <curve>, (đường dẫn = 1) có nghĩa là chúng ta chỉ có một nhánh của dữ liệu và nhánh {0} này (N = 5), chúng ta có 5 mục .
Nhưng trong bức Hình thứ hai của Hình.5.30 chúng ta có thể thấy rằng dữ liệu trong các component <item> được liệt kê dưới năm nhánh khác nhau: {00:00} {00:01}, ... {00:04} và đó là một trong những điểm ở mỗi danh sách. Nếu bạn kiểm tra Hình.5.28 một lần nữa bạn thấy rằng <param 3 viewer> có 5 nhánh (đường dẫn = 5) và mỗi nhánh của dữ liệu có một mục (N = 1 cho
100
tất cả các nhánh). Điều này có nghĩa rằng dữ liệu đã được chia thành những nhánh khác nhau và khi chuyển vào component <interpolate>, chúng là riêng biệt với nhau và component <interpolate> không thể vẽ polyline từ năm điểm riêng biệt.
Vậy chúng ta giải quyết vấn đề này như thế nào ?
Hình.5.31. Để giải quyết vấn đề này, ta sử dụng một component <Flatten> (Logic> Tree)mà âm thanh, chuyển đổi dữ liệu từ nhiều nhánh tới một nhánh có thể thấy trong <param viewer>. Như bạn có thể thấy trong <panel> thứ hai, bây giờ chúng ta có năm điểm dưới các nhánh của {0} và component <interpolate> có thểvẽ một polyline với năm điểm này.
Để tóm tắt và nắm được các khái niệm, chúng ta nên hiểu rằng trong khi làm việc với nhiều đối tượng ở những mức độ khác nhau, dữ liệu có cấu trúc thứ bậc trong các nhánh và mỗi nhánh của dữ liệu có đường dẫn riêng của mình như một số chỉ số trong đó cho thấy các địa chỉ duy nhất của nhánh (tức là {00:01}). Đây là điều quan trọng để biết rằng làm việc với danh sách các component quản lí bị ảnh hưởng bởi các khái niệm này và những component làm việc trên từng nhánh là một danh sách riêng biệt. Chúng ta có thể cần phải tạo ra các nhánh dữ liệu của chính chúng ta hoặc gom dữ liệu phân nhánh thành một nhánh, hoặc những loại dữ liệu quản lí khác mà ta có thể sử dụng trong các thí nghiệm sau đó .
101
Hình .5.32 Những nhánh dữ liệu của cây dữ liệu
Hãy đưa ra một ví dụ khác để làm rõ thêm các chủ đề: Tôi muốn thiết kế một surface giống như những phác thảo trong hình.5.33 dựa trên một mặt sử dụng. Tôi có thể mô tả quá trình một cách nhanh chóng và xem kết quả cuối cùng .
Hình.5.33. Phác thảo của surface mong muốn.
102
Để thiết kế surface này, ta tạo ra hai line ở cạnh trên và dưới của một surface và loft chúng lại với nhau. Điều này sẽ tạo ra một số surface nhỏ mà tất cả liên kết với nhau tạo ra surface cần dựng . Ta nên điều chỉnh hướng của các line để có thể kiểm soát sự khác biệt trên surface.
Hình.5.34. Tôi giới thiệu một <surface> cơ bản trong khung làm việc và tôi explode nó bằng <BRep Components> .(Surface> Analysis) để có thể chọn các cạnh của nó. Sau đó, tôi chọn phía dưới và cạnh trên với <item> có chỉ số là 0 và 2.
Hình.5.35. Tôi sử dụng cạnh dưới để <offset> (Curve> Util), và tôi cũng thay đổi hướng của cạnh đầu với <Flip> (Curve> Util) bởi vì tôi biết rằng các đường cong cạnh dưới và cạnh trên là không cùng một hướng. Tôi sử dụng component <divide> để phân chia các đường cong cạnh và tạo ra nhiều điểm. (Chúng ta có thể sử dụng một component <divide> nhưng tôi không muốn làm cho nó phức tạp).
103
HÌnh.5.36. Một component <line> được sử dụng để kết nối tất cả các điểm phân chia với tất cả các điểm được offset ở đường dưới . <line> Khác được sử dụng để kết nối tất cả các điểm phân chia đầu tiên với các điểm tiếp theo của chúng trong danh sách (thay đổi bù đắp = 1).
Hình.5.37. bây giờ nếu tôi sử dụng các component <line> <loft>, bạn sẽ thấy rằng một surface được tạo ra mà không như thiết kế của tôi, thậm chí sử dụng component <weave> cũng không giúp đỡ được trong tình huống này.
104
HÌnh.5.38. tìm kiếm tại <param viewer> của các component <line>, chúng ta có thể thấy rằng cả hai component chỉ có một nhánh dữ liệu và khi loft , nó nối tất cả chúng lại với nhau mà không tách ra thành nhiều line. Nhưng ở đây chúng tôi muốn những line nằm trong danh sách dữ liệu khác để được coi là dữ liệu duy nhất để khi loft, chúng trở thành những cặp line.
Hình.5.39. Để giải quyết vấn đề này ở đây tôi sử dụng một component hữu ích đó là <Graft> (Logic> Tree> Graft Tree). Bạn có thể thấy, kết quả của component này là danh sách dữ liệu trong cả hai component <line> được chia thành các nhánh, một nhánh cho mỗi mục trong danh sách. Bây giờ component <loft> nối mỗi line từ danh sách các dữ liệu đầu tiên với một line liên kết trong danh sách dữ liệu thứ hai. Và chúng ta thấy rằng kết quả là một surface hình học giống với phác thảo.
105
Ở đây, với ví dụ đầu tiên, chúng ta phải sắp xếp dữ liệu trong các nhánh khác nhau để có được kết quả là nhiều đường hình học nếu như nó không chỉ có một surface liên tục.
Hình .5.40. Ở đây tôi phải nhắc nhở bạn một lần nữa rằng nếu bạn muốn vẽ một đường cong nội suy trên từ các điểm cụ thể mà bạn chọn ra trên các surface như thế này, vì tất cả các surface này nằm trong các nhánh khác nhau nên dữ liệu và kết quả đánh giá các điểm sẽ là nhánh khác nhau của dữ liệu thì để vẽ một đường cong tốt , bạn cần phải <Flatten> danh sách dữ liệu một lần nữa, tạo ra một nhánh dữ liệu điểm và nội suy vẽ ra đường cong bạn cần .
Vấn đề là nhận ra rằng trong các component khác nhau và các tình huống thiết kế, chúng ta phải cung cấp dữ liệu cho các nhánh hoặc cho một nhánh, có vài component trong Logic> Tree giúp chúng ta làm như vậy.
Hình.5.41. Mô hình cuối .
106