Tôi đã tự mình tìm ra, do đó, đây là giải thích cho bất kỳ ai trong tương lai bị nhầm lẫn bởi điều này.
Như một ví dụ, chúng ta hãy sử dụng mạng đơn giản của các điểm mà tôi đã làm việc với trong mã của tôi, mà tôi tạo ra như sau
import numpy as np
import itertools as it
from matplotlib import pyplot as plt
import scipy as sp
inputs = list(it.product([0,1,2],[0,1,2]))
i = 0
lattice = range(0,len(inputs))
for pair in inputs:
lattice[i] = mksite(pair[0], pair[1])
i = i +1
chi tiết ở đây không thực sự quan trọng, đủ để nói nó tạo ra một tam giác đều đặn mạng, trong đó khoảng cách giữa một điểm và bất cứ sáu người hàng xóm gần nhất là 1.
Để vẽ nó
plt.plot(*np.transpose(lattice), marker = 'o', ls = '')
axes().set_aspect('equal')
Bây giờ tính toán tam giác:
dela = sp.spatial.Delaunay
triang = dela(lattice)
Hãy xem xét điều này cho chúng ta.
triang.points
đầu ra:
array([[ 0. , 0. ],
[ 0.5 , 0.8660254 ],
[ 1. , 1.73205081],
[ 1. , 0. ],
[ 1.5 , 0.8660254 ],
[ 2. , 1.73205081],
[ 2. , 0. ],
[ 2.5 , 0.8660254 ],
[ 3. , 1.73205081]])
đơn giản, chỉ là một mảng của tất cả chín điểm trong mạng được minh họa ở trên. Làm thế nào chúng ta hãy xem xét:
triang.vertices
đầu ra:
array([[4, 3, 6],
[5, 4, 2],
[1, 3, 0],
[1, 4, 2],
[1, 4, 3],
[7, 4, 6],
[7, 5, 8],
[7, 5, 4]], dtype=int32)
Trong mảng này, mỗi hàng đại diện cho một simplex (tam giác) trong tam giác. Ba mục trong mỗi hàng là các chỉ số của các đỉnh của đơn vị đó trong mảng điểm mà chúng ta vừa thấy. Vì vậy, ví dụ như simplex đầu tiên trong mảng này, [4, 3, 6]
gồm các điểm:
[ 1.5 , 0.8660254 ]
[ 1. , 0. ]
[ 2. , 0. ]
của nó dễ dàng nhận thấy điều này bằng cách vẽ các mạng trên một mảnh giấy, ghi nhãn mỗi điểm theo chỉ số của nó, và sau đó truy tìm qua mỗi hàng trong triang.vertices
.
Đây là tất cả thông tin chúng tôi cần để viết hàm tôi đã chỉ định trong câu hỏi của mình. Có vẻ như:
def find_neighbors(pindex, triang):
neighbors = list()
for simplex in triang.vertices:
if pindex in simplex:
neighbors.extend([simplex[i] for i in range(len(simplex)) if simplex[i] != pindex])
'''
this is a one liner for if a simplex contains the point we`re interested in,
extend the neighbors list by appending all the *other* point indices in the simplex
'''
#now we just have to strip out all the dulicate indices and return the neighbors list:
return list(set(neighbors))
Và đó là nó! Tôi chắc chắn rằng chức năng trên có thể làm với một số tối ưu hóa, nó chỉ là những gì tôi đã đưa ra trong một vài phút. Nếu bất cứ ai có bất cứ đề nghị, cảm thấy tự do để gửi chúng. Hy vọng rằng điều này sẽ giúp ai đó trong tương lai, những người đang bối rối về điều này như tôi.
Không sao, tôi đã tự tìm ra! –
Trên Stack Overflow, chúng tôi hỗ trợ mọi người [trả lời câu hỏi của họ] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Bạn có thể nỗ lực để trả lời câu hỏi của riêng bạn và đánh dấu câu hỏi đó là đã được giải quyết (bằng cách đánh dấu vào dấu kiểm ở bên trái của bài trả lời của bạn)? – Sicco
cố gắng, rõ ràng người dùng w/ít hơn 10 danh tiếng không thể trả lời câu hỏi của riêng họ trong 8 giờ sau khi đăng bài:/Tôi sẽ lưu những gì tôi đã viết trong một tệp txt và đợi cho đến tối nay đăng nó. –