Dòng tới đa giác


11

Tôi đã không tìm thấy "tên" của thuật toán cho phép một người chuyển đổi các dòng thành đa giác. Vì vấn đề này vượt qua GIS và các lĩnh vực hình học tính toán và khoa học máy tính. Tôi không chắc chắn những gì khác để thêm vào hỗn hợp. Tôi miễn cưỡng cung cấp một danh sách những gì tôi đã tìm kiếm vì tôi cũng muốn biết những gì người khác sẽ xem xét lựa chọn đầu tiên của họ về tiêu chí tìm kiếm.

Kịch bản ... Tôi có các dòng (cần hai điểm để tạo một dòng) ... mỗi dòng được kết nối với ít nhất một dòng khác. Không gian giao thoa giữa các đường được kết nối sẽ tạo thành một đa giác. Kịch bản đơn giản nhất sẽ là một hình tam giác ... một hình chữ nhật ... và người ta có thể vượt ra ngoài các tính năng đa phân đoạn.

Xin lỗi vì bất kỳ mô tả mơ hồ nào, nhưng như tôi đã nói, tôi không muốn hướng dẫn các giải pháp khả thi theo một con đường mà tôi đã truy cập, vì tôi quan tâm đến "suy nghĩ đầu tiên" nhiều như một giải pháp cuối cùng.


Đường thẳng có thể trùng nhau không? Đường có thể cắt nhau không? (tức là nó có sạch không?) Nếu vậy, tôi hy vọng việc gọi quy trình này Build sẽ không quá cụ thể cho ứng dụng.
Kirk Kuykendall

Các dòng trùng hợp Kirk và các "lỗi" khác sẽ bị xóa trước khi xây dựng các đa giác ... Tôi đang cố gắng tìm "tên thuật toán" mà tôi chắc chắn đã được triển khai trong các gói GIS khác nhau (ví dụ như arcgis). Vì vậy, trong ngắn hạn, hãy xem xét rằng tất cả các điều kiện thoái hóa đã được xử lý và bạn còn lại với các dòng sạch (2 dòng điểm) trùng với các nút mà bạn sẽ có thể xây dựng các đa giác. Điều quan trọng là các dòng tồn tại, không có điều kiện suy biến và không gian can thiệp cần phải được chuyển đổi thành đa giác. Cảm ơn

Là các điểm trên một mặt phẳng hoặc trên một hình cầu?
Kirk Kuykendall

Kirk ... Trên mặt phẳng, tọa độ x, y, không phải tọa độ hình cầu. Ví dụ: giả sử bạn có các phân đoạn dòng sẽ tạo thành sơ đồ voronoi, nhưng tất cả những gì bạn có là các phân đoạn tạo thành nó nhưng không phải là cấu trúc dữ liệu thực tế dẫn đến nó. Nói tóm lại, mọi phân khúc đều được kết nối và mọi phân khúc là duy nhất.

Câu trả lời:


4

Có lẽ "điền vào khu vực"? Xem ở đâyở đây .

Biên tập

Một khả năng khác là triangulation bị hạn chế . (Liên kết là một applet Java cho phép bạn vẽ biểu đồ bằng chuột và sau đó minh họa thuật toán quét mặt phẳng để vẽ hình tam giác.) tạo các đa giác mong muốn: chỉ cần hợp nhất tất cả các hình tam giác lân cận có chung cạnh mới được tạo.

Thí dụ

Biểu đồ gốc:

Biểu đồ gốc

Biểu đồ tam giác:

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


Bill sẽ đi bầu chọn vì tôi đã không bắt gặp rằng ... không muốn giới hạn các nhận xét khác từ mọi người trong các lĩnh vực khác nhau.

Mặc dù, phần lớn là đối phó với raster, đây là câu trả lời gần nhất. Tôi vẫn không có tên thuật toán trừ khi được gắn vào raster hoặc vector nhưng thuật toán "quét" có thể đủ, nhưng tôi không thể hiểu được cuộc sống của tôi tại sao tọa độ sẽ được sắp xếp theo Y thay vì X ( đó là dễ dàng để thực hiện trong hầu hết các ngôn ngữ).

@Dan Sắp xếp theo y hoặc x là không quan trọng, như bạn đề xuất. Bạn cũng đúng rằng các thuật toán quét mặt phẳng hoặc quét đường thẳng có liên quan, nhưng thật không may, đây là một kỹ thuật chung bao gồm hầu hết tất cả các quy trình hình học tính toán, vì vậy đây không phải là một thuật ngữ phù hợp để tìm kiếm cụ thể cho thuật toán của bạn. Lưu ý rằng vấn đề cụ thể này không hoàn toàn là lý thuyết đồ thị, bởi vì nó liên quan đến việc nhúng phức hợp polyline vào một mặt phẳng (hoặc hình cầu), và vì vậy một thuật toán tốt phải duy trì thông tin về việc nhúng: đó là lý do tại sao nó thực sự là một vấn đề lấp đầy khu vực Từ trái tim.
whuber

