将笛卡尔坐标转换为C#中的PictureBox控件坐标

3
我需要翻译的内容如下:

我的问题更多是数学方面的!我有一些值对,它们代表了一个曲线上的点,我想使用fromImage(Bitmap)在picturebox上绘制这些点。我的图片框大小为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轴上看到电流值。我知道为了使它们更好,我需要将它们乘以一个更大的数字,也许还要乘以倒数或其他什么数。但我仍然不知道如何在我的picturebox上表示它们。这些点通常从第三象限开始,最后落在第一象限。请协助!
另外,我的X轴最小值和最大值分别为-2V和+2V,对于Y轴,我会有-10uA到+10uA(即10*10^-6)。
编辑:
我正在尝试制作这样的曲线,所以我拥有的这些点将用于Graphics.DrawCurve:
更新:
这是我的代码长这样:
            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个回答

1

如果您想要缩放以适应屏幕,请将每个电压和电流值乘以50

您所有的点都位于第三象限;您可以在屏幕上选择原点(0, 0),并使所有负x轴点变为正数,即沿y轴翻转。

如果您不想进行缩放,请保持乘法因子为1。


@ukhardy 哦,又是数学考试 :( - Dumbo
@ukhardy 感谢您的提示,我发布的这些示例点只是其中的一部分,它们可能位于所有象限(但主要是第三和第一象限)。我需要为每个象限单独进行计算还是只需要进行一次转换? - Dumbo
如果您的点位于所有象限中,则可以离开笛卡尔原点(0,0)并应用欧几里得变换。 您可以从此处获取易于实现的公式http://en.wikipedia.org/wiki/Cartesian_coordinate_system - ukhardy
将原点从(0,0)移动到(X,Y),每个点(x,y)变为(x + X,y + Y)。 - ukhardy
选择缩放因子M,使得max(|纵坐标|)* M <= 500的顺序。每个(x,y)变为(Mx,My)。 - ukhardy
@ukhardy 哦天啊,我的大脑停滞了:(。能不能请你给个数字?顺便说一下很抱歉打扰你,我知道这是我自己该做的事情。 - Dumbo

1

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

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

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

嗨,我认为这样做只会让我的曲线变成一条直线。请查看我在原始帖子中的编辑。 - Dumbo
@Sean87:在进行这个操作之前,你是否将电流乘以了10 ^ 6?这是必须的。 - Ani
哦,是的,我忘记了。现在看起来像真正的曲线了!谢谢。但它还没有缩放。所以它非常小。我该如何使它变大以适应我的500x500盒子?我将在帖子中更新屏幕截图。 - Dumbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接