При запуске gnuplot из командной строки можно получить одинаковые оси (так, чтобы между 0 и 1 по оси x было столько пикселей, сколько между 0 и 1 по оси y; не путать с соотношением сторон 1) через
gnuplot> set view equal xy
( трехмерные графики splot с одинаковым масштабом по x, y, z ). Однако я вызываю gnuplot из c ++ скрипта и сохраняю график как файл postscript. Приведенная выше команда не работает в моем сценарии, но я полагаю, что существует соответствующая команда для точечного синтаксиса . Мой сценарий c ++ показан ниже. Как получить одинаковые оси?
#include <cmath>
#include "gnuplot_i.hpp"
int main() {
Gnuplot plt("ellipse");
plt.savetops("ellipse");
//plt.set_view_equal_xy; // <- This does not work. What does work?
double ax = -10.1;
double ay = 17.4;
double bx = 8.8;
double by = 5.1;
double a = sqrt(pow(ax, 2) + pow(ay, 2));
double b = sqrt(pow(bx, 2) + pow(by, 2));
double angle = atan2(ay, ax);
double pi = 3.1415926536;
double N = 100;
double phi;
// ellipse
std::vector<double> x1, y1;
for (int i = 0; i <= N; i++) {
phi = 2*pi * (i/N);
x1.push_back(cos(angle)*a*cos(phi)-sin(angle)*b*sin(phi));
y1.push_back(sin(angle)*a*cos(phi)+cos(angle)*b*sin(phi));
}
plt.set_style("lines").plot_xy(x1, y1);
// half axis a
std::vector<double> x2, y2;
x2.push_back(0);
x2.push_back(ax);
y2.push_back(0);
y2.push_back(ay);
plt.set_style("lines").plot_xy(x2, y2);
// half axis b
std::vector<double> x3, y3;
x3.push_back(0);
x3.push_back(bx);
y3.push_back(0);
y3.push_back(by);
plt.set_style("lines").plot_xy(x3, y3);
return 0;
}