Tạo lưới cho máy phát điện thành phố thủ tục


7

Tôi có một vấn đề lập trình liên quan đến việc tạo lưới cho lưới thành phố. Gần đây tôi đã tạo ra một máy phát điện lưới thành phố và tôi đã có thể tạo ra lưới đường cho mạng lưới mà hệ thống của tôi phát ra một cách đáng tin cậy. Tuy nhiên, bây giờ tôi bị mắc kẹt với việc tìm kiếm một phương pháp để tạo ra các lô và khoảng trống ở giữa các con đường. Cuối cùng, tôi muốn lưới thành phố có sự thay đổi độ cao và vì thế, tôi cần có khả năng lấp đầy khoảng trống giữa các con đường.

Đây là một ví dụ về những gì tôi có:Đầu ra bóng và khung dây

Tôi đã xem xét các phương pháp tam giác như Delauney Triangulation, nhưng đầu ra không đáng tin cậy (có thể do cách tôi đang sử dụng nó). Đây là một ví dụ khác cho thấy vấn đề (các đường màu đen là lưới đường, các đường màu đỏ là đầu ra Delauney):

nhập mô tả hình ảnh ở đây

Đối với hầu hết các phần, đầu ra Delauney theo lưới khi tôi trình bày nó chỉ với các đỉnh tạo nên các giao điểm. Tuy nhiên, đôi khi, các hình tam giác Delauney chồng lên nhau từ lưới đường (giống như với đường rộng ở trung tâm của hình ảnh). Tôi đang sử dụng một cổng as2Delauney cho Unity và tôi chỉ cần tạo một danh sách tất cả các đỉnh tạo nên các giao điểm và sau đó chuyển nó đến hàm Delauney và tôi tự hỏi liệu có điều gì tôi cần xem xét trước khi vượt qua một loạt các điểm và hãy để hàm sắp xếp nó ra

Có bất kỳ cân nhắc đặc biệt nào tôi cần lưu ý khi sử dụng Delauney cho loại hình tam giác này không, hoặc có bất kỳ phương pháp nào khác mà tôi có thể sử dụng để tạo phần điền cho lưới đường không?

Tôi đã nghĩ về việc xây dựng một chức năng cố gắng đi theo các giao lộ theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ cho đến khi nó lặp lại từ đầu, nhưng điều đó sẽ dẫn đến các vòng lặp vô hạn vì một số con đường là ngõ cụt.

Ngay bây giờ tôi không thực sự chắc chắn những gì cần tìm vì tôi thiếu thuật ngữ và google đã không mang lại kết quả như các phương pháp mà tôi có thể sử dụng để tạo ra các phần bổ trợ cho lưới đường (tuy nhiên có một số thứ tốt trong việc tạo thành phố, tuy nhiên thì không trên phần lưới).

Có ai có bất cứ kinh nghiệm với điều này?

Chỉnh sửa: Đây là cách hệ thống của tôi hoạt động:

Về cơ bản, tôi sử dụng một danh sách mở các dòng để phát triển mạng của mình và tôi kiểm tra các dòng chống lại một loạt các ràng buộc. Sau đó, tôi đi qua từng dòng và tôi tạo các giao điểm cho mỗi điểm bắt đầu và điểm cuối. Vì vậy, nếu kết thúc / bắt đầu đã có trong danh sách của tôi, tôi thêm điểm khác làm điểm đến cho giao lộ hiện tại.

Tôi kết thúc với một danh sách các đối tượng tùy chỉnh giữ vectơ vị trí của riêng chúng và tất cả các vectơ vị trí của các giao điểm mà nó kết nối. Sau đó, tôi tạo các điểm lưới cho giao lộ bằng cách kiểm tra các điểm cắt của các đường tạo thành hai bên đường, vì vậy tôi có các điểm đó theo ý của mình và tôi sử dụng chúng để tạo các hình tam giác cho lưới của mình.

Bây giờ tôi chỉ cần biết cách tổ chức chúng để tạo ra các phần tử điền vào nhiều giao lộ.


1
Bạn có thể sử dụng lại tọa độ lưới được tạo bởi trình tạo lưới đường không? Tôi nghĩ rằng để giúp giải quyết vấn đề của bạn, chúng tôi cần biết thêm về cách trình tạo của bạn hoạt động và cấu trúc dữ liệu trung gian nào có sẵn.
Philipp

Câu trả lời:


1

Có một biến thể của tam giác delaunay: Tam giác delaunay bị ràng buộc cho phép bạn xác định các cạnh không bao giờ được lật, ví dụ trong trường hợp sử dụng của bạn, các cạnh thuộc về đường.

Thật không may, trong đầu tôi, đối với các thư viện triển khai delaunay bị ràng buộc, tôi chỉ có thể đề cập đến CGAL, đó là C ++ và được phát hành theo GPL: http://doc.cgal.org/Manual/3.3/doc_html/cgal_manual/Triangulation_2_Vf/Class_Con html

