C# 在.NETCompact中模拟曲线图

C# 在.NETCompact中模拟曲线图,c#,.net,graph,compact-framework,geometry,C#,.net,Graph,Compact Framework,Geometry,我正在使用.NETCompact并创建一个日志比例。我目前有一个列表,其中包含要绘制的值,然后将其转换为一个点数组,Graphics.DrawLines方法将获取这些值并在每个点之间绘制一条线。然而,正如您所能想象的,这可能看起来参差不齐且不稳定。由于.NET Compact没有Graphics.DrawCurve之类的方法,我想知道是否有人知道在点之间创建点的好方法,可以模拟曲线图?理想情况下,可以创建点,这些点可能出现在点之间的样条曲线上。好吧,我不能说我花了时间来研究这一点,并理解正在发生

我正在使用.NETCompact并创建一个日志比例。我目前有一个列表,其中包含要绘制的值,然后将其转换为一个点数组,Graphics.DrawLines方法将获取这些值并在每个点之间绘制一条线。然而,正如您所能想象的,这可能看起来参差不齐且不稳定。由于.NET Compact没有Graphics.DrawCurve之类的方法,我想知道是否有人知道在点之间创建点的好方法,可以模拟曲线图?理想情况下,可以创建点,这些点可能出现在点之间的样条曲线上。

好吧,我不能说我花了时间来研究这一点,并理解正在发生的一切背后的数学原理,但我能够找到一篇文章,将样条曲线分割成若干段,以制作一个绘图

我在修改代码以使其进入WindowsMobile的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
}
我不知道双tx的建议值是多少。你只需要好好玩玩

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


一旦你解决了问题,如果你不介意的话,可以用一些最终结果的屏幕截图来编辑你的帖子。

好吧,我不能说我花了时间来研究这个问题,并且理解了正在发生的一切背后的数学原理,但是我找到了一篇关于将样条线分割成若干段来绘制图的帖子

我在修改代码以使其进入WindowsMobile的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
}
我不知道双tx的建议值是多少。你只需要好好玩玩

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


一旦你解决了问题,如果你不介意的话,用一些最终结果的屏幕截图来编辑你的文章。

你想看看如何实现一些自己的图形方法。根据您想要的确切结果,您可以使用各种现有的和有良好文档记录的方法。在普通计算机图形学和网络图形学方面的书籍中都可以找到很多。例如,请参考下面链接中的stack overflow文章中的一个示例作为起点:


然后,您想看看如何实现一些自己的图形方法。根据您想要的确切结果,您可以使用各种现有的和有良好文档记录的方法。在普通计算机图形学和网络图形学方面的书籍中都可以找到很多。例如,请参考下面链接中的stack overflow文章中的一个示例作为起点:


你是在问如何找到一个与你的数据点匹配的函数吗?不是。。。我有一些点可以创建一个参差不齐的图形。我想问的是,如何添加更多的点来软化这些点,以基本上复制Graphics.DrawCurve在提供点数组时所做的工作,不幸的是.NET Compact Framework缺少这些点。由于屏幕显示非常小,即使每个点之间只有两个额外的点,也可以。如果您不担心图形是否精确,例如,您可以使用具有更多控制点cos的某种插值。您是否询问如何找到与数据点匹配的函数?否。。。我有一些点可以创建一个参差不齐的图形。我想问的是,如何添加更多的点来软化这些点,以基本上复制Graphics.DrawCurve在提供点数组时所做的工作,不幸的是.NET Compact Framework缺少这些点。由于屏幕显示非常小,即使每个点之间只有两个额外的点,也没关系。如果你不担心图形的精确性,你可以使用某种插值,例如使用更多的控制点cos。这个答案绝对精彩。我很确定我可以用这个作为解决问题的基础。我被要求减少对它的关注,把它作为一个很好的工具放在项目结束之前,但是如果完成了,我一定会告诉你的。这个答案非常棒。我很确定我可以用这个作为解决问题的基础。我被要求减少对它的关注,把它作为一个好东西留到项目结束,但如果完成,我一定会告诉你。