我正在尝试使用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);
}
答案 0 :(得分:2)
当你将点的坐标相乘时,它们会围绕画布的左上角点(0,0)进行缩放:
为了围绕它的中心缩放它(我想你希望它以这种方式工作),你需要计算多边形的某种中心。为简单起见,它甚至可以分别是X和Y轴上坐标的算术平均值。如果你已经有了中心的坐标,则用中心坐标做出的反向矢量来转换每个点的坐标(如果你在这个操作之后绘制它,它就会是这样的 - 多边形的中心位于坐标系的中心):
现在,进行缩放:
并通过多边形中心坐标的矢量返回:
答案 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 ...
}