【问题标题】:Translating data points to pixel coordinates for drawing将数据点转换为像素坐标以进行绘图
【发布时间】:2012-07-18 20:38:02
【问题描述】:

我有一个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,如果 X 轴上的值介于 -2 和 +2 之间,则应该绘制它们的平均值,对于作为 Y 轴的电流值,例如,如果它们在 -10 micro 和 +10 u 之间,则应绘制它们

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

例如,这是我拥有的第一个实际值数据点:(-0.6375, -0.00000993375),我的方法将其转换为 (24.515625, 932.899536),它超出了 Piturebox 的大小。

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

有什么想法吗?

【问题讨论】:

    标签: c# winforms math drawing pixel


    【解决方案1】:

    我发现问题了!!!在我使用的公式中,我必须将宽度和高度除以 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))); 
    

    【讨论】:

      【解决方案2】:

      缩放坐标后需要将形状向后移动,因为它会变大,但另一侧的起始位置会有所不同,因此在缩放后,您需要将形状拉回原来的起始位置。 所以你需要定义一个起始位置,它可以是最左边的底点。之后,您可以检查原始坐标和放大坐标的 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;
              }
      

      【讨论】:

      • 谢谢,你能解释一下我应该给leftBottomPointOriginalleftBottomPointScaledUp分配什么吗?我没明白!
      • 我认为您应该在此处定位到中心,因此请获取图表上 0,0 位置的点。如果放大真实坐标,则可以检查差异并将图形重新定位到中心。
      • 嗯,它比那更简单,我原来的方法是正确的,我只需要在我的等式中将宽度和高度除以 2!无论如何谢谢。
      猜你喜欢
      • 2015-01-17
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多