zoukankan      html  css  js  c++  java
  • 点是否在三角形内问题的思考

    关于点是否在三角形内(落在边线上亦可)问题的解法,大体有两种:

    1、根据面积来求解:

    当点D落于三角形内时,图1所示,则由D与A,B,C三个顶点所组成的三个三角形面积之和即为外围三角形面积:S(ABC)=S(ABD)+S(BCD)+S(ACD)

    当点D落于三角形外时,图2所示,则由D与A,B,C三个顶点所组成的三个三角形面积之和应该大于原三角形面积之和,多出了面积S(ACD):S(ABC)<S(ABD)+S(BCD)+S(ACD)

    而根据三角形三条边长求解面积的公式如下:

    假设三条边长为:a、b、c则

    p=(a+b+c)/2  =>  S(ABC)=sqrt((p-a)*(p-b)*(p-c)*p);

    2

     

    2、根据向量叉积来求解:

    当一个点与一向量的叉积为正时,我们可以确定该点位于当前向量的左边,因为sin<BAC>为正,图3所示;

    当一个点与一向量的叉积为负时,我们可以确定该点位于当前向量的右边,因为sin<BAC>为负,图4所示;

    3

     

    故,我们可以利用这点来判断点与三角形的关系。

    假设向量AD与AB的叉积结果表示为:p(AD,AB)

    当点D位于三角形以内时,则延着ABC逆时针走,点D都位于三条边的左侧,也就是说向量AD与AB,向量BD与BC,向量CD与CA的叉积均为正,因为它们之间的夹角均小于180度。图5所示,

    则:p(AD,AB)>0&&p(BD,BC)>0&&p(CD,CA)>0

    当点D位于三角形外面时,则向量AD与AB,向量BD与BC,向量CD与CA的叉积结果中有一个会为负,比如向量CA与CD的叉积结果,注意夹角是以逆时针旋转得到的,故角ACD大于180度,图6所示,

    则:p(AD,AB)>0&&p(BD,BC)>0&&p(CD,CA)>0 结果不成立时则可判断D位于三角形之外。

     

    下面给出向量叉积的求解公式:

    假如A向量为(a,b),B向量为(c,d),则向量A与B叉积的结果为:a*d-b*c。当结果为正时,则说明两向量间的夹角为0到180度之间,为负时则为180到360之间。

    4

    以上两种思路转换成相应的code都比较简单,这里就不详细记录呢。

  • 相关阅读:
    Map与对象关系的思考之P1563玩具谜题
    vector性能调优之resize与reserve
    模拟--P1328 生活大爆炸版石头剪刀布 题解
    模拟--P1540 机器翻译
    get、post、put、delete
    Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框(转载)
    Docker(4) 制作镜像
    Git(1) 常用命令
    Linux(1) 常用命令
    Docker(3) 基础知识
  • 原文地址:https://www.cnblogs.com/JackyTecblog/p/2634757.html
Copyright © 2011-2022 走看看