Рад, что наконец нашел это. При наведении курсора мыши напишите этот код:
isdraggingshape = true;
if (selectedshape != null)
{
OffsetX = selectedshape.Start.X - e.Location.X;
OffsetY = selectedshape.Start.Y - e.Location.Y;
}
при движении мыши:
if (isdraggingshape == true)
{
if (OffsetX != null && OffsetY != null)
{
if (e.Button == MouseButtons.Left)
{ int new_x1 = e.X + OffsetX;
int new_y1 = e.Y + OffsetY;
int dx = new_x1 - selectedshape.Start.X;
int dy = new_y1 - selectedshape.Start.Y;
if (dx == 0 && dy == 0) return;
// Move the shape
for (int i = 0; i < selectedshape.points.Count; i++)
{
selectedshape.points[i] = new Point(selectedshape.points[i].X + dx,selectedshape.points[i].Y + dy);
}
// Redraw.
ImagepictureBox.Invalidate();
}
Кажется, что наиболее распространенный способ достижения этого - нарисовать GPolygon с достаточным количеством точек для симуляции круга. В приведенном вами примере используется этот метод. На этой странице есть хороший пример - ищите функцию drawCircle в исходном коде.
У меня была эта проблема в прошлом, поэтому я отметил это обсуждение .
Подводя итог, вы можете:
В сферической геометрии фигуры определяются точками, линиями и углами между этими линиями. У вас есть только те элементарные значения, с которыми можно работать.
Поэтому круг (в форме фигуры, спроецированной на сферу) - это то, что должно быть аппроксимировано с использованием точек. Чем больше точек, тем больше это будет выглядеть как круг.
Сказав это, поймите, что карты Google проецируют Землю на плоскую поверхность (подумайте, «раскатывая» Землю и растягивая + уплощая пока не выглядит "квадрат"). А если у вас плоская система координат, вы можете рисовать на ней 2D-объекты сколько хотите.
Другими словами, вы можете нарисовать масштабированный векторный круг на карте Google. Подвох, Google Maps не делает не дать его вам из коробки (они хотят оставаться настолько близкими к значениям ГИС, насколько это прагматично возможно). Они только дают вам GPolygon, который они хотят, чтобы вы использовали, чтобы приблизиться к кругу. Однако этот парень сделал это , используя vml для IE и svg для других браузеров (см. Раздел «Масштабированные круги»).
Теперь вернемся к вашему вопросу о Google Локаторе, используя масштабированное изображение круга (и это, вероятно, наиболее полезно для вас): если вы знаете, что радиус вашего круга никогда не изменится (например, он всегда составляет 10 миль вокруг некоторой точки), то самым простым решением будет использование GGroundOverlay , который это просто URL-адрес изображения + GLatLngBounds, которые представляет изображение. Единственная работа, которую вам нужно сделать, это собрать GLatLngBounds , представляющий ваш радиус в 10 миль. Как только у вас есть это,
Я только что написал в блоге статью, которая посвящена именно этому и может быть вам полезна: http://seewah.blogspot.com/2009/10/circle-overlay-on-google-map.html
По сути, вам нужно создать GGroundOverlay с правильными GLatLngBounds. Сложность заключается в вычислении координаты юго-западного угла и координаты северо-восточного угла этого воображаемого квадрата (GLatLngBounds), ограничивающего этот круг, на основе желаемого радиуса. Математика довольно сложная, но вы можете просто сослаться на функцию getDestLatLng в блоге. Остальное должно быть довольно простым.