C++/MathGL: неправильное понимание векторных полей
Я использую MathGL 2.3.5.1 ( http://mathgl.sourceforge.net/doc_en/Main.html) под Windows 10 с Qt 4.8.7.
У меня проблемы с использованием векторного поля MathGL. Существует документация по MathGL с именем файла mathgl-2.3.5.eng.pdf по https://sourceforge.net/projects/mathgl/files/mathgl/mathgl%202.3.5/ разделе "4.15 Векторные поля" описывается Использование метода "Vect". И, конечно, в разделе "2.8 Образцы векторных полей" приведен пример векторного поля.
Прежде всего, мое понимание векторного поля состоит в том, что есть точки (в моем случае это всегда в 2D) и (математически) векторы. Таким образом, сочетание точки 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="");
Если я правильно понимаю параметры, то
- х обозначает начало стрелки в единицах х
- у представляет начало стрелки в у единицах
- 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: xa[0] = 1.0; и уа [0] = 1,0; Вектор V1 должен быть представлен как: ax.a[0] = 1.0; и ay.a[0] = 1,0;
Результирующий график показывает стрелку, начинающуюся с P1(1,1), но не заканчивающуюся с P2(2,2).
Кто может помочь мне с этой проблемой?
Привет,
Томас
1 ответ
Для моей цели я нашел решение. Я рисую "векторы" вручную. Поэтому я использую только этот код для рисования вектора:
mglGraph gr;
gr.Line(1,1, 2,2), "BA_"); // a vector from (1,1) to (2,2)
С наилучшими пожеланиями,
Томас