【问题标题】:convert cartesian coordinate to picturebox coordinates c#将笛卡尔坐标转换为图片框坐标c#
【发布时间】:2011-03-20 12:42:17
【问题描述】:

我的问题更多的是数学!我有一些值表示我想使用 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 中使用了这些点:

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

            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);

我认为现在的问题是扩展它。 已解决我必须乘以 10^6,但我用 ^5 做了,不,没关系!!!谢谢大家。

【问题讨论】:

    标签: c# pixel picturebox cartesian


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,我认为这样做只是让我的曲线变成一条直线。请在原始帖子中查看我的编辑。
    • @Sean87:在这样做之前,您是否将当前乘以10 ^ 6?那将是必需的。
    • 哦,是的,我忘记了。它现在看起来像一条真正的曲线!谢谢。但它还没有缩放。所以它非常小。我怎样才能使它更大以适合我的 500x500 盒子?我将用屏幕截图更新我的帖子。
    【解决方案2】:

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

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

    如果您不想缩放,请保持乘法因子为单位。

    【讨论】:

    • @ukhardy 哦,再也没有数学考试了 :(
    • @ukhardy 感谢您的提示,我发布的这些示例点只是其中的几个,它们可能在所有象限中(但必须是第三和第一)。我必须分别对每个象限进行计算还是只进行一次转换??
    • 在这种情况下,如果您的点位于所有象限中,那么您可以离开笛卡尔原点 (0,0) 并应用欧几里得变换。您可以从这里轻松实现公式en.wikipedia.org/wiki/Cartesian_coordinate_system
    • 要将原点从 (0, 0) 移动到 (X, Y),您的每个点 (x, y) 将变为 (x + X, y + Y)。
    • 选择比例因子 M,使得 max(|ordinate|) * M
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多