1

我在带有 Qt 4.8.7 的 Windows 10 下使用 MathGL 2.3.5.1 ( http://mathgl.sourceforge.net/doc_en/Main.html )。

我在使用 MathGL 的向量场时遇到问题。在https://sourceforge.net/projects/mathgl/files/mathgl/mathgl%202.3.5/下有一个文件名为 mathgl-2.3.5.eng.pdf 的 MathGL 文档, “4.15 矢量字段”部分描述“Vect”方法的使用。当然,在“2.8 矢量场样本”一节中有一个矢量场示例。

首先,我对向量场的理解是有点(在我的情况下它总是二维的)和(数学上的)向量。所以点 P1(1,1) 和向量 V1(1,1) 的组合意味着箭头从点 P1(1,1) 到点 P2(2,2) 结束,这是简单的向量加法:P2 = P1 + V1。

现在回到 MathGL。我说的是这个方法: void Vect (const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="");

如果我正确理解参数,那么

  • x 表示箭头的起点,以 x 为单位
  • y 以 y 单位表示箭头的起点
  • ax 表示(数学上)向量在 x 方向上的单位
  • ay 表示(数学上)向量在 y 方向上的单位

所以让我们从编码开始。

int sample(mglGraph *gr)
{
    long cols=2;
    long rows=2;
    mglData x;    x.Create(cols, rows);
    x.a[0] = 1.0;    x.a[1] = 0.0;    x.a[2] = 0.0;    x.a[3] = 0.0;
    mglData y;    y.Create(cols, rows);
    y.a[0] = 1.0;    y.a[1] = 0.0;    y.a[2] = 0.0;    y.a[3] = 0.0;
    mglData ax;    ax.Create(cols, rows);
    ax.a[0] = 1.0;    ax.a[1] = 0.0;    ax.a[2] = 0.0;    ax.a[3] = 0.0;
    mglData ay;    ay.Create(cols, rows);
    ay.a[0] = 1.0;    ay.a[1] = 0.0;    ay.a[2] = 0.0;    ay.a[3] = 0.0;

    gr->Title("Vector field P1(1,1) V1(1,1)");
    gr->SetRanges(0, 3, 0, 3);
    gr->Vect(x, y, ax, ay, "<");
    gr->Box();
    gr->Axis();
    gr->Grid("xy", "h:");
    return 0;
}

首先,我无法为 x、y、ax 和 ay 创建“列向量”,意思是我不能写:

long cols=1;
long rows=2;
mglData x; x.Create(cols, rows); x.a[0] = 1.0; x.a[1] = 0.0;
mglData y; y.Create(cols, rows); y.a[0] = 1.0;  y.a[1] = 0.0;
mglData ax; ax.Create(cols, rows); ax.a[0] = 1.0; ax.a[1] = 0.0;
mglData ay; ay.Create(cols, rows); ay.a[0] = 1.0; ay.a[1] = 0.0;

然后 gr->Vect(x, y, ax, ay, "<"); 将此消息放在控制台上:

MathGL message - Vect: data dimension(s) is too small

在这段代码中,我们设置了 Point P1: xa[0] = 1.0; 和 ya[0] = 1.0;。向量 V1 应表示为: ax.a[0] = 1.0; 和 ay.a[0] = 1.0;。

生成的图表显示一个箭头,它从 P1(1,1) 开始,但没有在 P2(2,2) 结束。

谁能帮我解决这个问题?

问候,

托马斯

4

1 回答 1

0

出于我的目的,我找到了解决方案。我用手画出“矢量”。所以我只使用这个代码来绘制一个矢量:

mglGraph gr;
gr.Line(1,1, 2,2), "BA_"); // a vector from (1,1) to (2,2)

最好的祝愿,

托马斯

于 2016-08-24T20:04:18.690 回答