2019-01-04 17:29:55 +08:00
|
|
|
// Teal Dulcet, CS546
|
|
|
|
|
2024-11-14 01:31:42 +08:00
|
|
|
// Compile: g++ -std=gnu++17 -Wall -g -O3 graphs.cpp -o graphs
|
2019-01-04 17:29:55 +08:00
|
|
|
|
|
|
|
// Run: ./graphs
|
|
|
|
|
|
|
|
#include <cctype>
|
2022-07-14 16:33:38 +08:00
|
|
|
#include <array>
|
|
|
|
#include <vector>
|
2023-08-30 20:57:03 +08:00
|
|
|
#include <random>
|
2023-09-01 20:54:13 +08:00
|
|
|
|
2019-01-04 17:29:55 +08:00
|
|
|
#include "graphs.hpp"
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
constexpr long double afunction(long double x)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
|
|
|
return x + 1;
|
|
|
|
}
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
constexpr long double function1(long double x)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
|
|
|
return 2 * x;
|
|
|
|
}
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
constexpr long double function2(long double x)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
|
|
|
return pow(x, 2);
|
|
|
|
}
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
constexpr long double function3(long double x)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
|
|
|
return sin(x);
|
|
|
|
}
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
constexpr long double function4(long double x)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
|
|
|
return cos(x);
|
|
|
|
}
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
constexpr long double function5(long double x)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
|
|
|
return tan(x);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
2024-12-18 00:55:15 +08:00
|
|
|
const size_t height = 40;
|
|
|
|
const size_t width = 80;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
|
|
|
const long double xmin = -20;
|
|
|
|
const long double xmax = 20;
|
|
|
|
const long double ymin = -20;
|
|
|
|
const long double ymax = 20;
|
|
|
|
|
|
|
|
const size_t rows = 10;
|
|
|
|
const size_t columns = 2;
|
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
// Output array as histogram
|
|
|
|
cout << "\nOutput array as histogram\n\n";
|
|
|
|
{
|
|
|
|
const size_t rows = 100;
|
|
|
|
|
|
|
|
default_random_engine generator;
|
|
|
|
normal_distribution<long double> distribution(0, 1);
|
|
|
|
|
|
|
|
{
|
|
|
|
long double *array;
|
|
|
|
array = new long double[rows];
|
|
|
|
|
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
|
|
|
array[i] = distribution(generator);
|
|
|
|
|
|
|
|
graphs::options aoptions;
|
|
|
|
|
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
|
|
|
{
|
|
|
|
aoptions.style = style;
|
|
|
|
|
|
|
|
graphs::histogram(height, width, xmin, xmax, ymin, ymax, rows, array, aoptions);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (array)
|
|
|
|
delete[] array;
|
|
|
|
}
|
|
|
|
{
|
|
|
|
array<long double, rows> aarray;
|
|
|
|
|
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
|
|
|
aarray[i] = distribution(generator);
|
|
|
|
|
|
|
|
graphs::options aoptions;
|
|
|
|
|
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
|
|
|
{
|
|
|
|
aoptions.style = style;
|
|
|
|
|
|
|
|
graphs::histogram(height, width, xmin, xmax, ymin, ymax, aarray, aoptions);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
vector<long double> array(rows);
|
|
|
|
|
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
|
|
|
array[i] = distribution(generator);
|
|
|
|
|
|
|
|
graphs::options aoptions;
|
|
|
|
|
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
|
|
|
{
|
|
|
|
aoptions.style = style;
|
|
|
|
|
|
|
|
graphs::histogram(height, width, xmin, xmax, ymin, ymax, array, aoptions);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
// Output single array as plot
|
2019-01-04 17:29:55 +08:00
|
|
|
cout << "\nOutput array as plot\n\n";
|
|
|
|
{
|
|
|
|
long double **array;
|
|
|
|
array = new long double *[rows];
|
2023-08-30 20:57:03 +08:00
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
2019-01-04 17:29:55 +08:00
|
|
|
array[i] = new long double[columns];
|
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
|
|
|
for (unsigned j = 0; j < columns; ++j)
|
2022-07-14 16:33:38 +08:00
|
|
|
array[i][j] = i + j; // rand();
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (const graphs::type_type type : graphs::type_types)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
2023-08-30 20:57:03 +08:00
|
|
|
aoptions.type = type;
|
|
|
|
|
|
|
|
for (const graphs::mark_type mark : graphs::mark_types)
|
|
|
|
{
|
|
|
|
aoptions.mark = mark;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
|
|
|
{
|
|
|
|
aoptions.style = style;
|
|
|
|
|
|
|
|
graphs::plot(height, width, xmin, xmax, ymin, ymax, rows, array, aoptions);
|
|
|
|
}
|
|
|
|
}
|
2019-01-04 17:29:55 +08:00
|
|
|
}
|
|
|
|
|
2023-03-10 21:15:01 +08:00
|
|
|
if (array)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
2023-08-30 20:57:03 +08:00
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
2019-01-04 17:29:55 +08:00
|
|
|
delete[] array[i];
|
|
|
|
|
|
|
|
delete[] array;
|
|
|
|
}
|
|
|
|
}
|
2022-07-14 16:33:38 +08:00
|
|
|
{
|
|
|
|
array<array<long double, columns>, rows> aarray;
|
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
|
|
|
for (unsigned j = 0; j < columns; ++j)
|
2022-07-14 16:33:38 +08:00
|
|
|
aarray[i][j] = i + j; // rand();
|
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (const graphs::type_type type : graphs::type_types)
|
2022-07-14 16:33:38 +08:00
|
|
|
{
|
2023-08-30 20:57:03 +08:00
|
|
|
aoptions.type = type;
|
|
|
|
|
|
|
|
for (const graphs::mark_type mark : graphs::mark_types)
|
|
|
|
{
|
|
|
|
aoptions.mark = mark;
|
|
|
|
|
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
|
|
|
{
|
|
|
|
aoptions.style = style;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
graphs::plot(height, width, xmin, xmax, ymin, ymax, aarray, aoptions);
|
|
|
|
}
|
|
|
|
}
|
2022-07-14 16:33:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
vector<vector<long double>> array(rows, vector<long double>(columns));
|
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (unsigned i = 0; i < rows; ++i)
|
|
|
|
for (unsigned j = 0; j < columns; ++j)
|
2022-07-14 16:33:38 +08:00
|
|
|
array[i][j] = i + j; // rand();
|
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (const graphs::type_type type : graphs::type_types)
|
2022-07-14 16:33:38 +08:00
|
|
|
{
|
2023-08-30 20:57:03 +08:00
|
|
|
aoptions.type = type;
|
|
|
|
|
|
|
|
for (const graphs::mark_type mark : graphs::mark_types)
|
|
|
|
{
|
|
|
|
aoptions.mark = mark;
|
|
|
|
|
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
|
|
|
{
|
|
|
|
aoptions.style = style;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
graphs::plot(height, width, xmin, xmax, ymin, ymax, array, aoptions);
|
|
|
|
}
|
|
|
|
}
|
2022-07-14 16:33:38 +08:00
|
|
|
}
|
|
|
|
}
|
2019-01-04 17:29:55 +08:00
|
|
|
// Output single function as graph
|
|
|
|
cout << "\nOutput single function as graph\n\n";
|
|
|
|
{
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2023-03-10 21:15:01 +08:00
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
2022-07-14 16:33:38 +08:00
|
|
|
{
|
2023-03-10 21:15:01 +08:00
|
|
|
aoptions.style = style;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::function(height, width, xmin, xmax, ymin, ymax, afunction, aoptions);
|
2022-07-14 16:33:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
2024-06-01 23:59:28 +08:00
|
|
|
const function<long double(long double)> afunction = [](auto x)
|
2022-07-14 16:33:38 +08:00
|
|
|
{ return x + 1; };
|
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2023-03-10 21:15:01 +08:00
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
2023-03-10 21:15:01 +08:00
|
|
|
aoptions.style = style;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::function(height, width, xmin, xmax, ymin, ymax, afunction, aoptions);
|
2019-01-04 17:29:55 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// Output multiple functions as graph
|
|
|
|
cout << "\nOutput multiple functions as graph\n\n";
|
|
|
|
{
|
2022-07-14 16:33:38 +08:00
|
|
|
function<long double(long double)> functions[] = {function1, function2};
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2023-03-10 21:15:01 +08:00
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
2022-07-14 16:33:38 +08:00
|
|
|
{
|
2023-03-10 21:15:01 +08:00
|
|
|
aoptions.style = style;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2024-11-14 01:31:42 +08:00
|
|
|
graphs::functions(height, width, xmin, xmax, ymin, ymax, size(functions), functions, aoptions);
|
2022-07-14 16:33:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
function<long double(long double)> functions[] = {[](auto x)
|
|
|
|
{ return 2 * x; },
|
|
|
|
[](auto x)
|
|
|
|
{ return pow(x, 2); }};
|
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2023-03-10 21:15:01 +08:00
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
2023-03-10 21:15:01 +08:00
|
|
|
aoptions.style = style;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2024-11-14 01:31:42 +08:00
|
|
|
graphs::functions(height, width, xmin, xmax, ymin, ymax, size(functions), functions, aoptions);
|
2019-01-04 17:29:55 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
const long double xmin = -(2 * M_PI);
|
|
|
|
const long double xmax = 2 * M_PI;
|
|
|
|
const long double ymin = -4;
|
|
|
|
const long double ymax = 4;
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
function<long double(long double)> functions[] = {function3, function4, function5};
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2022-07-14 16:44:17 +08:00
|
|
|
graphs::options aoptions;
|
2019-01-04 17:29:55 +08:00
|
|
|
aoptions.axisunitslabel = false;
|
2024-11-14 01:31:42 +08:00
|
|
|
// graphs::options aoptions = {.axisunitslabel = false};
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2023-03-10 21:15:01 +08:00
|
|
|
for (const graphs::style_type style : graphs::style_types)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
2023-03-10 21:15:01 +08:00
|
|
|
aoptions.style = style;
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2024-11-14 01:31:42 +08:00
|
|
|
graphs::functions(height, width, xmin, xmax, ymin, ymax, size(functions), functions, aoptions);
|
2019-01-04 17:29:55 +08:00
|
|
|
}
|
|
|
|
|
2022-07-14 16:33:38 +08:00
|
|
|
/* aoptions.style = 2;
|
|
|
|
|
2023-08-30 20:57:03 +08:00
|
|
|
for (unsigned k = 10; k < 300; ++k)
|
2019-01-04 17:29:55 +08:00
|
|
|
{
|
2022-07-14 16:33:38 +08:00
|
|
|
cout << "\e[1;1H"
|
|
|
|
<< "\e[2J";
|
2019-01-04 17:29:55 +08:00
|
|
|
|
2024-11-14 01:31:42 +08:00
|
|
|
graphs::functions(k, k, xmin, xmax, ymin, ymax, size(functions), functions, aoptions);
|
2022-07-14 16:33:38 +08:00
|
|
|
|
2019-01-04 17:29:55 +08:00
|
|
|
usleep(200000);
|
2022-07-14 16:33:38 +08:00
|
|
|
} */
|
2019-01-04 17:29:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|