嘘~ 正在从服务器偷取页面 . . .

[计算几何] 使用叉积计算直线交点


[计算几何] 使用叉积计算直线交点

upd.本文写于远古时期,有空再来修改。

已知直线 \(AB\)\(CD\) ,其交点为 \(P\) , 求 \(P\) 的坐标。

计算几何中一般存储向量 \(\mathbf{p},\mathbf{v}\) 表示起点的向量和方向向量

例如直线 \(AB\) 一般存储为 \(\overset{\longrightarrow}{OA},\overset{\longrightarrow}{AB}\)

const double eps=1e-10;
struct vct{double x,y;}p[N];
#define pf(x) ((x)*(x))
vct operator+(vct a,vct b){return {a.x+b.x,a.y+b.y};}
vct operator-(vct a,vct b){return {a.x-b.x,a.y-b.y};}
vct operator*(vct a,double b){return {a.x*b,a.y*b};}
vct operator/(vct a,double b){return {a.x/b,a.y/b};}
double cross(vct a,vct b){return a.x*b.y-a.y*b.x;}
double dot(vct a,vct b){return a.x*b.x+a.y*b.y;}
double len(vct a){return sqrt(pf(a.x)+pf(a.y));}
struct line
{
    vct p,way;
    double k;
    void mkline(vct a,vct b)
    {
        p=a;way=b;
        k=atan2(b.y,b.x); // 部分题会用到的极角排序,并不是必不可缺的
    }
    void mk(double x1,double y1,double x2,double y2)
    {
        mkline({x1,y1},{x2-x1,y2-y1});
    }
}a[N];

因此,可以得到下图

其中 \(\mathbf{v_1},\mathbf{v_2}\) 为方向向量, \(P=\mathbf{p_1} + t\mathbf{v_1}\)

因为 \[ (\mathbf{p_1}+t\mathbf{v_1}-\mathbf{p_2}) \times \mathbf{v_2} = 0 \] 所以 \[ t = \frac{(\mathbf{p_2}-\mathbf{p_1})\times \mathbf{v_2}}{\mathbf{v_1}\times \mathbf{v_2}} \] 代入 \(P=\mathbf{p_1} + t\mathbf{v_1}\) 即可

代码:

vct intersect(line a,line b)
{
    double x=cross(b.way,a.p-b.p)/cross(a.way,b.way);
    return a.p+a.way*x;
}

完整代码摘自这里 其实是懒得再打一遍 qwq


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录