コード例 #1
0
ファイル: MainWindow.xaml.cs プロジェクト: zbx91/meshReader
        private int MarkMeshEllipses(PolyArea areaType)
        {
            int marked = 0;

            foreach (var ellipse in _finalEllipses)
            {
                var center = GetPointLocation(ellipse.Margin.Left, ellipse.Margin.Top);

                uint[] foundPolys;
                var    status = _pather.Query.QueryPolygons(center, new float[] { 5, 500, 5 }, _pather.Filter, out foundPolys);
                if (foundPolys == null || status.HasFailed())
                {
                    continue;
                }

                bool  haveHeight    = false;
                float terrainHeight = 0.0f;
                foreach (var pref in foundPolys)
                {
                    var height = _pather.Query.GetPolyHeight(pref, center);
                    if (height == 0.0f)
                    {
                        continue;
                    }
                    terrainHeight = height;
                    haveHeight    = true;
                    break;
                }

                if (!haveHeight)
                {
                    continue;
                }

                center[1] = terrainHeight;

                var startRef = _pather.Query.FindNearestPolygon(center, new float[] { 5, 5, 5 }, _pather.Filter);
                if (startRef == 0)
                {
                    continue;
                }

                marked += _pather.Query.MarkAreaInCircle(startRef, center, 5, _pather.Filter, PolyArea.Road);
            }

            return(marked);
        }
コード例 #2
0
ファイル: PlaneMap.cs プロジェクト: ututrc/ME-UnitySDK
    //Checks if mapObject is inside a polygon. MapObject and polygon area  are given as parameter
    public void PolyCheck(MapObject vM, PolyArea pM)
    {
        Vector2 v = vM.MapPos;

        Vector2[] p = pM.Vectors;

        int  j = p.Length - 1;
        bool c = false;

        for (int i = 0; i < p.Length; j = i++)
        {
            c ^= p[i].y > v.y ^ p[j].y > v.y && v.x < (p[j].x - p[i].x) * (v.y - p[i].y) / (p[j].y - p[i].y) + p[i].x;
        }
        if (c)
        {
            pM.IsInPoly = true;
        }
        else
        {
            pM.IsInPoly = false;
        }
    }
コード例 #3
0
ファイル: MainWindow.xaml.cs プロジェクト: zbx91/meshReader
        private int MarkMesh(PolyArea areaType)
        {
            int marked = 0;

            foreach (var poly in _finalPolygons)
            {
                // calculate center
                var center = new float[3];
                foreach (var point in poly.Points)
                {
                    var loc = GetPointLocation(point.X, point.Y);
                    center[0] += loc[0];
                    center[1] += loc[1];
                    center[2] += loc[2];
                }
                center[0] /= poly.Points.Count;
                center[1] /= poly.Points.Count;
                center[2] /= poly.Points.Count;

                uint[] foundPolys;
                var    status = _pather.Query.QueryPolygons(center, new float[] { 5, 500, 5 }, _pather.Filter, out foundPolys);
                if (foundPolys == null || status.HasFailed())
                {
                    continue;
                }

                bool  haveHeight    = false;
                float terrainHeight = 0.0f;
                foreach (var pref in foundPolys)
                {
                    var height = _pather.Query.GetPolyHeight(pref, center);
                    if (height == 0.0f)
                    {
                        continue;
                    }
                    terrainHeight = height;
                    haveHeight    = true;
                    break;
                }

                if (!haveHeight)
                {
                    continue;
                }

                center[1] = terrainHeight;

                // two points per poly point since we need 3D
                var verts = new float[poly.Points.Count * 6];

                for (int i = 0; i < poly.Points.Count; i++)
                {
                    var point = poly.Points[i];
                    var loc   = GetPointLocation(point.X, point.Y);
                    verts[(i * 6) + 0] = loc[0];
                    verts[(i * 6) + 1] = terrainHeight - 20.0f;
                    verts[(i * 6) + 2] = loc[2];
                    verts[(i * 6) + 3] = loc[0];
                    verts[(i * 6) + 4] = terrainHeight + 20.0f;
                    verts[(i * 6) + 5] = loc[2];
                }

                var startRef = _pather.Query.FindNearestPolygon(center, new float[] { 5, 5, 5 }, _pather.Filter);
                if (startRef == 0)
                {
                    continue;
                }

                marked += _pather.Query.MarkAreaInShape(startRef, verts, _pather.Filter, areaType);
            }

            return(marked);
        }
