• 计算几何--矢量和线段


    参考转自:http://www.niubb.net/a/2015/11-19/992306.html

                 http://www.cnblogs.com/g0feng/archive/2012/05/18/2508293.html

    基础知识百度文库:http://wenku.baidu.com/link?url=Uicnl5-Jj4yIw8tTGjyEkfAKH6eejx5eorc970SialtuaM2hixA3mZ2Dy0m_2rmft3AQmjzU6S-kJzn-ZEfTt5o3FpLq2z_Oj2IFLZb0jeC

    矢量

    如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量p2

    矢量的加减

    设二维矢量 P = (x1, y1), Q = (x2, y2),则 P + Q = (x1 + x2, y1 + y2), P -Q = (x1 - x2, y1 - y2),且有 P + Q = Q + P, P - Q = -(Q - P)

    矢量叉积

    设矢量 P = (x1, y1), Q = (x2, y2),则 P * Q = x1 * y2 - x2 * y1; 其结果是一个由(0, 0), P, Q, P + Q 所组成的平行四边形的 带符号的面积,P * Q = -(Q * P), P * (- Q) =-(P * Q)

    叉积的一个非常重要的性质是可以通过它的符号来判断两矢量相互之间的顺逆时针关系:

    若 P * Q > 0,则 P 在 Q 的顺时针方向

    若 P * Q < 0, 则 P 在 Q 的逆时针方向

    若 P * Q = 0,则 P 与 Q 共线,但不确定 P, Q 的方向是否相同

    折线段的拐向判断

    如图,假设有折线段 p0p1p2 ,要确定 p1p2 相对于 p0p1 是向左拐还是向右拐,可以通过计算(p2 - p0)*(p1 -p0) 的符号来确定折线的拐向(点 p2 - p0 实际上就是向量 p2,但这里要注意线段和矢量的区别)

    快速排斥实验和跨立实验

    判断点是否在线段上

    设点 Q = (x, y), P1 = (x1, y1), P2 = (x2, y2),若 (Q - P1)*(P2 - P1) =0 且 min(x1, x2) <= x <= max(x1, x2) && min(y1, y2)<= y <= max(y1, y2),则点 Q 在线段 P1P2 上

    判断两线段是否相交

    1)快速排斥试验

    设以线段 P1P2 为对角线的矩形为 R(与坐标轴平行的矩形,后同),设以线段 Q1Q2 为对角线的矩形为 T,若 R、T 不相交,则两线段不可能相交

    假设 P1 = (x1, y1), P2 = (x2, y2), Q1 = (x3, y3), Q2 = (x4, y4),设矩形 R的 x 坐标的最小边界为 minRX = min(x1, x2),以此类推,将矩形表示为 R = (minRX, minRY,maxRX, maxRY) 的形式,若两矩形相交,则相交的部分构成了一个新的矩形 F,如图所示,我们可以知道 F 的 minFX =max(minRX, minTX), minFY = max(minRY, minTY), maxFX = min(maxRX,maxTX), maxFY = min(maxRY, maxTX),得到 F 的各个值之后,只要判断矩形 F 是否成立就知道 R 和T 到底有没有相交了,若 minFX > maxFX 或 minFY > maxFy 则 F 无法构成,RT不相交,否则RT相交

    (也就是判断在X轴方向有相交,且在Y轴方向有相交){由此可以扩展至立方体相交,仅限与坐标轴平行的}

    {

      min(A1.x,A2.x) <= max(B1.x,B2.x) &&
         min(B1.x,B2.x) <= max(A1.x,A2.x) &&
         min(A1.y,A2.y) <= max(B1.y,B2.y) &&
         min(B1.y,B2.y) <= max(A1.y,A2.y)

    }

    快速排斥实验和跨立实验

    2)跨立试验

    如果两线段相交,则两线段必然相互跨立对方.若A1A2跨立B1B2,则矢量( A1 - B1 ) 和(A2-B1)位于矢量(B2-B1)的两侧,

    即(A1-B1) × (B2-B1) * (A2-B1) × (B2-B1)<0。

    上式可改写成(A1-B1) × (B2-B1) * (B2-B1) × (A2-A1)>0。

    应该判断两次,即两条线段都要为直线,判断另一直线的两端点是否在它两边,若是则两线段相交。

    若仅仅满跨立实验是不行的,如下面的情况:

    即两条线段在同一条直线上。所以我们要同时满足两次跨立和快速排斥实验。

  • 相关阅读:
    Oracle之内存结构(SGA、PGA)
    学员报名WDP培训之前必须阅读
    常见滤波方法
    C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
    C++ explicit关键字详解
    A、B、C、D和E类IP地址
    BOOL和bool的区别
    互斥量 临界区 信号量 条件变量 效率对比
    Unhandled exception at 0x........ in XXXX.exe: 0xC0000005:错误
    链表的插入操作错误
  • 原文地址:https://www.cnblogs.com/acSzz/p/5397160.html
Copyright © 2020-2023  润新知