zoukankan      html  css  js  c++  java
  • 计算几何

    任意两个向量x=(a1,b1),y=(a2,b2);

    点积x·y=a1×a2+b1×b2=|x|·|y|·cos(θ)

    叉积|x×y|=a1×b2-a2×b1=|x|·|y|·sinθ

    用点表示叉积就是

    bool judge(point a,point b,point c)
    {
    if((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)==0)
    return true;
    else return false;
    }

    点积

    点积的集合意义:我们以向量 a 向向量 b 做垂线,则 | a | * cos(a,b)为 a 在向量 b 上的投影,即点积是一个向量在另一个向量上的投影乘以另一个向量。且满足交换律

    应用:可以根据集合意义求两向量的夹角,cos(a,b) =( 向量a * 向量b ) / (| a | * | b |) =  x1*x2 + y1*y2 / (| a | * | b |) 

    叉积

    叉积的结果也是一个向量,是垂直于向量a,b所形成的平面,如果看成三维坐标的话是在 z 轴上,结果为 x1*y2-x2*y1,上面结果是它的模。

    方向判定:右手定则,(右手半握,大拇指垂直向上,四指右向量a握向b,大拇指的方向就是叉积的方向)

    叉积的集合意义:

    1:其结果是a和b为相邻边形成平行四边形的面积。

    2:结果有正有负,有sin(a,b)可知和其夹角有关,夹角大于180°为负值。

    3:叉积不满足交换律

    性质

    ***叉积德结果是以x和y为相邻边形成的平行四边形的面积

    ***结果有正有负,意义不同,夹角大于180为负值

    ***叉积不满足交换律,也就是说x×y和 y×x的结果是不同的

    应用

    ***通过接货的政府判断两矢量之间的顺逆时针关系

    若|x×y|>0表示x在y的顺时针方向

    若|x×y|<0表示x在y的逆时针方向

    若|x×y|>0表示x和y共线,但不确定方向是否相同

    ***设向量t=(x,y)关于原点逆时针旋转θ后的坐标为(x',y‘),那么 x '=xcosθ+ysinθ

                                                                                                y'=xsinθ+ycosθ;

    *****

    计算机对出发计算有一定的精度,在某些精度要求较高的情况下,为保持正确性应该尽量避免除法,利用叉积就是避免除法的方法之一。

    常量

    ***

    关于浮点数精度的问题

    ***两个浮点数不能直接比较大小,比如判断一个浮点数是否为0

    **if(abs(ans)<EPS)即表示if(ans==0)浮点数知否为0

    **if(fabs(a-b)<EPS)即表示if(a==b)浮点数是否相等

    **if(a-b<EPS)即表示if(a<b)浮点数比较大小

    ***另外一种处理浮点数的方法:在不溢出整数范围的情况下,可以通过乘以10ⁿ来转换为整数运算

    ****写计算几何的题目时务必检查每一个变量时double还是int

    实际问题

    1.判断给定点p是否在线段AB上

    **|AP×BP|=0且min(x1,x2)<=xp<=max(x1,x2);

                          min(y1,y2)<=yp<=max(x1,x2);

    总结:点在线段上(叉积=0)

             点在线段延长线上(叉积=0)

            点在线段顺时针方向(叉积>0)

            点在线段逆时针方向(叉积<0)

    2.判断一个点是否位于三角形ABC中

    **可以根据面积法判断

    **利用叉积判断

    AP在AC顺时针方向

    CP在CB顺时针方向

    BP在BA顺时针方向

     即三者叉积都是大于0

    当为逆时针方向时三者叉积都小于0

    *****升级:可以利用叉积德正负号来判断一个点是否在凸多边形的内部

    心心

    外心:三遍中垂线的交点,外接圆的圆心,到三角形的三个顶点的距离相等

    内心:角平分线的交点,到三角形三边的距离相等

    垂心:三条高线的交点

    重心:三条中线的交点时到三角形三个顶点距离的平方和最小的点,三角形内到三边距离之积最大         的点

    旁心:三角形一条内角平分线与其他两个角的外角平分线的交点,旁心到三角形一边及其他两边延         长线的距离相等

    ***三角形的面积用海伦公式计算

    3.判断一个多边形是否为凸多边形

    **对于凸多边形来说,任意相邻的三个点组成的两向量的叉积,符号一致

    4.极角的顺序

     5.凸包

    Graham扫描法

    该算法的时间复杂度大约是O(nlog(n))

    所需的知识点:极角排序,栈的使用和叉积的应用

    你若盛开,清风自来...
  • 相关阅读:
    python列表解析和正同表达式
    python实现屏幕截图
    pngCanvas 是一个使用纯Python代码的生成png图像的工具
    windows 7 提示升级到windows 10补丁
    openerp所用QWEB2的调试笔记
    修改 Ubuntu 13.04 LAMP 服务器端口号
    DEB方式在UBUNTU安装ODOO 8.0
    在openerp撰写消息中增加图片
    ubuntu挂载3T新硬盘并更换home分区
    MPEG-4 压缩编码标准
  • 原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5894200.html
Copyright © 2011-2022 走看看