Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 线段交点_Geometry_Intersection_Lines - Fatal编程技术网

Geometry 线段交点

Geometry 线段交点,geometry,intersection,lines,Geometry,Intersection,Lines,我在raywenderlich.com上找到了这个代码片段,但是这个解释的链接不再有效。我把答案“翻译”成了Swift,我希望你能理解,其实即使不懂语言也很容易。谁能解释一下这里到底发生了什么?谢谢你的帮助 class func linesCross(#line1: Line, line2: Line) -> Bool { let denominator = (line1.end.y - line1.start.y) * (line2.end.x - line2.start.x)

我在raywenderlich.com上找到了这个代码片段,但是这个解释的链接不再有效。我把答案“翻译”成了Swift,我希望你能理解,其实即使不懂语言也很容易。谁能解释一下这里到底发生了什么?谢谢你的帮助

class func linesCross(#line1: Line, line2: Line) -> Bool {
    let denominator = (line1.end.y - line1.start.y) * (line2.end.x - line2.start.x) -
        (line1.end.x - line1.start.x) * (line2.end.y - line2.start.y)

    if denominator == 0 { return false } //lines are parallel

    let ua = ((line1.end.x - line1.start.x) * (line2.start.y - line1.start.y) -
        (line1.end.y - line1.start.y) * (line2.start.x - line1.start.x)) / denominator
    let ub = ((line2.end.x - line2.start.x) * (line2.start.y - line1.start.y) -
        (line2.end.y - line2.start.y) * (line2.start.x - line1.start.x)) / denominator

    //lines may touch each other - no test for equality here
    return ua > 0 && ua < 1 && ub > 0 && ub < 1
}
class func linesCross(#line1:Line,line2:Line)->Bool{
让分母=(line1.end.y-line1.start.y)*(line2.end.x-line2.start.x)-
(line1.end.x-line1.start.x)*(line2.end.y-line2.start.y)
如果分母==0{return false}//行是平行的
设ua=((line1.end.x-line1.start.x)*(line2.start.y-line1.start.y)-
(line1.end.y-line1.start.y)*(line2.start.x-line1.start.x))/分母
设ub=((line2.end.x-line2.start.x)*(line2.start.y-line1.start.y)-
(line2.end.y-line2.start.y)*(line2.start.x-line1.start.x))/分母
//线可能相互接触-此处不测试是否相等
返回ua>0&&ua<1&&ub>0&&ub<1
}

对于给定的直线,坡度为

m=(y_end-y_start)/(x_end-x_start)
如果两个坡度相等,则直线平行

m1=m1

(y1_end-y_start)/(x1_end-x1_start)=(y2_end-y2_start)/(x2_end-x2_start)
这相当于检查分母不是零


关于代码的其余部分,请在“每行给定两点”下找到解释,这就是代码所做的

AB
中的每个点
p
可描述为:

P = A + u(B - A)

对于某些常数
0,您可以找到详细的线段相交算法
在书中,第。7.7.
此处描述的
segint
代码可用。 我建议避免计算坡度

有几个“退化”情况需要注意:共线段 无论是否重叠,一个管段端点位于其他管段的内部,
等等。我写代码是为了返回这些特殊情况的指示。

感谢分母的解释,但是我已经在维基百科上看到了这篇文章,我并没有真正理解它,因为我实际上没有基本的数学知识-我才上了十年级。。。
Q = C + v(D - C)
A + u(B - A) = C + v(D - C)
ax + u(bx - ax) = cx + v(dx - cx)
ay + u(by - ay) = cy + v(dy - cy)
|bx-ax  cx-dx| |u| = |cx-ax|
|by-ay  cy-dy| |v|   |cy-ay|
det = (bx-ax)(cy-dy) - (by-ay)(cx-dx)
|cy-dy  dx-cx|
|ay-by  bx-ax|
det*u = (cy-dy)(cx-ax) + (dx-cx)(cy-ay)
det*v = (ay-by)(cx-ax) + (bx-ax)(cy-ay)