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