定位图形绘制

时间:2013-09-18 13:57:53

标签: c# winforms

我正在尝试使用e.Graphics.DrawPolygon(或DrawLine)绘制一些多边形和线条。但是我在指定绘制坐标时遇到了一些问题。我正在使用其Paint事件绘制到PictureBox。元素相对于彼此正确绘制(创建所需的最终图片),但似乎总是在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();
        }

我已经使用断点进行了检查,coordiinates是相同的比例(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); }

3 个答案:

答案 0 :(得分:2)

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

Polygon scaled around (0,0)

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

Polygon is in the center of the coordinate system

现在,进行缩放:

Polygon scaled

并通过多边形中心坐标的矢量返回

enter image description here

答案 1 :(得分: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);您正在进行翻译操作。

答案 2 :(得分:1)

如果你想在不修改存储的坐标的情况下移动一切,那么只需在绘图前翻译图形:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.TranslateTransform(100, 100); // shift the origin somehow
        // ... draw the polygons as before ...
    }