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,只是为了取点数据。

posted on 2019-07-25 17:42  百晓灵狐  阅读(282)  评论(0编辑  收藏  举报