<p>我编写了一个函数,它在点列表中查找正方形的点,如果存在,则返回四个点,如果不存在,则返回<code>None</code>。对于列表中的任意两点,它首先计算它们的差值并将此向量旋转90度。然后检查点1+此向量<strong>和</strong>点2+此向量<strong>或</strong>点1-此向量<strong>和</strong>点2-此向量是否在列表中,如果是这样,则返回它们。<code>diffRotated.any()</code>只是为了确保点1和点2不相同。你知道吗</p>
<pre><code>def findSquare(points):
for i, point1 in enumerate(points):
for point2 in points[i+1:]:
diffRotated = np.array([point2[1]-point1[1], point1[0]-point2[0]])
if (diffRotated.any() and np.any(points == point1 + diffRotated) and np.any(points == point2 + diffRotated)):
return np.array([point1, point2, point1 + diffRotated, point2 + diffRotated])
elif(diffRotated.any() and np.any(points == point1 - diffRotated) and np.any(points == point2 - diffRotated)):
return np.array([point1, point2, point1 - diffRotated, point2 - diffRotated])
return None
</code></pre>
<p>为了进行测试,我在列表中添加了两个条目,以便它们与列表中的另外两个点形成一个正方形:</p>
<pre><code>points = np.array([[141, 265],
[148, 176],
[136, 360],
[233, 358],
[192, 218],
[130, 465],
[145, 167],
[ 94, 214]])
print(findSquare(points))
# array([[141, 265],
# [192, 218],
# [ 94, 214],
# [145, 167]])
print(findSquare(points[:-1]))
# None
</code></pre>
<p>如果你想得到所有的方块,你需要修改我的代码并检查每个方块只返回一次。此外,这段代码不是很有效,可能有一种方法,我还没有想到这样做在一个numpy时尚的方式。你知道吗</p>