C++/MathGL:对向量场的误解
C++/MathGL: Missunderstanding of vector fields
我在 Windows 10 和 Qt 4.8.7 下使用 MathGL 2.3.5.1 (http://mathgl.sourceforge.net/doc_en/Main.html)。
我在使用 MathGL 的矢量场时遇到问题。有一个 MathGL 文档,文件名为 mathgl-2.3.5.eng.pdf 下
https://sourceforge.net/projects/mathgl/files/mathgl/mathgl%202.3.5/
„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
在这段代码中我们设置了P1点:x.a[0] = 1.0; y.a[0] = 1.0;.
向量 V1 应表示为:ax.a[0] = 1.0;和 ay.a[0] = 1.0;.
生成的图形显示箭头 从 P1(1,1) 开始但不在 P2(2,2) 结束。
谁能帮我解决这个问题?
你好,
托马斯
出于我的目的,我找到了解决方案。我手工绘制“矢量”。
所以我只使用这段代码来绘制矢量:
mglGraph gr;
gr.Line(1,1, 2,2), "BA_"); // a vector from (1,1) to (2,2)
祝福,
托马斯
我在 Windows 10 和 Qt 4.8.7 下使用 MathGL 2.3.5.1 (http://mathgl.sourceforge.net/doc_en/Main.html)。
我在使用 MathGL 的矢量场时遇到问题。有一个 MathGL 文档,文件名为 mathgl-2.3.5.eng.pdf 下 https://sourceforge.net/projects/mathgl/files/mathgl/mathgl%202.3.5/ „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
在这段代码中我们设置了P1点:x.a[0] = 1.0; y.a[0] = 1.0;. 向量 V1 应表示为:ax.a[0] = 1.0;和 ay.a[0] = 1.0;.
生成的图形显示箭头 从 P1(1,1) 开始但不在 P2(2,2) 结束。
谁能帮我解决这个问题?
你好,
托马斯
出于我的目的,我找到了解决方案。我手工绘制“矢量”。 所以我只使用这段代码来绘制矢量:
mglGraph gr;
gr.Line(1,1, 2,2), "BA_"); // a vector from (1,1) to (2,2)
祝福,
托马斯