2

我正在使用 .NET Compact 并创建对数刻度。我目前有一个保存要绘制的值的列表,然后将其转换为点数组,然后 Graphics.DrawLines() 方法将获取它们并在每个点之间画一条线。但是,您可以想象,这可能看起来参差不齐且不稳定。由于 .NET Compact 没有 Graphics.DrawCurve() 方法等,我想知道是否有人知道在可以模拟曲线图的点之间创建点的好方法?理想情况下,创建点的东西可能出现在点之间的样条线上。

4

2 回答 2

0

好吧,我不能说我花时间去研究这个并理解正在发生的一切背后的数学,但我能够在VB 论坛上找到一个帖子,将样条线分成多个片段来制作情节.

我对代码进行了修改以将其用于 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。你只需要玩弄它。

这可能会让您获得一些里程,但我真的不知道这会如何为您添加积分......除非您编辑代码以包含一些中间点。

一旦你解决了它,用一些最终结果的屏幕截图编辑你的帖子(如果你不介意的话)。

于 2012-08-16T14:56:08.290 回答
0

然后你想看看实现一些你自己的图形方法。根据您想要的确切结果,您可以使用各种现有的和有据可查的方法。在一般计算机图形学和在线书籍中都可以找到很多内容。例如,请参阅下面链接中的堆栈溢出文章作为起点:

高效的线条平滑

于 2012-08-16T15:26:29.503 回答