我试图在 MatPlotLib 中画一条线,并根据斜率找到该线上方或下方的所有点。
读完这篇文章后post ,并阅读有关叉积的内容,我相信这是我检查要点的最佳方法。
我不确定在 python 中实现此功能的最佳方法是什么。
v1 = {x2-x1, y2-y1} # Vector 1
v2 = {x2-xA, y2-yA} # Vector 2
xp = v1.x*v2.y - v1.y*v2.x # Cross product
有人尝试过实现类似的东西吗?
还有其他方法可以让我找到绘图上的点是在 MatPlotLib 中的线上方还是下方吗?
最佳答案
正如所见,例如在 this question叉积确实可以用来确定一个点是位于由两点定义的线的上方还是下方。
因此,让 a
和 b
是定义一条线的两个点,而 p
是我们要定义的一个(一组)点想知道与线的相对位置。那么如果
numpy.cross(p-a, b-a) < 0
如果True
,则点位于直线之上。
这里准确地说,“上方”是指从点a
向b
看,点p
位于线。
这可用于对散点图中的点进行不同的着色,具体取决于它们是在线上方还是下方,如下所示:
import numpy as np
import matplotlib.pyplot as plt
isabove = lambda p, a,b: np.cross(p-a, b-a) < 0
a = np.array([1,1])
b = np.array([4,3])
p1 = np.array([2,4])
p2 = np.array([3,1])
p = np.array([p1,p2])
fig, (ax,ax2) = plt.subplots(ncols=2, sharex=True, sharey=True)
ax.plot([a[0],b[0]],[a[1],b[1]], marker="o", color="k")
ax.scatter(p[:,0],p[:,1], c=isabove(p,a,b), cmap="bwr", vmin=0, vmax=1)
p = np.random.rand(10,2)*5
ax2.plot([a[0],b[0]],[a[1],b[1]], marker="o", color="k")
ax2.scatter(p[:,0],p[:,1], c=isabove(p,a,b), cmap="bwr", vmin=0, vmax=1)
ax.set_xlim(0,6)
ax.set_ylim(0,6)
plt.show()
关于python - 查找叉积以查找 MatplotLib 中线上方/下方的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766534/