我正在处理以频率M重复的数据(像Sin / Cosin wave之类的东西等)。 我已经编写了一个简单的显示控件,它可以获取数据并绘制连接线,以漂亮的图片表示数据。
我的问题是,给出了数据,如果绘制到位图上,象限1数据在象限3中,象限2数据在象限4中(反之亦然)。
位图宽度为M,高度为array.Max - array.Min
。
是否有一个简单的转换来更改数据,以便它显示在适当的象限中?
答案 0 :(得分:3)
考虑它的好方法是世界坐标中的(0,0)分为
(0,0), (width, 0), (0,height), (width, height)
图像坐标中的(宽度/ 2,高度/ 2)。
从那里,转换将是:
Data(x,y) => x = ABS(x - (width/2)), y = ABS(y - (Height/2))
答案 1 :(得分:3)
Graphics.ScaleTransform不是一个好主意,因为它不仅会影响布局,还会影响绘图本身(笔画粗细,文本等)。
我建议你准备点列表,然后使用Matrix类对它们进行转换。这是我为你做的一个小例子,希望它会有所帮助。
private PointF[] sourcePoints = GenerateFunctionPoints();
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.Clear(Color.Black);
// Wee need to perform transformation on a copy of a points array.
PointF[] points = (PointF[])sourcePoints.Clone();
// The way to calculate width and height of our drawing.
// Of course this operation may be performed outside this method for better performance.
float drawingWidth = points.Max(p => p.X) - points.Min(p => p.X);
float drawingHeight = points.Max(p => p.Y) - points.Min(p => p.Y);
// Calculate the scale aspect we need to apply to points.
float scaleAspect = Math.Min(ClientSize.Width / drawingWidth, ClientSize.Height / drawingHeight);
// This matrix transofrmation allow us to scale and translate points so the (0,0) point will be
// in the center of the screen. X and Y axis will be scaled to fit the drawing on the screen.
// Also the Y axis will be inverted.
Matrix matrix = new Matrix();
matrix.Scale(scaleAspect, -scaleAspect);
matrix.Translate(drawingWidth / 2, -drawingHeight / 2);
// Perform a transformation and draw curve using out points.
matrix.TransformPoints(points);
e.Graphics.DrawCurve(Pens.Green, points);
}
private static PointF[] GenerateFunctionPoints()
{
List<PointF> result = new List<PointF>();
for (double x = -Math.PI; x < Math.PI; x = x + 0.1)
{
double y = Math.Sin(x);
result.Add(new PointF((float)x, (float)y));
}
return result.ToArray();
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
Invalidate();
}
答案 2 :(得分:2)
尝试使用
反转y轴g.ScaleTransform(1, -1);
答案 3 :(得分:1)
还要记住,对于在缩放上下文中绘制,如果必须,Pen例如在其某些构造函数中将width作为Single,这意味着可以使用反比例小数值对ScaleTransform的效果进行不变的补偿。
更新:忘了,Pen有自己的局部ScaleTransform,因此可以补偿x和y。