- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经使用了已发布的代码here .这是代码:
from __future__ import division
def line(p1, p2):
A = (p1[1] - p2[1])
B = (p2[0] - p1[0])
C = (p1[0]*p2[1] - p2[0]*p1[1])
return A, B, -C
def intersection(L1, L2):
D = L1[0] * L2[1] - L1[1] * L2[0]
Dx = L1[2] * L2[1] - L1[1] * L2[2]
Dy = L1[0] * L2[2] - L1[2] * L2[0]
if D != 0:
x = Dx / D
y = Dy / D
return x,y
else:
return False
# Usage
L1 = line([0,1], [2,3])
L2 = line([2,3], [0,4])
R = intersection(L1, L2)
if R:
print "Intersection detected:", R
else:
print "No single intersection point detected"
它实现了 Cramer 规则(适用于直线;如果为两条给定直线构建的线性方程的行列式为 0,则直线不相交)。但是,我遇到的问题是,它还会检测到手头两条线的连续性导致的交叉点。这是我使用 matplotlib
绘制的图,它演示了这个问题:
我还有一个 Triangle
类,它包含 3 个 Line
对象,它进一步说明了这个问题,因为该类也有自己的 intersect(... )
函数,它接受另一个三角形并检查两个三角形的哪些边相交以及在哪里:
我想使用链接中的算法检测线段交点。以上线段不有交点。我该怎么做?
我有两个类 - Point
和 Line
- 用于以更易读的方式处理这些几何元素。我维护了上面的脚本并将其环绕(参见 Line.intersect(...)
):
class Point:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
# Override __add__, __sub__ etc. to allow arithmetic operations with Point objects
# ...
class Line:
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2
# ...
def intersect(self, l):
def line(p1, p2):
A = (p1.y - p2.y)
B = (p2.x - p1.x)
C = (p1.x*p2.y - p2.x*p1.y)
return A, B, -C
L1 = line(self.p1, self.p2)
L2 = line(l.p1, l.p2)
D = L1[0]*L2[1] - L1[1]*L2[0]
Dx = L1[2]*L2[1] - L1[1]*L2[2]
Dy = L1[0]*L2[2] - L1[2]*L2[0]
if D != 0:
x = Dx / D
y = Dy / D
p = Point(x, y)
return True, p
return False, None
#Usage
l1 = Line(Point(0, 0), Point(10, 4))
l2 = Line(Point(-4, -3), Point(-4, 10))
res, p = l1.intersect(l2)
if not res:
print('Lines don\'t intersect')
else:
print('Lines intersect at [%f, %f]' % (p.x, p.y))
我也在寻找最佳(尽可能少的非成本操作和尽可能少的内存占用)解决方案。
一种可能的解决方案是通过使用欧几里德距离来确定这些点是否位于两个线段上,从而过滤掉结果的交点(不属于两个线段的交点)。如果不是,则相交是一条或两条线的延续的结果,应被视为无效。然而,这是一项代价高昂的操作,并且还需要考虑所有交叉点(无论该点是否属于两个线段的一部分)。
更新:我以为我已经解决了问题,但是唉!以下有问题。在仔细查看评论后,我看到了@JerryCoffin 的评论,他指出可能与 this post 重复。 :
def intersect(self, l, contious=False):
# Before anything else check if lines have a mutual abcisses
interval_1 = [min(self.p1.x, self.p2.x), max(self.p1.x, self.p2.x)]
interval_2 = [min(l.p1.x, l.p2.x), max(l.p1.x, l.p2.x)]
interval = [
min(interval_1[1], interval_2[1]),
max(interval_1[0], interval_2[0])
]
if interval_1[1] < interval_2[0]:
print('No mutual abcisses!')
return False, None
# Try to compute interception
def line(p1, p2):
A = (p1.y - p2.y)
B = (p2.x - p1.x)
C = (p1.x*p2.y - p2.x*p1.y)
return A, B, -C
L1 = line(self.p1, self.p2)
L2 = line(l.p1, l.p2)
D = L1[0]*L2[1] - L1[1]*L2[0]
Dx = L1[2]*L2[1] - L1[1]*L2[2]
Dy = L1[0]*L2[2] - L1[2]*L2[0]
if D != 0:
x = Dx / D
y = Dy / D
p = Point(x, y)
if contiuous: # continuous parameter allows switching between line and line segment interception
return True, p
else:
if p.x < interval[1] or p.x > interval[0]:
print('Intersection out of bound')
return False, None
else:
return True, p
else:
print('Not intersecting')
return False, None
结果:
这看起来不错,正是我想要的。 但是 我添加了一条线(坐标或多或少是随机的,但我很容易检查情节)即 Line(Point(-4, 12), Point(12, -4 ))
。想象一下当我再次得到一个误报时我的惊讶:
如您所见,在我的线段开头的左上角检测到一个交点。它确实与垂直线的延续相交,但不与实际线段相交。两条线段具有相同的 x
而一条线段是垂直的这一事实似乎构成了一个问题。所以我仍然不知道如何解决这个问题。
最佳答案
嗯,需要学习如何阅读...解决方案实际上是在@JerryCoffin 提出的重复建议的评论中,即 here :
def intersect(self, l, contious=False):
# Before anything else check if lines have a mutual abcisses
interval_1 = [min(self.p1.x, self.p2.x), max(self.p1.x, self.p2.x)]
interval_2 = [min(l.p1.x, l.p2.x), max(l.p1.x, l.p2.x)]
interval = [
min(interval_1[1], interval_2[1]),
max(interval_1[0], interval_2[0])
]
if interval_1[1] < interval_2[0]:
print('No mutual abcisses!')
return False, None
# Try to compute interception
def line(p1, p2):
A = (p1.y - p2.y)
B = (p2.x - p1.x)
C = (p1.x*p2.y - p2.x*p1.y)
return A, B, -C
L1 = line(self.p1, self.p2)
L2 = line(l.p1, l.p2)
D = L1[0]*L2[1] - L1[1]*L2[0]
Dx = L1[2]*L2[1] - L1[1]*L2[2]
Dy = L1[0]*L2[2] - L1[2]*L2[0]
if D != 0:
x = Dx / D
y = Dy / D
p = Point(x, y)
if contiuous: # continuous parameter allows switching between line and line segment interception
return True, p
else:
if p.x < interval[1] or p.x > interval[0]:
print('Intersection out of bound')
return False, None
else:
return True, p
else:
print('Not intersecting')
return False, None
结果:
关于algorithm - 使用 Cramer 检测两条线段是否相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39394830/
我已经使用了已发布的代码here .这是代码: from __future__ import division def line(p1, p2): A = (p1[1] - p2[1])
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我想找到变量和 cramer V 之间的关联,就像处理大小大于 2X2 的矩阵一样。但是,对于频率较低的矩阵,它效果不佳。对于以下列联矩阵,我得到的结果为 0.5。我怎么能解释同样的事情? 1 2
我在 pandas 中有一个数据框,其中包含根据维基百科文章计算的指标。两个分类变量 nation 文章是关于哪个国家的,以及 lang 这是从哪个语言维基百科中获取的。对于单个指标,我想看看国家和语
有人使用 GNU GMP 库成功实现了 Cramer-Shoup 加密/解密算法吗?我怀疑我的实现有微妙的错误,并且根据我在下面写的内容,对我的怀疑的简单确认就足够了 - 这是一般方案的 wiki 链
分类变量之间的关联应该使用 Crammer's V 来计算。因此,我发现了以下 code来绘制它,但我不知道他为什么将它绘制为“贡献”,这是一个数字变量? def cramers_corrected_
我是一名优秀的程序员,十分优秀!