在.NET Compact中模拟曲线图

时间:2012-08-15 09:58:52

标签: c# .net graph compact-framework geometry

我正在使用.NET Compact并创建日志比例。我目前有一个List,其中包含要绘制的值,然后将其转换为Points数组,然后Graphics.DrawLines()方法将获取它们并在每个点之间绘制一条线。但是,正如您可以想象的那样,这看起来可能是锯齿状和不稳定的。由于.NET Compact没有Graphics.DrawCurve()方法等,我想知道是否有人知道在可以模拟曲线图的点之间创建点的好方法?理想情况下,可以创建可能出现在点之间的样条曲线上的点。

2 个答案:

答案 0 :(得分:0)

好吧,我不能说我花了很多时间进入这个并理解正在发生的所有事情背后的数学,但我能够在a VB forum找到一个分裂的帖子将样条拼凑成段以制作情节。

我花了很多时间来按摩代码,以便将其转换为Windows Mobile的C#。

它编译,但我不知道如何处理它。

private void Spline(Graphics g, Pen pen, Point[] points, double tx) {
  int arrayLength = points.Length;
  int max = arrayLength - 4;
  if (3 < arrayLength) {
    for (int i = 0; i < arrayLength; i++) {
      int n1, n2, n3, n4;
      if (i == 0) {
        n1 = i + 0;
        n2 = i + 0;
        n3 = i + 1;
        n4 = i + 2;
      } else if (i < max) {
        n1 = i + 0;
        n2 = i + 1;
        n3 = i + 2;
        n4 = i + 3;
      } else {
        n1 = max + 1;
        n2 = max + 2;
        n3 = max + 3;
        n4 = max + 3;
      }
      Segment(g, pen, points[n1], points[n2], points[n3], points[n4], tx);
    }
  }
}

private void Segment(Graphics g, Pen pen, Point pt0, Point pt1, Point pt2, Point pt3, double tx) {
  int pointCount = 4;
  double sx1 = tx * (pt2.X - pt0.X);
  double sy1 = tx * (pt2.Y - pt0.Y);
  double sx2 = tx * (pt3.X - pt1.X);
  double xy2 = tx * (pt3.Y = pt2.Y);
  double a1 = sx1 + sx2 + 2 * pt1.X - 2 * pt2.X;
  double a2 = sy1 + xy2 + 2 * pt2.Y - 2 * pt2.Y;
  double b1 = -2 * sx1 - sx2 - 3 * pt1.X + 3 * pt2.X;
  double b2 = -2 * sy1 - xy2 - 3 * pt1.Y + 3 * pt2.Y;
  double c1 = sx1;
  double c2 = sy1;
  double d1 = pt1.X;
  double d2 = pt1.Y;
  for (int i = 0; i < pointCount; i++) {
    double x = (double)i / pointCount;
    double xSq = x * x; // x^2
    double xCu = x * xSq; // x^3
    double f1 = a1 * xCu + b1 * xSq + c1 * x + d1; // f(x) = A x^3 + B x^2 + C x + D
    double f2 = a2 * xCu + b2 * xSq + c2 * x + d2; // f(x) = A x^3 + B x^2 + C x + D
    double dx = Math.Floor(f1);
    double dy = Math.Floor(f2);
    g.DrawRectangle(pen, (int)dx, (int)dy, 1, 1); // calculated points
  }
  g.DrawRectangle(pen, pt0.X, pt0.Y, 1, 1); // original point
}

我不知道为double tx建议的值。你只需要玩弄它。

这可能会给你带来一些里程,但我真的不知道这会为你增加点数...除非你编辑代码以包含一些中间点。

一旦解决了问题,请使用最终结果的几个屏幕截图编辑您的帖子(如果您不介意的话)。

答案 1 :(得分:0)

您希望了解如何实现一些自己的图形方法。根据您想要的确切结果,您可以使用各种现有且记录完备的方法。在通用计算机图形和在线书籍中都有很多东西可以找到。例如,请参阅下面链接中的堆栈溢出文章,以获取一个示例作为起点:

Efficient Line Smoothing