コード例 #4
0
ファイル: MainWindow.xaml.cs プロジェクト: Bia10/meshReader
        private int MarkMesh(PolyArea areaType)
        {
            int marked = 0;

            foreach (var poly in _finalPolygons)
            {
                // calculate center
                var center = new float[3];
                foreach (var point in poly.Points)
                {
                    var loc = GetPointLocation(point.X, point.Y);
                    center[0] += loc[0];
                    center[1] += loc[1];
                    center[2] += loc[2];
                }
                center[0] /= poly.Points.Count;
                center[1] /= poly.Points.Count;
                center[2] /= poly.Points.Count;

                uint[] foundPolys;
                var status = _pather.Query.QueryPolygons(center, new float[] {5, 500, 5}, _pather.Filter, out foundPolys);
                if (foundPolys == null || status.HasFailed())
                    continue;

                bool haveHeight = false;
                float terrainHeight = 0.0f;
                foreach (var pref in foundPolys)
                {
                    var height = _pather.Query.GetPolyHeight(pref, center);
                    if (height == 0.0f)
                        continue;
                    terrainHeight = height;
                    haveHeight = true;
                    break;
                }

                if (!haveHeight)
                    continue;

                center[1] = terrainHeight;

                // two points per poly point since we need 3D
                var verts = new float[poly.Points.Count * 6];

                for (int i = 0; i < poly.Points.Count; i++)
                {
                    var point = poly.Points[i];
                    var loc = GetPointLocation(point.X, point.Y);
                    verts[(i*6) + 0] = loc[0];
                    verts[(i*6) + 1] = terrainHeight - 20.0f;
                    verts[(i*6) + 2] = loc[2];
                    verts[(i*6) + 3] = loc[0];
                    verts[(i*6) + 4] = terrainHeight + 20.0f;
                    verts[(i*6) + 5] = loc[2];
                }

                var startRef = _pather.Query.FindNearestPolygon(center, new float[] {5, 5, 5}, _pather.Filter);
                if (startRef == 0)
                    continue;

                marked += _pather.Query.MarkAreaInShape(startRef, verts, _pather.Filter, areaType);
            }

            return marked;
        }
コード例 #5
0
ファイル: MainWindow.xaml.cs プロジェクト: Bia10/meshReader
        private int MarkMeshEllipses(PolyArea areaType)
        {
            int marked = 0;

            foreach (var ellipse in _finalEllipses)
            {
                var center = GetPointLocation(ellipse.Margin.Left, ellipse.Margin.Top);

                uint[] foundPolys;
                var status = _pather.Query.QueryPolygons(center, new float[] { 5, 500, 5 }, _pather.Filter, out foundPolys);
                if (foundPolys == null || status.HasFailed())
                    continue;

                bool haveHeight = false;
                float terrainHeight = 0.0f;
                foreach (var pref in foundPolys)
                {
                    var height = _pather.Query.GetPolyHeight(pref, center);
                    if (height == 0.0f)
                        continue;
                    terrainHeight = height;
                    haveHeight = true;
                    break;
                }

                if (!haveHeight)
                    continue;

                center[1] = terrainHeight;

                var startRef = _pather.Query.FindNearestPolygon(center, new float[] {5, 5, 5}, _pather.Filter);
                if (startRef == 0)
                    continue;

                marked += _pather.Query.MarkAreaInCircle(startRef, center, 5, _pather.Filter, PolyArea.Road);
            }

            return marked;
        }