2D空间中判断一点是否在三角形内

本来打算做三角形填充多边形,但需要用到耳切法正在看。所以先研究了这个

要注意如果是XY坐标轴的2D空间,要取差乘分量z而不是y。

实现原理是,将三角形ABC三个边(AB,BC,CA)分别与比较点判断差乘,如果这3个差乘结果表示的方向一致,说明就在三角形内。

效果:

代码(Unity3D):

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TriangleCollider : MonoBehaviour
{
    public const float ERROR = 0.05f;
    public Transform trianglePoint1;
    public Transform trianglePoint2;
    public Transform trianglePoint3;
    public Transform comparePoint;

    public bool IsContract(Vector3 comparePoint)
    {
        var dir1 = trianglePoint2.position - trianglePoint1.position;
        var dir2 = trianglePoint3.position - trianglePoint2.position;
        var dir3 = trianglePoint1.position - trianglePoint3.position;

        var cross1 = Mathf.Sign(Vector3.Cross(dir1, comparePoint - trianglePoint1.position).y);
        var cross2 = Mathf.Sign(Vector3.Cross(dir2, comparePoint - trianglePoint2.position).y);
        var cross3 = Mathf.Sign(Vector3.Cross(dir3, comparePoint - trianglePoint3.position).y);

        var dir = cross1 == cross2 ? cross3 : cross1 == cross3 ? cross2 : cross1;

        cross1 = Mathf.Sign(Vector3.Cross(dir1, comparePoint - trianglePoint1.position).y + -dir * ERROR);
        cross2 = Mathf.Sign(Vector3.Cross(dir2, comparePoint - trianglePoint2.position).y + -dir * ERROR);
        cross3 = Mathf.Sign(Vector3.Cross(dir3, comparePoint - trianglePoint3.position).y + -dir * ERROR);

        return cross1 == cross2 && cross2 == cross3;
    }

    void OnDrawGizmos()
    {
        if (comparePoint == null) return;

        var oldColor = Gizmos.color;

        if (IsContract(comparePoint.position))
            Gizmos.color = Color.red;

        Gizmos.DrawLine(trianglePoint1.position, trianglePoint2.position);
        Gizmos.DrawLine(trianglePoint2.position, trianglePoint3.position);
        Gizmos.DrawLine(trianglePoint3.position, trianglePoint1.position);

        Gizmos.color = oldColor;
    }
}

为了加误差,所以多做了3次差乘。不过使用起来还算可以

时间: 2024-12-25 18:32:23

2D空间中判断一点是否在三角形内的相关文章

[译]2D空间中使用四叉树Quadtree进行碰撞检测优化

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.2.0f3 原文出处 : Quick Tip: Use Quadtrees to Detect Likely Collisions in 2D Space 许多游戏需要使用碰撞检测算法去判定两个对象是否发生碰撞,但是这些算法通常意味着昂贵操作,拖慢游戏的运行速度.在这篇文章中我们将会学习四叉树 quadtrees,并学习如果通过四叉树跳过那些物理空间距离比较远的对象,最终提高碰撞检测速度. 注:原文

判断点是否在三角形内【转】

概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三角形的三个顶点得到三条线段PA,PB和PC,求出这三条线段与三角形各边的夹角,如果所有夹角之和为180度,那么点P在三角形内,否则不在,此法直观,但效率低下. 二 同向法 假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现点P始终位于边AB,BC和

判断点是否在三角形内

http://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html#!comments 本文只是翻译和整理,原文在此http://www.blackpawn.com/texts/pointinpoly/default.html 概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三

二维平面上判断点是否在三角形内

最近在项目中碰到的这个问题,在此记录一下.已知三角形的三个顶点坐标,判断某个点是否在三角形中(在三角形的边上,我们也视作在三角形中),本文给出了三种方法.   算法1 利用面积法,如上图所示,如果点P在三角形ABC的内部,则三个小三角形PAB, PBC, PAC的面积之和 = ABC的面积,反之则不相等. 已知三角形的三个顶点坐标求其面积,可以根据向量的叉乘,参考here. 该算法详见后面的函数:IsPointInTriangle1   算法2 首先看一下这个问题,如何判断某两个点在某条直线的同

华为oj 之 判断点是否在三角形内

/* * 任意顶点为A.B.C的三角形,如果点P在三角形内,那么 * 1)点P和点C在AB边的同一侧 2)点P和点A在BC边的同一侧 3)点P和点B在AC边的同一侧 * 反之亦然(充要条件) * * 关键:如何判断某两个点在某条直线的同一侧 * 参考图示发现: *   对于点P: AB*BC的方向 和 AB*BP的方向相同 *    对于点P1: AB*BC的方向 和 AB*BP1的方向不同 * 故:对于边AB,以及点C.P,如果AB*BC的方向 和 AB*BP的方向相同, *    那么点P和

判断一点是否在扇形内

1.问题描述: 最近在做一个watch上的电子宠物的项目,整个主功能界面是个圆形,然后每个功能(喂食,清洁,愉悦之类的)各自是圆上的一部分也就是个扇形.然后点击每个扇形,出现对应的子功能界面,格式和主功能界面一致. 现在要实现点击对应的扇形会出现对应的子功能界面,子功能界面和这个类似.换而言之就是点击一下界面,需要判断出接触点落在哪个扇形内. 当时一个简单的想法是在扇形区域内放置一个方形的按钮,点击后调用回调就可以,但是缺点是精确度不够,因为按钮不能覆盖整个扇形,所以这种方法不可取. 于是需要实

【TOJ 3005】Triangle(判断点是否在三角形内)

描述 Given the coordinates of the vertices of a triangle,And a point. You just need to judge whether the point is in the Triangle. 输入 The input contains several test cases. For each test case, only line contains eight integer numbers , describing the c

2D空间中求两圆的交点

出处:https://stackoverflow.com/questions/19916880/sphere-sphere-intersection-c-3d-coordinates-of-collision-points 修改(加入包含和不相交情况的判断): using System.Collections; using System.Collections.Generic; using UnityEngine; public class CircleIntersect : MonoBehav

几种方法判断平面点在三角形内

最近在做一个Unity实现的3D建模软件,其中需要在模型表面进行操作的时候,需要用到点和三角形位置关系的判定算法.由于一个模型往往是几千个三角片,所以这个判定算法必须高效,否则会影响最终程序的整体性能.这里记录一下一些算法,如有误请指出,谢谢! 首先假设点和三角形在同一平面内,如果不在同一平面,需要用其它方法先筛选. 常用的几种平面点-三角形位置关系判定方法有(以下算法执行必须先保证点和三角形位于同平面): 1.顺时针/逆时针判定法 该方法要求点的顺序是顺时针或逆时针的,如果是顺时针的点,沿着3