zoukankan      html  css  js  c++  java
  • In Triangle Test / To Left Test

    2020-01-09 14:51:29

    如何高效的判断一个点是否是包含在一个三角形的内部是计算几何里的一个基础问题。

    In Triangle Test问题也可以用来解决计算几何里的一个基础问题就是 凸包问题

    问题描述

    给出一个点s,判断其是否在一个三角形(p, q, r)内部。

    问题求解

    判断一个点是否在三角形内部等价于对于三条边分别做To left test的结果一致。

    那么现在的问题就是如何高效和精确的实现To left test。

    关于这个可以使用空间坐标系的海伦公式来求解。

                  | p.x p.y 1 |

    2 * S =   | q.x q.y 1 |

                  | s.x s.y 1 |

    并且这个公式是有向的,当三个点是逆时针排列的时候该行列式的返回结果是正数,当三个点是顺时针排列的时候行列式的返回结果是负数

    bool to_left_test(int[] p, int[] q, int[] s) {
        return area2(p, q, s) > 0;
    }
    
    int area2(int[] p1, int[] p2, int[] p3) {
        return p1[0] * p2[1] + p1[1] * p3[0] + p2[0] * p3[1] -
            p2[1] * p3[0] - p1[1] * p2[0] - p1[0] * p3[1];
    }  

    To left test 几乎贯穿了整个计算几何,不仅是计算凸包的核心,也是很多其他计算几何问题的关键算法。

    例如:判断两条线段是否相交,只需要做4次to left test即可。 

  • 相关阅读:
    字符串 高精度计算
    JAVA Socket编程 课堂作业
    图论 Floyd算法
    天梯赛题解 L1-049 天梯赛座位分配
    天梯赛题解 -L1-039 古风排版
    HDU 5558 后缀数组
    HDU 6194 后缀数组
    HDU 5769 后缀数组
    HDU 4691 后缀数组+RMQ
    HDU 4135 容斥原理
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12171639.html
Copyright © 2011-2022 走看看