Điều đó sẽ cho phép bạn sắp xếp đúng các không gian giữa các con đường mà không làm hỏng đa giác đường. Sau đó, bạn có thể sử dụng một cái gì đó giống như các phương pháp được mô tả trong "Tạo thế hệ thủ tục trong mô hình hóa đô thị" của P. Cignoni và T. Ertl ( https://www.cs.purdue.edu/cgvlab/ con / alaga / eeg2012.pdf ) để chia các khối thành phố kết quả thành bưu kiện.

TL; DR: Một trong những thuật toán đơn giản hơn được trình bày trong bài viết như sau:

Đối với mỗi không gian giữa các đường: tạo hộp giới hạn định hướng (OBB), chia đa giác dọc theo trục dài nhất, lặp lại cho các OBB nhỏ hơn cho đến khi đạt yêu cầu. Sau đó đặt các tòa nhà để nếm thử.


1

Vấn đề

Bạn cần sự nhất quán trong hệ thống / cấu trúc dữ liệu của bạn. Từ hình ảnh của bạn, có vẻ như bạn:

  1. Tạo những điều cơ bản trên một mảng lưới / 2D thông thường, trong đó bạn có mcác đỉnh ngang và ncác đỉnh xuống cho một m x nlưới. Sau đó, bạn có các m-1kẽ trên và n-1xen kẽ xuống. (Điều này chỉ tính đến các giao lộ, không phân chia mỗi đường thành 2 đoạn. Nó cũng không chứa các phần mở rộng / bao gồm - xem "đường cao tốc", bên dưới.)
  2. Chia mỗi đoạn đường thành 2 rạch / 4 tris. Tôi nghĩ để hỗ trợ những con đường cong (xem bước tiếp theo).
  3. Làm phiền các điểm kết quả này hoặc áp dụng một phép biến đổi trên toàn bộ không gian. Điều này mang lại độ cong tinh tế cho các phần thành phố khác nhau.
  4. Cố gắng che phủ các lô (kẽ) lưới, trên phần còn lại.

Vấn đề kết quả:

  1. Bạn không theo dõi các phần tách đó ở bước 2, trong mảng cơ sở của bạn. Bằng cách thêm các phần tách này, bạn đã nhân đôi số điểm, nhưng mảng cơ sở không phản ánh các đỉnh mới được tạo . Vì vậy, ở bước 4 ở trên, bạn không khớp chính xác các đỉnh.
  2. Dường như bạn có một "đường cao tốc" đặc biệt chạy qua thị trấn, điều này không được phản ánh trong cấu trúc dữ liệu ban đầu mà bạn đang sử dụng để tạo lưới lô / kẽ.
  3. Sử dụng một mảng 2D làm dữ liệu cơ sở của bạn, bạn có được các giao cắt mà bạn có thể không muốn chúng.

nhập mô tả hình ảnh ở đây

Để làm rõ hơn, tôi đã chồng một số dòng phân chia trên các kẽ ( [0]trong giải pháp, bên dưới):

nhập mô tả hình ảnh ở đây

Giải pháp

Bạn cần một cấu trúc dữ liệu trung gian có thể chứa các bổ sung trường hợp đặc biệt của bạn (chia mỗi đoạn đường thành 2 đường / 4 tris và tạo đường cao tốc sau khi tạo lưới tổng thể). Bạn nên sử dụng biểu đồ , trong đó mỗi nút đại diện không phải là giao lộ đường , mà là bất kỳ đường nào chúng ta có thể phân chia các đoạn đường và trong đó mọi cạnh thể hiện một đoạn đường, ví dụ:

[I]--[0]--[I]--[0]--[0]--[0]--[I]->
 |Lot1     |Lot2               |
[0]       [0]                 [0]
 |         |                   |
[I]--[0]--[I]--[0]--[0]--[0]--[I]->
 |         |                   |
 V         V                   V

[0]= chia nhỏ trên đường, về cơ bản chúng là các đỉnh nơi bạn chia mỗi đoạn đường thành 2 hình chữ nhật. [I]= nút giao. Lưu ý rằng bên trên và bên dưới Lot2, có 4 đoạn đường, không chỉ 2. Đây là để minh họa cách bạn có thể thêm đường cao tốc chạy qua, bằng cách thay thế nút:

[I]--[0]--[I]--[0]--[I]--[0]--[I]->
 |Lot1     |Lot2     + Lot3    |
[0]       [0]       [0]       [0]
 |         |         +         |
[I]--[0]--[I]--[0]--[I]--[0]--[I]->
 |         |         +         |
 V         V         V         V

Hoặc bạn có thể thêm nó vào tập tin nút hiện tại thay vì thay thế :

[I]--[0]--[I]--[0]--[0]--[I]--[0]--[I]->
 |Lot1     |Lot2          + Lot3    |
[0]       [0]            [0]       [0]
 |         |              +         |
[I]--[0]--[I]--[0]--[0]--[I]--[0]--[I]->
 |         |              +         |
 V         V              V         V

Cuối cùng, bạn có thể để mỗi nút trong số này trỏ đến "nút rất nhiều" có mục đích đặc biệt ở trung tâm:

[I]--[0]--[I]
 | \     / |
[0]-[L1]--[0]
 | /     \ | 
[I]--[0]--[I]

Từ biểu đồ đã nói ở trên, được tạo đầy đủ (bao gồm cả đường cao tốc), sau đó bạn có thể tạo các mắt lưới của mình. Ghi nhớ: Cập nhật dữ liệu / Mô hình trước (ở trên), sau đó xem (thông tin lưới); làm thế nào bạn kiểm tra chéo bổ sung của bạn trong giai đoạn thứ hai, là hoàn toàn khác biệt với những vấn đề bạn đang phải đối mặt.

Cuối cùng, bạn có thể thực sự muốn một lưới duy nhất đại diện cho mọi thứ, rất nhiều và đường. Chỉ các tòa nhà có thể sẽ được giữ riêng biệt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.