如何检查2个段是否相交?
我有以下数据:
Segment1 [ {x1,y1}, {x2,y2} ]
Segment2 [ {x1,y1}, {x2,y2} ]
Run Code Online (Sandbox Code Playgroud)
我需要在python中编写一个小算法来检测2条线是否相交.
更新:
我如何使用numpy来计算两个线段之间的交点?
在代码中我有segment1 =((x1,y1),(x2,y2))和segment2 =((x1,y1),(x2,y2)).注意段1不等于segment2.所以在我的代码中我也一直在计算斜率和y截距,如果可以避免这种情况会很好但我不知道如何.
我一直在使用Cramer的规则和我在Python中编写的函数,但我想找到一种更快的方法.
我正在尝试编写一个函数来处理我正在编程的游戏中的运动。我几乎拥有的作品,但是在某些情况下它崩溃了。
我已经编写了一个最小的说明性示例,如下所示。在此示例中,我试图计算由点表示的对象的移动和运动矢量。根据一组多边形检查该对象的移动路径,这些多边形被细分为线段以进行测试。当此对象与线段碰撞时,我希望它沿该线段滑动(而不是停下来或反弹)。
为此,我沿着预期的碰撞路径进行检查,如果找到了相交点,则沿着相交的线段的路径从该相交点进行新的测试,并计算其余运动的幅度。
当我们沿着线段滑入“口袋”时,就会出现问题。通常,碰撞检查会通过形成凹穴的两个线段,并且物体会滑过。因为我平行于一个线段行进,并且在端点处与两个线段相交,所以我认为此问题是由浮点错误引起的。它是否通过,被捕获或被捕获一次,然后在第二次检查中通过都似乎完全是随机的。
我正在使用在这里找到的简单算法来计算交集:https : //stackoverflow.com/a/20679579/4208739,但是我也尝试了许多其他算法。都表现出相同的问题。
(Vector2是Unity库提供的类,它仅将x和y坐标保存为浮点数。Vector2.Dot函数仅计算点积)。
//returns the final destination of the intended movement, given the starting position, intended direction of movement, and provided collection of line segments
//slideMax provides a hard cap on number of slides allowed before we give up
Vector2 Move(Vector2 pos, Vector2[] lineStarts, Vector2[] lineEnds, Vector2 moveDir, int slideMax)
{
int slideCount = 0;
while (moveDir != Vector2.zero && slideCount < slideMax)
{
pos = DynamicMove(pos, lineStarts, lineEnds, moveDir, out moveDir);
slideCount++; …Run Code Online (Sandbox Code Playgroud) 我试图获得图像上的屏幕(显示)的 4 个角。我有两张从同一位置拍摄的图像(所以我认为好的起点是提取两张图像/第一和第二图像/之间的差异)。只是屏幕上的图像发生了变化。所以我想获得显示屏角的上/左下/右(X,Y)坐标。
我正在使用带有 cv2 和 numpy 的 python 2.7(如果可能不使用其他模块)。不幸的是,我不知道如何获得这些坐标。
请问有什么想法吗?PS示例代码会很棒并且非常感谢,非常感谢
最后结果:
我正在从一组点计算voronoi图,如下所示:
from scipy.spatial import Voronoi
import numpy as np
np.random.seed(0)
points = np.random.uniform(-0.5, 0.5, (100, 2))
// Compute Voronoi
v = Voronoi(points)
voronoi_plot_2d(v)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这将创建如下图像:
可以看出,这是创建无限远(虚线)的顶点,也是创建点的原始边界框之外的顶点:
bbox = np.array([[-0.5, -0.5], [0.5, -0.5], [0.5, 0.5], [-0.5, 0.5]])
Run Code Online (Sandbox Code Playgroud)
我想要做的是将voronoi图剪辑到此边界框,即将出界和无限顶点投影到此边界框上的适当位置.因此,需要重新排列顶点并将其投影回来自无限远或有限顶点的适当交叉点,但这些顶点超出了剪切区域的界限.
我有两个数据集:(x,y1)和(x,y2)。我想找到两条曲线相互交叉的位置。目标类似于此问题:在Python中将两个图形相交,找到x值:
但是,此处描述的方法仅找到最接近的数据点的交点。我想找到比原始数据间距更高精度的曲线的交点。一种选择是简单地重新插值到更细的网格。这可行,但是精度由我为重新插值选择的点数确定,这是任意的,并且需要在精度和效率之间进行权衡。
或者,我可以scipy.optimize.fsolve用来查找数据集的两个样条插值的精确交集。这很好用,但是它不能轻易找到多个相交点,需要我对相交点做出合理的猜测,并且可能缩放效果不好。(最终,我想找到几千套(x,y1,y2)的交集,所以一种有效的算法会很好。)
这是我到目前为止所拥有的。有什么改善的想法吗?
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate, scipy.optimize
x = np.linspace(1, 4, 20)
y1 = np.sin(x)
y2 = 0.05*x
plt.plot(x, y1, marker='o', mec='none', ms=4, lw=1, label='y1')
plt.plot(x, y2, marker='o', mec='none', ms=4, lw=1, label='y2')
idx = np.argwhere(np.diff(np.sign(y1 - y2)) != 0)
plt.plot(x[idx], y1[idx], 'ms', ms=7, label='Nearest data-point method')
interp1 = scipy.interpolate.InterpolatedUnivariateSpline(x, y1)
interp2 = scipy.interpolate.InterpolatedUnivariateSpline(x, y2)
new_x = np.linspace(x.min(), x.max(), 100)
new_y1 = interp1(new_x)
new_y2 = interp2(new_x)
idx = np.argwhere(np.diff(np.sign(new_y1 - …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何仅使用多边形的角坐标来缩小多边形。例如,如果我有以下带角[(0, 0), (0, 100), (20, 100), (30, 60), (40, 100), (60, 100), (60, 0), (40, 10), (40, 40), (20, 40), (20, 10)]的形状,则形状如下所示:
如果我将这个多边形缩小一些宽度和高度因子,我想找到角坐标。例如,如果我想将其宽度缩小 10%,将高度缩小 20%,那么这可以显示为如下所示:
我试图cv2.resize()通过调整大小后无法获得角落来做到这一点。我一直在尝试寻找一种用于调整多边形大小或缩小多边形大小的算法,但找不到有关如何执行此操作的任何信息。是否存在用于执行此类操作的任何算法或软件包?
这里已经提出并回答了很多类似的问题,但浏览后没有一个完全解决我的问题。我正在寻找一种可靠的算法来找到每条由两个点指定的两条无限线的交点。就我而言,有两个并发症:
我目前的方法说明了基于斜率和截距的方法的缺点。这个问题可以通过实施一个旋转整个系统的步骤来部分规避,这样就没有线条是垂直的,但这看起来不太优雅。你知道更好的方法吗?
import numpy as np
# The intersection point of the example below should be (0,0)
# Vertices for the first line
p1_start = np.asarray([-5, 0])
p1_end = np.asarray([-3, 0])
# Vertices for the second line
p2_start = np.asarray([0, 4])
p2_end = np.asarray([0, 2])
# Calculate slope and intercept for the first line
m_1 = (p1_end[1]-p1_start[1])/(p1_end[0]-p1_start[0])
t_1 = p1_start[1] - m_1*p1_start[0]
# The slope and intercept are zero
print('First line')
print('slope = '+str(m_1)) …Run Code Online (Sandbox Code Playgroud) 我想找到两个图的交集。绘制第一张图需要 674 点,绘制第二张图只需要 14 点。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("test1.csv",,skiprows=range(9),names=['A', 'B', 'C','D'])
df2 = pd.read_csv("test2.csv",skiprows=range(1),names=['X','Y'])
x1 = df['A'].tolist()
x1 = np.array(x1)
y1 = df['D'].tolist()
y1 = np.array(y1)
x2 = df2['X'].tolist()
x2 = np.array(x2)
y2 = df2['Y'].tolist()
y2 = np.array(y2)
idx = np.argwhere(np.diff(np.sign(y1 - y2))).flatten()
fig, ax = plt.subplots()
ax.plot(x1, y1, 'blue')
ax.plot(x2, y2, 'red')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是,由于 numpy 的大小不同,我从上面的代码中收到此错误。我有什么办法可以解决这个问题吗?
操作数无法与形状一起广播 (674,) (14,)
python ×8
numpy ×4
scipy ×3
geometry ×2
opencv ×2
algorithm ×1
c# ×1
game-physics ×1
math ×1
matplotlib ×1
performance ×1
plot ×1
python-3.x ×1
spatial ×1
voronoi ×1