1

我正在尝试使用e.Graphics.DrawPolygon(或 DrawLine)绘制一些多边形和线条。但是我在指定要绘制的坐标时遇到了一点问题。我正在PictureBox使用它的 Paint 事件进行绘图。元素之间相对正确地绘制(创建所需的最终图片),但似乎总是在 PictureBox 的左上角绘制。在创建要绘制的点时,当我只是尝试乘以坐标时,它会在同一个地方绘制它但更大(乘以大小,而不是位置坐标)。这是我的代码:

//some for loop
{
//getting the coordinates
Point toAdd = new Point((int)xCoord, (int)yCoord); // creating the point from originaly a double, here i tried to multiply..
tmpPoints.Add(toAdd); // tmpPoints is a List<Point>
}
points.Add(tmpPoints.ToArray()); //List<Point[]>


drawBuffer = points; //saving to a public List<Point[]>
points.Clear();
this.Invalidate();

这里是 pictureBox1_Paint 方法的一部分:

for (int i = 0; i < drawBuffer.Count; i++)
        {
                //some other stuff like deciding which color to use, not very important
                Brush br = new SolidBrush(polyColor);
                e.Graphics.FillPolygon(br, drawBuffer[i]);
                brush.Dispose();
        }

我已经使用断点检查过,坐标是相同的比例(100 像素宽仍然是 100 像素宽),它们的坐标像 x 3000 和 y 1500,但它只是在左上角绘制自己。当我将坐标乘以 3 次(请参阅我乘以的地方的代码)时,它会在同一个地方绘制,但要大 3 倍(检查坐标后没有意义......)所以,我的问题是 - 如何我要正确设置位置,还是有其他方法可以做到这一点?像这样(我知道,这是废话,只是一个例子)

foreach(Polygon poly in e.Graphics) { poly.Location = new Point(poly.Location.X * 2, poly.Location.Y * 2); }

4

3 回答 3

3

当您将点的坐标相乘时,它们会围绕画布的左上角点 (0, 0) 进行缩放:

多边形围绕 (0,0) 缩放

为了围绕它的中心缩放它(我想你希望它以这种方式工作),你需要计算多边形的某种中心。为简单起见,它甚至可以是分别在 X 和 Y 轴上的坐标的算术平均值。如果您已经有了中心的坐标,则将每个点的坐标转换为由中心坐标生成的反向矢量(如果您在此操作后绘制它,这就是它的样子 - 多边形的中心在中心坐标系):

多边形在坐标系的中心

现在,进行缩放:

多边形缩放

并将其移多边形中心坐标的向量:

在此处输入图像描述

于 2013-09-18T14:28:43.723 回答
1

当你乘

poly.Location = new Point(poly.Location.X * 2, poly.Location.Y * 2); 添加时您正在执行拉伸操作

poly.Location = new Point(poly.Location.X + 50, poly.Location.Y +50);你正在做翻译操作。

于 2013-09-18T14:17:51.357 回答
1

如果您想在不修改存储坐标的情况下移动所有内容,那么只需在绘制之前翻译图形:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.TranslateTransform(100, 100); // shift the origin somehow
        // ... draw the polygons as before ...
    }
于 2013-09-18T14:22:03.110 回答