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); }
//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; } }
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); }
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; }
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; }