private void GroupMarkers() { List <MarkerGroup> groups = new List <MarkerGroup>(); for (int zoom = OnlineMaps.MAXZOOM; zoom >= 3; zoom--) { List <OnlineMapsMarker> ms = markers.Select(m => m).ToList(); for (int j = 0; j < ms.Count - 1; j++) { OnlineMapsMarker marker = ms[j]; MarkerGroup group = null; double px, py; marker.GetTilePosition(out px, out py); int k = j + 1; while (k < ms.Count) { OnlineMapsMarker marker2 = ms[k]; double p2x, p2y; marker2.GetTilePosition(out p2x, out p2y); if (OnlineMapsUtils.Magnitude(px, py, p2x, p2y) < distance) { if (group == null) { group = new MarkerGroup(zoom, groupTexture); groups.Add(group); group.Add(marker); if (marker.range.min == 3) { marker.range.min = zoom + 1; } } group.Add(marker2); if (marker2.range.min == 3) { marker2.range.min = zoom + 1; } ms.RemoveAt(k); px = group.tilePositionX; py = group.tilePositionY; } else { k++; } } } } foreach (MarkerGroup g in groups) { g.Apply(font); } }
private Rect GetMarkerRect(OnlineMapsMarker marker) { const int s = OnlineMapsUtils.tileSize; double tx, ty; marker.GetTilePosition(out tx, out ty); tx -= bufferPosition.x; ty -= bufferPosition.y; OnlineMapsVector2i ip = marker.GetAlignedPosition((int)(tx * s), (int)(ty * s)); return(new Rect(ip.x, ip.y, marker.width, marker.height)); }