将数据点转换为用于绘图的像素坐标

时间:2012-07-18 12:08:35

标签: c# winforms math drawing pixel

我有一个PictureBox,我想通过知道它的数据点(点,X,Y)绘制二极管曲线。目前我的图片框大小为365 * 468像素。我正在摸索我将数据点转换为像素友好值,以便曲线在图片框上很好地绘制。

到目前为止,我尝试了各种配方但没有成功!目前我被困在代码中,它至少表现出一点曲线!

    private PointF[] TranslatePoints(PointF[] points)
    {
        var count = points.Count();
        var p = new PointF[count];

        for(var i = 0; i < count; i++)
        {
            p[i].X = DrawingArea.Width * (1 + (points[i].X / _voltageRange));
            p[i].Y = DrawingArea.Height * (1 - (points[i].Y * (float)Math.Pow(_currentRange, -1)));
        }

        return p;
    }

_voltageRange_currentRange是我希望曲线基于的比例......通常为+2,应该表示如果它们介于-2之间,则应绘制X轴上的值和+2,对于Y轴值的电流应该被绘制,例如,如果它们在-10微米和+10微米之间

我希望此方法尽可能独立,因此如果我调整图片框的大小,则会正确更新比例。

这是我的实际值的第一个数据点:( - 0.6375,-0.00000993375),我的方法将其翻译为(24.515625,932.899536),这个数据超出了piturebox的大小。

通常二极管曲线如下所示:

enter image description here

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我发现了问题!在我使用的公式中,我不得不将宽度和高度除以2!像这样:

   p[i].X = (DrawingArea.Width/2F) * (1 + (points[i].X / _voltageRange)); 
   p[i].Y = (DrawingArea.Height/2F) * (1 - (points[i].Y * (float)Math.Pow(_currentRange, -1))); 

答案 1 :(得分:0)

Aftre缩放您需要移回形状的坐标,因为它会更大,但在另一侧,起始位置会有所不同,因此在放大后,您需要将形状拉回到原始起始位置。 因此,您需要定义一个起始位置,该位置可能是最左下角。之后,您可以检查原始坐标和放大坐标的X / Y差异,并使用以下值更正其他点:

var leftBottomPointOriginal = LeftBottom(points)
var leftBottomPointScaledUp= LeftBottom(scaledUpPoints)

var xCorrection = leftBottomPointScaledUp.X-leftBottomPointOriginal.X
var yCorrection = leftBottomPointScaledUp.Y-leftBottomPointOriginal.Y


 for(var i = 0; i < count; i++)
        {
            p[i].X = DrawingArea.Width * (1 + (points[i].X / _voltageRange))-xCorrection;
            p[i].Y = DrawingArea.Height * (1 - (points[i].Y * (float)Math.Pow(_currentRange, -1)))-yCorrection;
        }