博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断一个点是否在,一组点围成的多变形中
阅读量:5242 次
发布时间:2019-06-14

本文共 2851 字,大约阅读时间需要 9 分钟。

using System.Collections;

using System.Collections.Generic;
using UnityEngine;
public class BorderTest : MonoBehaviour {
    List<Line> lineList = new List<Line>();
    Transform[] transTmp;
    List<Vector2> vList = new List<Vector2>();
    List<Line> nLine = new List<Line>();
    int number;
    int count = 0;
    Vector2 vec = new Vector2(1, 2);
    void Start () {
        number = GameObject.Find("ListPoints").transform.childCount;
        getChildren(number); // 点都放这个子物体下了,
        // print(vList.Count);
        getPointPairs(); // 获取组成线的两个点
        test(new Vector2(6, 0)); // 拿这个点来进行测试
    }
    private void test(Vector2 vec1) {
        foreach (var item in nLine)
        {
            if (item.hasCommomPoint(vec1, 0))
            {
                count = count + 1;
            }
        }
        print(count);
        if ((count % 2) == 1)
        {
            print("在里面");
            GameObject obj = new GameObject();
            obj.transform.position = vec1;
        }
        else
        {
            print("不在里面");
            GameObject obj = new GameObject();
            obj.transform.position = vec1;
        }
    }
    private void getChildren(int num) {
        for (int i = 0; i < num; i++)
        {
            Vector2 vec = GameObject.Find("ListPoints").transform.GetChild(i).position;
            // Debug.Log(vec.ToString() + " " + GameObject.Find("ListPoints").transform.GetChild(i).gameObject.name);
            vList.Add(vec);
        }
    }
    private void getPointPairs() {
        for (int i = 0, j = 0; i < vList.Count; j = ++i)
        {
            // print(i +" "+ (j + 1) % vList.Count);
            Line line = new Line(vList[i], vList[(j + 1) % vList.Count]);
            nLine.Add(line);
        }
    }
    // Update is called once per frame
    void Update () {
        
    }
}
public class Line
{
    public Vector2 pointLeft;
    public Vector2 pointRight;
    public double k;
    public double b;
    public Line(Vector2 vec1, Vector2 vec2) {
        // Debug.Log(vec1 + " " + vec2);
        if(vec1.x < vec2.x)
        {
            pointLeft = vec1;
            pointRight = vec2;
        }
        else
        {
            pointLeft = vec2;
            pointRight = vec1;
        }
        if ((vec1.x == vec2.x)) {
            Debug.Log("???");
            Debug.Log(vec1.ToString() + " " + vec2.ToString());
        }
        else {
            this.k = (double)(pointRight.y - pointLeft.y) / (pointRight.x - pointLeft.x);
            this.b = vec1.y - k * vec1.x;
            Debug.Log(this.k);
            // Debug.Log((pointRight.y - pointLeft.y) / (pointRight.x - pointRight.x));
        }
    }
    public bool hasCommomPoint(Vector2 vec, float k1) {
        float y = vec.y;
        double x;
        // Debug.Log(this.k + " " + this.b);
        if (this.k != null) {
            if (this.k == 0) {
                if (pointLeft.y == vec.y) {
                    if (pointLeft.x <= vec.x && pointRight.x > vec.x) {
                        return true;
                    } else{
                        return false;
                    }
                }
                else
                {
                    Debug.Log("K = 0 没有交点");
                    return false;
                }
            }
            else
            {
                x = (y - this.b) / this.k;
                if (pointLeft.x < x && x < pointRight.x)
                {
                    return true;
                }
                else
                {
                    Debug.Log("K != 0 交点 超限");
                    return false;
                }
            }
           
        }
        else
        {
            Debug.Log("没有K");
            if ((pointLeft.y <= y && y <= pointRight.y) || (pointLeft.y >= y && y >= pointRight.y)) {
                if (vec.x >= pointLeft.x) {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
    }
}

利用的理论基础:

从目标点向一个方向发一条线,若与目标图形的焦点个数为基数,则在内部,否则不在

但是有一下几个条件:

1.凹多边形:以上基础不适用,建议拆成突多边形来做

2.还有一种情况:

看图

注意:本例使用了Unity,只是为了取点数据。

转载于:https://www.cnblogs.com/BXLH/p/11245781.html

你可能感兴趣的文章
深入浅出JavaScript(2)—ECMAScript
查看>>
编程珠玑第十一章----排序
查看>>
Face The Right Way POJ - 3276 (开关问题)
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
变量的命名规范
查看>>
手机端自动跳转
查看>>
react中进入某个详情页URL路劲参数Id获取问题
查看>>
首届.NET Core开源峰会
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
python pdf转word
查看>>
文本相似度比较(网页版)
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>