计算几何学习笔记之点和直线

向量的基本运算http://blog.csdn.net/cqbzwja/article/details/51030712
直线用参数方程表示,参数方程就是直线上任意一点,加上一个方向向量,以及参数t。假设直线上所有点满足 P=P0+tv⃗  ,那么t为参数,P0是直线上任意一点,v是直线的方向。假设点Q有 Q=P0+t0v⃗  ,则表示Q在P0点的v方向的t倍|v|的位置,特别地当 |v⃗ |=1 时有 |P0Q|=t
当直线为射线的时候 t>0 ,直线 tR ,线段 t[0,1]
直线交点:设直线分别为 l1:P+tv,l2:Q+tw ,交点在第一条直线上的参数为t1,第二条直线上的参数为t2,定义 u⃗ =PQ 有:

t1=cross(w,u)cross(v,w),t2=cross(v,u)cross(v,w)

证明如下:
这里写图片描述
不难得到 Syellow=Sgreen ,则有 tv⃗ w⃗ =w⃗ u⃗ t=w⃗ u⃗ v⃗ w⃗ 
代码:

poi GetLineIntersection(poi P,vec v,poi Q,vec w)
{
    double t = cross(w, P-Q) /cross(v, w);
    return P+v*t;
}

点到直线距离:叉积为平行四边形面积,那么用面积除以底边就得到了距离。

double DistanceToLine(poi p,poi A,poi B)
{
    vec v1 = B-A, v2 = p-A;
    return fabs(cross(v1,v2)) /length(v1);
}

点到线段的距离:有可能是P到直线AB的距离,也可能是到A点的距离,也可能是到点B的距离。代码:

double DistanceToSegment(poi p,poi A,poi B)//点p到线段AB的距离
{
    if(A == B) return length(p-A);
    vec v1 = B-A, v2 = p-A, v3 = p-B;
    if(dcmp(dot(v1,v2)) < 0) return length(v2);
    else if(dcmp(dot(v1,v3)) > 0) return length(v3);
    else return fabs(cross(v1,v2)) /length(v1);
}

这里写图片描述
点在直线上的投影:设点P在直线AB上的投影点为Q,AB为A+tv(v是向量AB)。设点Q的坐标为 Q=A+t0v。两个相互垂直的向量的点乘值为0,可以得到:
v⃗ P(A+t0v)v⃗ APt0(v⃗ v⃗ )

poi GetLineProjection(poi p,poi A,poi B)
{
    return A + (B-A)*(dot(B-A,P-A) /dot(B-A,B-A));
}

线段相交判定(不含端点):两条线段相交的充分必要条件是:每条线段的两个端点都在另外一条线段的两侧(叉积符号不同)

bool SegmentProperIntersection(poi a1,poi a2,poi b1,poi b2)
{
    double c1 = cross(a2-a1, b1-a1), c2 = cross(a2-a1, b2-a1), c3 = cross(b2-b1, a1-b1), c4 = cross(b2-b1, a2-b1);
    return dcmp(c1)*dcmp(c2) < 0&&dcmp(c3)*dcmp(c4) < 0;  
}

这里写图片描述

目录 ㈠ 的基本运算 1. 平面上两之间距离 1 2. 判断两是否重合 1 3. 矢量叉乘 1 4. 矢量点乘 2 5. 判断是否在线段上 2 6. 求一饶某旋转后的坐标 2 7. 求矢量夹角 2 ㈡ 线段及直线的基本运算 1. 与线段的关系 3 2. 求到线段所在直线垂线的垂足 4 3. 到线段的最近 4 4. 到线段所在直线的距离 4 5. 到折线集的最近距离 4 6. 判断圆是否在多边形内 5 7. 求矢量夹角余弦 5 8. 求线段之间的夹角 5 9. 判断线段是否相交 6 10.判断线段是否相交但不交在端处 6 11.求线段所在直线的方程 6 12.求直线的斜率 7 13.求直线的倾斜角 7 14.求关于某直线的对称 7 15.判断两条直线是否相交及求直线 7 16.判断线段是否相交,如果相交返回交 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求多边形面积 9 5. 判断多边形顶的排列方向,方法一 10 6. 判断多边形顶的排列方向,方法二 10 7. 射线法判断是否在多边形内 10 8. 判断是否在凸多边形内 11 9. 寻找集的graham算法 12 10.寻找集凸包的卷包裹法 13 11.判断线段是否在多边形内 14 12.求简单多边形的重心 15 13.求凸多边形的重心 17 14.求肯定在给定多边形内的一个 17 15.求从多边形外一出发到该多边形的切线 18 16.判断多边形的核是否存在 19 ㈣ 圆的基本运算 1 .是否在圆内 20 2 .求不共线的三所确定的圆 21 ㈤ 矩形的基本运算 1.已知矩形三坐标,求第4坐标 22 ㈥ 常用算法的描述 22 ㈦ 补充 1.两圆关系: 24 2.判断圆是否在矩形内: 24 3.到平面的距离: 25 4.是否在直线同侧: 25 5.镜面反射线: 25 6.矩形包含: 26 7.两圆交: 27 8.两圆公共面积: 28 9. 圆和直线关系: 29 10. 内切圆: 30 11. 求切: 31 12. 线段的左右旋: 31 13.公式: 32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值