Как организовать результат координат X и Y в виде графика A-XII?

Я делаю прежнее задание в C ++ и пытаюсь выяснить, как получить правильный ASCII X-Y сюжет.

Так что на самом деле происходит то, что пользователю предоставляется меню, которое позволяет ему выбрать конкретную функцию триггера. Все функции имеют диапазон между [-4..6] для X и [-12 … 5] для Y.Next пользователю будет разрешено выбрать количество градуировок (или значений между ограниченным диапазоном x и y), и если они захотят увидеть результирующие значения или растровое изображение. Окончательный результат будет в значениях / растровом изображении. Я вставил альфа-ссылку на wolfram для функций в комментариях.

Что я сделал, так это увеличил каждый столбец в двумерном выводе на произведение 1 / (градация-1) (т. Е. 1/3, если градуированное значение равно 4) и колонке №. Как только продукт достигнет 1, я не получаю правильное значение выход для значений.

#include <iostream>
#include <cmath>using namespace std;double minX=-4;
double maxX=6;
double minY=-12;
double maxY=5;void displayValues(double result[],int result_size,int graduationVal,double percentIncrease,int menuSelection){

int displaySelection=0;
cerr<<"(0) Bitmap or (1) Values?";
cin>>displaySelection;
int k=0;
int i=0;
int division=0;

//Add Values into array until result-1 values
while(i < result_size){
//cout<<"Before j";
//Calculate all the horizontal axis values
for(int j=0; j< graduationVal;j++){

if(displaySelection==1){

//cout<<"In if";
if(menuSelection==1){
result[i]=sin(minX+(percentIncrease*j))*cos(minY+(percentIncrease*k));
cout<<"\n Increase in value of x by "<<percentIncrease*j<<" ";
cout<<"Increase in value of y by "<<percentIncrease*k<<"\n";
//cout<<sin(minX+(percentIncrease*j))<<"\n";
//cout<<cos(minY+(percentIncrease*k))<<"\n";
cout<<result[i]<<" ";
}else if(menuSelection==2){
result[i]=sin(minX+(percentIncrease*j))+pow(cos(minY+(percentIncrease*j)),2)-(minX+(percentIncrease*j))/(minY+(percentIncrease*k));
cout<<"\n Increase in value of x by "<<percentIncrease*j<<" ";
cout<<"Increase in value of y by "<<percentIncrease*k<<"\n";

cout<<result[i]<<" ";

}else if(menuSelection==3){

result[i]=(0.5 * sin(minX+(percentIncrease*j)))+(0.5 *cos(minY+(percentIncrease*k)));
cout<<"\n Increase in value of x by "<<percentIncrease*j<<" ";
cout<<"Increase in value of y by "<<percentIncrease*k<<"\n";

cout<<result[i]<<" ";}else if(menuSelection==4){

result[i]=(0.5 * sin(minX+(percentIncrease*j)))+(minX+(percentIncrease*j)) * cos(3 * (minY+(percentIncrease*k)));
cout<<result[i]<<" ";

}

//cout<<"J is"<<j<<"\n";
//cout<<"K is"<<k<<"\n";
//cout<<"I is"<<i<<"\n";
}else{

if(menuSelection==1){
result[i]=sin(minX+(percentIncrease*j))*cos(minY+(percentIncrease*k));
cout<<((result[i] > 0 )?"O":"X");

}else if(menuSelection==2){

result[i]=sin(minX+(percentIncrease*j))+pow(cos(minY+(percentIncrease*j)),2)-(minX+(percentIncrease*j))/(minY+(percentIncrease*k));
cout<<((result[i] > 0 )?"O":"X");

}else if(menuSelection==3){

result[i]=(0.5 * sin(minX+(percentIncrease*j)))+(0.5 *cos(minY+(percentIncrease*k)));
cout<<((result[i] > 0 )?"O":"X");}else if(menuSelection==4){

result[i]=(0.5 * sin(minX+(percentIncrease*j)))+(minX+(percentIncrease*j)) * cos(3 * (minY+(percentIncrease*k)));
cout<<((result[i] > 0 )?"O":"X");

}}//End display choice if//Increment Array Index
i++;
//cout<<"Bottom of j";
}//End of j loop

cout<<"\n";

//Increment y-values
if(k<graduationVal){

k++;
}

}//End of While

}int main(){

int menuChoice=-1;
int displaychoice=0;

double distanceFromMinMaxX=4+6;
double distanceFromMinMaxY=12+5;

int graduations=0;

// double precisionX;
// double precisionY;

double pctIncrease;

while(menuChoice!=0){

cerr<<"Select your function\n";
cerr<<"1. sin(x)cos(y)\n";
cerr<<"2. sin(x)+cos^2(x)-x/y\n";
cerr<<"3. 1/2 sin(x) + 1/2 cos(y)\n";
cerr<<"4. 1/2 sin(x) + xcos(3y)\n";
cerr<<"0. Quit\n";
cin>>menuChoice;

if(menuChoice == 0){

return 0;
}

cerr<<"Number of graduations per axis: ";
cin>>graduations;

pctIncrease=1/(double)(graduations - 1);
int values_size=graduations * graduations;

double values[values_size];/*int yValues[graduationVal];*/

// precisionX=distanceFromMinMaxX/graduations;
// precisionY=distanceFromMinMaxY/graduations;displayValues(values,values_size,graduations,pctIncrease,menuChoice);}

}

Редактировать:

    #include <iostream>
#include <cmath>
using namespace std;
double minX=-4;
double maxX=6;
double minY=-12;
double maxY=5;double* calculateValues(double val[],int val_size,int graduationVal,double xPrecision,double yPrecision,int menuSelection){

/*int displaySelection=0;
cerr<<"(0) Bitmap or (1) Values?";
cin>>displaySelection;*/

int k=0;
int i=0;

//Add Values into array until result-1 values
while(i < val_size){
for(int j=0; j<graduationVal;j++){
if(menuSelection==1){
val[i]=sin(minX+(xPrecision*j))*cos(minY+(yPrecision*k));

}else if(menuSelection==2){
val[i]=sin(minX+(xPrecision*j))+pow(cos(minY+(xPrecision*j)),2)-(minX+(xPrecision*j))/(minY+(yPrecision*k));

}else if(menuSelection==3){

val[i]=(0.5 * sin(minX+(xPrecision*j)))+(0.5 *cos(minY+(yPrecision*k)));

}else if(menuSelection==4){

val[i]=(0.5 * sin(minX+(xPrecision*j)))+(minX+(xPrecision*j)) * cos(3 * (minY+(yPrecision*k)));

}

//Increment Array Index
i++;
}//End of j loop//Increment y-values
if(k<graduationVal){

k++;
}

}//End of While
return val;
}

void displayValues(double result[],int result_size,int numOfGraduations){

int displaySelection=0;
cerr<<"(0) Bitmap or (1) Values?";
cin>>displaySelection;

int k=0;
int i=0;while(i< result_size){for(int j=0;j<numOfGraduations;j++){

if(displaySelection==1){
cout<<result[i]<<" ";
}else{

cout<<((result[i] > 0 )?"O":"X");

}

i++;
}

cout<<"\n";

}

}int main(){

int menuChoice=-1;
int displaychoice=0;

double distanceFromMinMaxX=4+6;
double distanceFromMinMaxY=12+5;

int graduations=0;

double precisionX;
double precisionY;

double pctIncrease;

while(menuChoice!=0){

cerr<<"Select your function\n";
cerr<<"1. sin(x)cos(y)\n";
cerr<<"2. sin(x)+cos^2(x)-x/y\n";
cerr<<"3. 1/2 sin(x) + 1/2 cos(y)\n";
cerr<<"4. 1/2 sin(x) + xcos(3y)\n";
cerr<<"0. Quit\n";
cin>>menuChoice;

if(menuChoice == 0){

return 0;
}

cerr<<"Number of graduations per axis: ";
cin>>graduations;

pctIncrease=1/(double)(graduations - 1);
int values_size=graduations * graduations;

double values[values_size];/*int yValues[graduationVal];*/

precisionX=distanceFromMinMaxX/graduations;
precisionY=distanceFromMinMaxY/graduations;

/*cout << "# of graduations: " << graduations << endl;
cout << "Precision: "<< endl;
cout << "x: " << precisionX << endl;
cout << "y: " << precisionY << endl;*/

calculateValues(values,values_size,graduations,precisionX,precisionY,menuChoice);
displayValues(values,values_size,graduations);}

}

Изменить: я использую GCC

-2

Решение

Это производит вывод, похожий на скриншот, который вы связали (где пользователь выбрал вариант 2). TextPlot2d Функция принимает лямбда или функтор, который вычисляет желаемую функцию, а также два PlotRange структура для определения того, как оси x и y должны масштабироваться. Я также использовал разные выходные символы, потому что мне было трудно отличить «Х» от «О».

#include <iostream>
#include <cmath>

struct PlotRange {
double begin, end, count;
double get_step() const { return (end - begin) / count; }
};

template <typename F>
void TextPlot2d(F func, PlotRange range_x, PlotRange range_y) {
const auto step_x = range_x.get_step();
const auto step_y = range_y.get_step();
// multiply steps by iterated integer
// to avoid accumulation of error in x and y
for(int j = 0;; ++j) {
auto y = range_y.begin + step_y * j;
if(y >= range_y.end) break;
for(int i = 0;; ++i) {
auto x = range_x.begin + step_x * i;
if(x >= range_x.end) break;
auto z = func(x, y);
if(z != z) { std::cout << '?'; } // NaN outputs a '?'
else       { std::cout << (z < 0 ? '#':'o'); }
}
std::cout << '\n';
}
}

int main() {
TextPlot2d(
[](double x, double y){ return std::sin(x) + std::cos(y/2)*std::cos(y/2) - x/y; },
{-4.0, 6.0, 40.0},
{-12.0, 5.0, 40.0}
);
}

Тада!

ooooooo######ooooooooooooooooooooooooooo
oooooo#######ooooooooooooooooooooooooooo
ooooo#########oooooooooooooooooooooooooo
oooo###########ooooooooooooooooo######oo
ooo#############ooooooooooooooo#######oo
ooo#############ooooooooooooooo########o
oo##############ooooooooooooooo########o
ooo#############ooooooooooooooo########o
ooo#############oooooooooooooooo######oo
oooo###########oooooooooooooooooo####ooo
ooooo#########oooooooooooooooooooooooooo
ooooo#########oooooooooooooooooooooooooo
oooooo#######ooooooooooooooooooooooooooo
ooooooo######ooooooooooooooooooooooooooo
oooooo#######ooooooooooooooooooooooooooo
oooooo#######ooooooooooooooooooooooooooo
ooooo#########oooooooooooooooooooooooooo
ooo############ooooooooooooooooooooooooo
oo#############ooooooooooooooooooooooooo
################oooooooooooooooooooooooo
################oooooooooooooooooooooooo
################oooooooooooooooooooooooo
################oooooooooooooooooooooooo
################oooooooooooooooooooooooo
###############ooooooooooooooooooooooooo
###############ooooooooooooooooooooooooo
###############ooooooooooooooooooooooooo
###############ooooooooooooooooooooooooo
################oooooooooooooooooooooooo
oooooooooooooooooo######################
oooooooooooooooooooooo##################
oooooooooooooooooooooooo################
ooooooooooooooooooooooooo###############
ooooooooooo###ooooooooooo###############
ooooooooo#######ooooooooo###############
oooooooo########oooooooooo##############
ooooooo#########oooooooooo##############
ooooooo#########ooooooooooo#############
ooooooo########oooooooooooo#############
oooooooo######oooooooooooooo############
0

Другие решения

Я наконец получил вывод !! Кажется, что функция № 2 была неправильной, и именно поэтому я не получил правильный ответ.

    #include <iostream>
#include <cmath>
using namespace std;
double minX=-4;
double maxX=6;
double minY=-12;
double maxY=5;void calculateValues(double val[],int val_size,int graduationVal,double xPrecision,double yPrecision,int menuSelection){

/*int displaySelection=0;
cerr<<"(0) Bitmap or (1) Values?";
cin>>displaySelection;*/

//double val[];
int k=0;
int i=0;

//Add Values into array until result-1 values
while(i < val_size){for(int j=0; j<graduationVal;j++){
if(menuSelection==1){
val[i]=sin(minX+(xPrecision*j))*cos(minY+(yPrecision*k));

}else if(menuSelection==2){
val[i]=sin(minX+(xPrecision*j))+pow(cos((minY+(yPrecision*k))/2),2)-(minX+(xPrecision*j))/(minY+(yPrecision*k));

}else if(menuSelection==3){

val[i]=(0.5 * sin(minX+(xPrecision*j)))+(0.5 *cos(minY+(yPrecision*k)));

}else if(menuSelection==4){

val[i]=(0.5 * sin(minX+(xPrecision*j)))+(minX+(xPrecision*j)) * cos(3 * (minY+(yPrecision*k)));

}

//Go to next value in array
i++;
}//End of j loop//Increment y-values
if(k<graduationVal){

k++;
}

}//End of While
}

void displayValues(double result[],int result_size,int numOfGraduations){

int displaySelection=0;
cerr<<"(0) Bitmap or (1) Values?";
cin>>displaySelection;

int k=0;
int i=0;while(i< result_size){for(int j=0;j<numOfGraduations;j++){

if(displaySelection==1){
cout<<result[i]<<" ";
}else{

cout<<((result[i] > 0 )?"O":"#");

}

i++;
}

cout<<"\n";

}

}int main(){

int menuChoice=-1;
int displaychoice=0;

double distanceFromMinMaxX=maxX-minX;
double distanceFromMinMaxY=maxY-minY;

int graduations=0;

double precisionX;
double precisionY;

double pctIncrease;

while(menuChoice!=0){

cerr<<"Select your function\n";
cerr<<"1. sin(x)cos(y)\n";
cerr<<"2. sin(x)+cos^2(y/2)-x/y\n";
cerr<<"3. 1/2 sin(x) + 1/2 cos(y)\n";
cerr<<"4. 1/2 sin(x) + xcos(3y)\n";
cerr<<"0. Quit\n";
cin>>menuChoice;

if(menuChoice == 0){

return 0;
}

cerr<<"Number of graduations per axis: ";
cin>>graduations;

//pctIncrease=1/(double)(graduations - 1);
int values_size=graduations * graduations;

double values[values_size];/*int yValues[graduationVal];*/

precisionX=(distanceFromMinMaxX)/graduations;
precisionY=(distanceFromMinMaxY)/graduations;

/*cout << "# of graduations: " << graduations << endl;
cout << "Precision: "<< endl;
cout << "x: " << precisionX << endl;
cout << "y: " << precisionY << endl;*/

calculateValues(values,values_size,graduations,precisionX,precisionY,menuChoice);
displayValues(values,values_size,graduations);}

}
0

По вопросам рекламы [email protected]