Перетащите и измените форму многоугольника, перемещая вершины в C # - PullRequest
0 голосов
/ 22 марта 2012


Я должен сделать заявку на возделывание в C #. Плитки будут иметь некоторую форму, и мое приложение должно иметь возможность изменять форму. У меня будет некоторая форма - многоугольник, сделанный из вершин. Например, у меня будет поле из 16 вершин, и я нарисую многоугольник. Что мне нужно знать как я могу перемещаться по вершинам с помощью перетаскивания. Мне также придется пересчитывать другие вершины, чтобы подогнать одну плитку к следующей, но это всего лишь математика.

Чтобы сделать вывод: Я определил полигоном 16 вершин в поле Вершины, я перемещаюсь (с помощью мыши) на одну вершину, пересчитываю координаты других вершин и рисую новый многоугольник. Моя проблема заключается в перемещении (возможно, с помощью перетаскивания) с одной вершины из поля вершин.

Вот какая часть моего предыдущего кода без перетаскивания - просто для идеи, какие инструменты я использую для рисования одной плитки:

 private Bitmap canvasBitmap; //canvas for drawing
 private Graphics g; // enter to graphics tool  

            Bitmap b = (Bitmap)Bitmap.FromFile("obr.bmp");
            TextureBrush brush = new TextureBrush(b);
            Pen pen = new Pen(Color.Black, 1);

            hexaVertices[0] = new PointF(-40 + 40, 0 + 30);
            hexaVertices[1] = new PointF(-20 + 40, 30 + 30);
            hexaVertices[2] = new PointF(20 + 40, 30 + 30);
            hexaVertices[3] = new PointF(40 + 40, 0 + 30);
            hexaVertices[4] = new PointF(20 + 40, -30 + 30);
            hexaVertices[5] = new PointF(-20 + 40, -30 + 30);

 g.FillPolygon(brush, hexaVertices);
 g.DrawPolygon(pen, hexaVertices);

Спасибо за советы.

1 Ответ

3 голосов
/ 22 марта 2012

Я могу дать вам только приблизительное описание форм Windows Forms здесь.В WPF вы можете использовать Adorner s, и там есть учебники, как это сделать.Здесь мы рассмотрим ручной процесс в Windows Forms:

Во-первых, массив вершин должен быть переменной-членом класса и должен инициализироваться только один раз в начале программы.

Затем нарисуйте многоугольник с текущим набором вершин, как вы делаете сейчас.Кроме того, нарисуйте несколько «ручек», если хотите, чтобы вы знали, что вершины можно захватывать (это могут быть прямоугольники вокруг фактического PointF).

Теперь для магии :-) Назначьте MouseDown, MouseMove и MouseUp события для элемента управления, который вы используете для отображения изображения.Кроме того, создайте новую переменную-член bool m_draggingVertex и другую переменную, содержащую индекс для массива вершин перетаскиваемой в данный момент вершины.

In MouseDown:
Проверьте, является ли текущая позиция мышив пределах диапазона вершины (я бы предположил, что вокруг вершины есть прямоугольник 5x5, чтобы его было легче попасть курсором).Если вы нажали кнопку на вершине, установите m_draggingVertex на true и сохраните индекс вершины в другой переменной.

In MouseMove:
Если m_draggingVertex равно true, измените вершина с индексом, сохраненным выше, на новые координаты, пересчитайте свои позиции и перекрасьте так, чтобы отображалась текущая позиция вершины.

In MouseUp:
Если m_draggingVertex равноtrue, установите его на false и сделайте окончательную работу.

Вот как я это сделаю ...

...