5

Trong lý thuyết đồ thị , hoạt động này được gọi là tính toán khuôn mặt . Nó liên quan đến tính toán kép của một đồ thị đã cho.

Ví dụ, trong thư viện java GeOxygène , một biểu đồ (được gọi là CarteTopo ) có một phương thức getFaces để lấy khuôn mặt của nó .

Điều này được gọi là đa giác trong JTS


Liên kết tốt. Tuy nhiên, tất cả đều cho rằng vấn đề của @ Dan đã được giải quyết: có thể gọi biểu đồ là "mặt phẳng" nghĩa là bạn đã xác định được các mặt đa giác. Anh ta muốn biết làm thế nào người ta chuyển đổi một tập hợp các cung tròn tùy ý (trong mặt phẳng) thành một biểu đồ phẳng trung thực đến tốt ở vị trí đầu tiên. Điều này đòi hỏi phải xây dựng một đại diện cho "cấu trúc liên kết" của nó, chẳng hạn như DCEL.
whuber

Cảm ơn rất nhiều whuber, bạn là một nguồn kiến ​​thức! Tôi tự hỏi làm thế nào ai đó có thể rất rực rỡ.
Julien

4

Phần mềm máy chủ RepRap chuyển đổi danh sách các phân đoạn dòng (theo một số thứ tự ngẫu nhiên không xác định) thành một danh sách đa giác, âm thanh tương tự như những gì bạn đang cố gắng thực hiện.

Cụ thể, thuật toán "kết thúc khớp" RepRap xử lý một loạt các trường hợp bệnh lý.

Than ôi, phần mềm RepRap giả định rằng mọi góc đều có số cạnh chẵn đi tới - 2 dòng đi đến một góc trên một vật thể bình thường; 4 dòng đi cùng nhau khi góc của một đối tượng chạm vào góc của một đối tượng khác, v.v. Tôi không biết việc điều chỉnh thuật toán này sẽ khó đến mức nào để xử lý các sơ đồ voronoi, thường có 3 cạnh đi đến mọi góc.


+1 Tìm thấy thú vị! Mặc dù vậy, hãy coi chừng: mặc dù phần mềm này có khả năng giải quyết nhiều vấn đề liên quan đến việc kết nối các đường dây thành đa giác, nhưng nó có thể làm quá nhiều : có vẻ như nó cũng cố gắng đơn giản hóa các tính năng, đây có thể là một tác dụng phụ không mong muốn. (Ví dụ: nó có thể phá hủy tính toàn vẹn tôpô.)
whuber

3

Bạn đã khám phá cơ sở mã của GRASS để tìm giải pháp cho vấn đề của mình chưa? -> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html


1
Cảm ơn ... nhưng tôi không tìm kiếm một giải pháp "đóng gói" cụ thể mà là thuật toán cơ bản và / hoặc tên của nó sẽ xuất hiện trong các lĩnh vực khác nhau của GIS, Comp Geom và / hoặc Comp Sci ... tiếp tục các ý tưởng

Tôi đã suy nghĩ về việc xem xét cụ thể mã nguồn đằng sau 2 quy trình được đề cập trong liên kết của tôi có thể giúp bạn.
oeon

Tôi đoán tôi sẽ phải cài đặt phần mềm để xem mã vì tôi không thấy bất kỳ danh sách nào trên các trang đó trừ khi tôi thiếu thứ gì đó.

1
Bạn có thể duyệt nguồn GRASS trực tuyến: trac.osgeo.org/grass/browser
Underdark

@underdark Cảm ơn con trỏ. Theo như tôi có thể nói từ main.ctrong v.typenguồn, tất cả những gì xảy ra là các tính năng được dán nhãn lại dưới dạng ranh giới: không có xử lý thực tế xảy ra. Nhìn lại, điều này không quá ngạc nhiên: nếu (tôi không biết chắc) các tính năng được duy trì với thông tin tô pô 2D đầy đủ, thì tất cả các tính toán để xác định các vùng đa giác đã tự động diễn ra trong quá trình tạo hoặc nhập tính năng và được giữ lại trong suốt tất cả các hoạt động xử lý địa lý.
whuber

3

Ê

Tôi không nghĩ những gì bạn đang tìm kiếm là một thuật toán cụ thể. Nhiệm vụ có thể khá khó khăn hoặc rất đơn giản tùy thuộc vào tập dữ liệu của bạn.

Bạn nên chia vấn đề thành ít nhất 2 phần. 1) là một vấn đề mạng nhiều hơn, làm thế nào để tìm các vòng khép kín của linestrings. 2) biểu thị linestring kín dưới dạng đa giác

