将笛卡尔坐标转换为图片框坐标c#

时间:2011-03-20 12:42:18

标签: c# pixel picturebox cartesian

我的问题更多是数学!我有一些值可以使用fromImage(Bitmap)在一个图片框上绘制曲线的重复点。我的图片框大小为500x500。我也知道左上角有点(0,0),右下角有点(500,500)。显然原点应该是(250,250)。现在我想知道如何将我自己的值转换为这种格式?

我的样本点是:

Voltage: -0.175         Current: -9.930625E-06
Voltage: -0.171875      Current: -9.53375E-06
Voltage: -0.16875       Current: -9.136875E-06
Voltage: -0.16875       Current: -8.74E-06
Voltage: -0.165625      Current: -8.343125E-06
Voltage: -0.1625        Current: -7.94625E-06
Voltage: -0.1625        Current: -7.549375E-06
Voltage: -0.159375      Current: -7.152188E-06
Voltage: -0.15625       Current: -6.755312E-06

您会看到电压值应该在X轴上,电流在Y轴上。我知道为了使它们更好一点,我必须将它们乘以更大的数字,也可以乘以反转或其他东西。但我仍然无法弄清楚如何在我的图片框上代表它们。这些点通常从第三象限开始,最终在第一象限。请帮忙!

添加我的X轴最小值和最大值为-2V和+ 2V,对于Y轴,我会得到-10uA到+ 10uA(即10 * 10 ^ -6)

修改

我想要做的是有这样的曲线,所以我在Graphics.DrawCurve中使用了这些点:

enter image description here

更新 这就是我的代码的样子:

            g.DrawLine(penAxis, 250, 0, 250, 500); // Y AXIS 
        g.DrawLine(penAxis, 0, 250, 500, 250); // X AXIS          

        PointF[] p = new PointF[pinData.GetLength(0)];   //pinData is AboutBoxForm double[,] array

        for (int i = 0; i < pinData.GetLength(0); i++)
        {
            p[i] = new PointF(250 * ((1 + (float)pinData[i, 0]) / 2), 250 * ((1 + (float)pinData[i, 1] )/ 10));  
        }

        Pen pengraph = new Pen(pinColor, 2.0F);
        g.DrawCurve(pengraph, p);

进度更新

好了,现在使用我的曲线下方的代码如下:

            g.DrawLine(penAxis, 250, 0, 250, 500); // Y AXIS 
        g.DrawLine(penAxis, 0, 250, 500, 250); // X AXIS          

        PointF[] p = new PointF[pinData.GetLength(0)];   //pinData is AboutBoxForm double[,] array

        for (int i = 0; i < pinData.GetLength(0); i++)
        {
            p[i] = new PointF(250 * (1 - ((float)pinData[i, 1] *100000) / 10), 250 * (1 + (((float)pinData[i, 0]))/ 2));  
        }

        Pen pengraph = new Pen(pinColor, 2.0F);
        g.DrawCurve(pengraph, p);

enter image description here

我认为现在的问题是缩放它。 已解决我不得不乘以10 ^ 6,但我做了^ 5不行即可!谢谢大家。

2 个答案:

答案 0 :(得分:1)

如果您希望缩放以适合屏幕,则将每个电压和电流值乘以 50

你所有的观点都在third quadrant;您可以在屏幕上选择原点(0, 0),并使所有negative x-axis点积极,即翻转y-axis

如果您不想缩放,请保持乘法因子一致。

答案 1 :(得分:1)

要使用整个范围的图片框,(V,C) = (0, 0)被映射到中心,您可以使用转换:

X = 250 * (1 + Voltage/2)
Y = 250 * (1 - Current/10)

请注意,这将使Y轴上的电流增加向上。如果您想要反向,请在第二次转换中使用(1 + Current/10)