2012-08-15 29 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