Phần thứ hai, "chuyển đổi dòng thành đa giác" phụ thuộc nhiều vào định dạng hơn so với biểu diễn đa giác / linestring. Ý tôi là đi từ:

LINESTRING (1 1, 2 2)
LINESTRING (2 2, 2 1)
LINE LINEING (2 1, 1 1)

đến:
POLYGON ((1 1,2 2,2 1,1 1))

Tôi đang chuyển đổi dòng thành đa giác, nhưng không phải là những gì bạn đang nói về tôi đoán. Phần khó hơn là phần đầu tiên. Nếu bạn có một spaghetti của dòng, làm thế nào để đặt chúng là linestrings đóng.

Tôi đoán câu trả lời cho câu hỏi đó phụ thuộc rất nhiều vào bộ dữ liệu. Như Kirk yêu cầu, nếu các dòng có thể vượt qua vấn đề lớn hơn nhiều. Nếu bạn biết rằng tất cả "bộ sưu tập dòng" là một phần của dòng dõi đóng, nó sẽ trở nên dễ dàng hơn. Sau đó, bạn có thể lấy bất kỳ dòng nào và đi theo cách của bạn xung quanh con đường cho đến khi bạn quay lại lần nữa và sau đó chuyển sang bước hai ở trên.

Quan điểm của tôi là điều kiện của bộ dữ liệu đặt ra tất cả các quy tắc về cách thực hiện. Nếu bạn muốn tìm tất cả các đa giác có thể có trong một spaghetti của linestrings, tôi cho rằng sẽ phải có rất nhiều thuật toán khác nhau liên quan để đặt các điểm đỉnh trong tất cả các giao điểm, tìm kiếm tất cả các đường có thể, v.v.

Trong PostGIS, hàm được gọi là ST_Polygonize Hàm đó tạo ra tất cả các đa giác có thể từ các chuỗi mà bạn cung cấp cho nó.

Điều đó được thực hiện bởi GEOS để bạn có thể tìm thấy các thuật toán phía sau trong cả mã GEOS và JTS.

Chỉ là một vài suy nghĩ

/ Nicklas


1

Bạn có thể thử tìm kiếm thuật toán "Ngôi sao chuyển tiếp". Tôi đã nói nó là chung chung, nhưng các cuộc thảo luận duy nhất về nó tôi từng đọc luôn liên quan đến arcgis. Có thể nhìn vào các tài liệu tham khảo được trích dẫn trong các ghi chú bài giảng cho ngôi sao phía trước.


1
Tôi sẽ bình luận ở đây, mặc dù bình luận này cũng đề cập đến một số giải pháp khác được đề xuất: vấn đề không thể được trình bày trong một mạng (hoặc biểu đồ). Nó đòi hỏi thông tin về cách các đường được kết nối trong một bề mặt hai chiều . Do đó, các biểu diễn sao tiến / lùi sẽ ít được sử dụng; một DCEL hoặc một cái gì đó giống như nó là cần thiết.
whuber

@whuber - Tôi đã giả sử rằng nhận xét của Dan rằng tất cả "lỗi" đã bị xóa ngụ ý rằng các dòng này là sạch sẽ. Như vậy, có thể giảm vấn đề này thành vấn đề truyền tải đồ thị về việc tìm tất cả các chu kỳ trong biểu đồ. Lúc đầu, tôi nghĩ ngôi sao Chuyển tiếp sẽ hỗ trợ các thuật toán đi xung quanh một biểu đồ thực hiện rẽ phải sắc nét nhất có thể tại mỗi nút. Tuy nhiên, nhìn một chút nữa nó xuất hiện có những cách tốt hơn. stackoverflow.com/questions/261573/ Mạnh Tuy nhiên, vấn đề giả định này có thể được nêu lại dưới dạng biểu đồ.
Kirk Kuykendall

1
Tìm chu kỳ trong đồ thị không giống như tìm mặt trong đồ thị phẳng. Hãy xem xét đồ thị trừu tượng với các đỉnh {a, b, c, d} và các cạnh {a, b}, {a, c}, {b, c}, {b, d}, {c, d}. Một cơ sở cho các chu trình bao gồm a-> b-> d-> c-> a và a-> b-> c-> a. Trong mặt phẳng nhúng a -> (0,1), b -> (2,2), c -> (2,0), d -> (3,1) (trong đó tất cả các cạnh là các đoạn thẳng), chu trình a-> b-> d-> c-> a không phải là một khuôn mặt, nhưng nếu chúng ta di chuyển d đến (1,1), thì đó một khuôn mặt. Điều này cho thấy tại sao khái niệm "khuôn mặt" đòi hỏi đồ thị phải được nhúng trong mặt phẳng và tại sao các mặt không thể được tính toán hoàn toàn từ cấu trúc trừu tượng của đồ thị.
whuber
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.