2012-08-15 26 views
2

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

+1

你问“如何找到一个符合您的数据点功能?” – jp2code 2012-08-15 18:43:44

+0

不......我有创建锯齿图的点。我在问如何添加更多点来软化点,基本上复制了Graphics.DrawCurve()在提供Point数组时所做的操作,这些数据不幸遗失了.NET Compact Framework。由于屏幕显示非常小,即使在每个点之间只有2个额外的点,也没关系。 – MrShoes 2012-08-16 07:46:05

+1

如果您不担心图形是否精确,则可以使用某种带有更多控制点的插值(例如cos)。 – ssube 2012-08-16 15:00:24

回答

0

嗯,我不能说我花时间去了解并理解正在发生的一切背后的数学,但是我能够在a VB forum上找到一篇文章,将样条分成多个部分剧情。

我采取了一种破解方式来处理代码,以便将其移植到C#for Windows Mobile。

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

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。你只需要玩这个。

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

一旦你解决问题,编辑你的文章与最终结果的几个屏幕截图(如果你不介意)。

+0

这个答案绝对精彩。我很确定我可以用它作为解决问题的基础。我被要求少关注它,并将其留到项目结束时作为“很高兴”,但如果完成,我一定会更新你。 – MrShoes 2012-08-17 14:43:30

0

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

Efficient Line Smoothing