拖动;通过在C#中移动顶点来删除修改多边形形状

时间:2012-03-22 09:46:10

标签: c# graphics drag-and-drop 2d


我必须在C#中申请耕种。瓷砖将有一些形状,我的应用程序应该能够修改形状。我会有一些形状 - 多边形,由顶点构成。我将有例如16个顶点的字段,然后我绘制多边形。 我需要知道的是什么如何使用拖放移动顶点。我还需要重新计算其他顶点,以便将一个平铺贴合到下一个平铺,但这只是一些数学。

总结: 我有多边形在顶点的字段中定义了16个顶点,我用一个顶点移动(用鼠标),重新计算欧氏顶点的坐标并绘制新的多边形。我的问题是移动(可能使用拖放)与顶点字段的一个顶点。

这是我以前的代码中没有拖拽的部分。 drop - 只是想知道我用来绘制一块瓷砖的工具:

 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 个答案:

答案 0 :(得分:3)

我只能在这里为您提供Windows窗体的大致轮廓。在WPF中,您可以使用Adorner,并且有关于如何执行此操作的教程。在这里,我们在Windows窗体中进行手动过程:

首先,顶点数组应该是类的成员变量,并且应该只在程序开始时初始化一次。

然后,就像你现在正在做的那样用当前的顶点集绘制多边形。此外,如果需要,绘制一些“手柄”,因此您知道可以抓取顶点(这可能是实际PointF周围的矩形)。

现在为魔术:-)将MouseDownMouseMoveMouseUp事件分配给您用于显示图像的控件。此外,创建一个新的成员变量bool m_draggingVertex和另一个包含您当前正在拖动的顶点的顶点数组的索引。

MouseDown
检查当前鼠标位置是否在椎骨的范围内(我假设一个顶点周围有一个5x5的矩形,这样就更容易用光标击中)。如果按下顶点上的按钮,请将m_draggingVertex设置为true,并将顶点的索引存储在另一个变量中。

MouseMove
如果m_draggingVertextrue,请将上面存储的索引处的椎骨更改为新坐标,重新计算您的位置并重新绘制,以便显示顶点的当前位置。

MouseUp
如果m_draggingVertextrue,请将其设置为false并进行最终工作。

我就是这样做的......