|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.09.2017, 16:20 | #1 |
Регистрация: 01.09.2017
Сообщений: 6
|
Как построить OpenGL график С++ по моим 3м уравнениям?
dif.jpg
вот готовый код,рассчитывает три матрицы с выводом значения на консоль. Строиться график синуса.А мне нужен график моей матрицы,хоть какой нибуть. #include <iostream> #include <windows.h> #include <GL/glut.h> #include <cmath> using namespace std; // Window size int width = 512; int height = 512; // Points const int nPoinst = 20; const int halfOfNPoints = nPoinst / 2; float points[nPoinst] = { -500, 100, -400, -100, -300, 100, -200, -100, -100, 100, 0, -100, 100, 100, 200, -100, 300, 100, 400, -100 }; void DrawAxis(); void DrawStrip(); void Enable2D(int width, int height); void Init() { Enable2D(width, height); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); } void Draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); DrawAxis(); DrawStrip(); glutSwapBuffers(); } void DrawStrip() { glBegin(GL_LINE_STRIP); glColor3f(0.0f, 0.0f, 0.0f); for (int i = 0, index = 0; i < halfOfNPoints; ++i, index += 2) { glVertex2f(points[index], points[index + 1]); } glEnd(); } void DrawAxis() { // Draw X axis glBegin(GL_LINES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-width / 2.0f, 0.0f); glVertex2f(width / 2.0f, 0.0f); glEnd(); // Draw Y axis glBegin(GL_LINES); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.0f, -height / 2.0f); glVertex2f(0.0f, height / 2.0f); glEnd(); } void Enable2D(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-width / 2.0f, width / 2.0f, -height / 2.0f, height / 2.0f, 0.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } double p(double x){ return exp(x); } double q(double x){ return 2*x; } double f(double x){ return pow(x,3); } void gauss(double** A, double* B, double* X, int n); int main(int argc, char **argv) { double alpha0=2; double alpha1=-2.5; double Ac=0; double beta0=3; double beta1=-3.4; double Bc=5; double a0=0.1; double b0=1.3; int n=4; //matrix A[n+1][n+1] double **A = new double*[n+1]; for(int i=0; i<n+1; i++){ A[i]=new double[n+1]; } //=== double *B = new double[n+1]; //vector B[n+1] double *X = new double[n+1]; //vector X[n+1] //Grid double h=(b0-a0)/n; for(int i=0; i<=n; i++){ X[i]=a0+i*h; //cout << X[i] << endl; } //=== cout << "h=" << h << endl; //calculate matrix A, B for(int i=0; i<=n-2; i++){ A[i][i]=h*h*q(X[i])-h*p(X[i])+1; A[i][i+1]=h*p(X[i])-2; A[i][i+2]=1; B[i]=h*h*f(X[i]); } A[n-1][0]=alpha0*h-alpha1; A[n-1][1]=alpha1; A[n][n-1]=-beta1; A[n][n]=beta0*h+beta1; B[n-1]=h*Ac; B[n]=h*Bc; //=== //print A for(int i=0; i<=n; i++){ for(int j=0; j<=n; j++){ cout << "A["<<i<<"]"<<"["<<j<<"]="<<A[i][j] <<" "; } cout << endl; } //=== cout << endl; //print B for(int i=0; i<=n; i++){ cout << "B["<<i<<"]="<<B[i] <<" "; } cout << endl; cout << endl; //=== //solve A*X1=B double *X1 = new double[n+1]; //vector X1[n+1] gauss(A,B,X1,n+1); //solve //print X1 for(int i=0; i<=n; i++){ cout << "X1[" << i << "]=" << X1[i] << " "; } //=== // Grafik X // Initialize opengl (via glut) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(width, height); glutCreateWindow("A"); glutDisplayFunc(Draw); Init(); glutMainLoop(); system("PAUSE"); return 0; } void gauss(double** A, double* B, double* X, int n){ int m=n+1; //create C[n][n+1] double **C = new double*[n]; for(int i=0; i<n; i++){ C[i]=new double[n+1]; } //=== //split A and B to C for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ C[i][j]=A[i][j]; } C[i][n]=B[i]; } //=== /* //print C for(int i=0;i<n;i++){ for(int j=0;j<n+1;j++){ cout << C[i][j] << " "; } cout << endl; } //=== */ //forward for (int k=0; k<n-1; k++){ for (int i=k+1;i<n;i++){ for (int j=m-1; j>=k; j--){ C[i][j]=C[i][j]-C[i][k]*C[k][j]/C[k][k]; } } } //reverse X[n-1]=A[n-1][m-2]/A[n-1][m-2]; for (int i=n-2; i>=0; i--){ double s=0; for (int j=i+1;j<m-1;j++){ s=s+C[i][j]*X[j]; } X[i]=(C[i][m-1] - s)/C[i][i]; } } Мне бы массив points динамически заполнить своими расчетными значениями Вот мои координаты A[0][0]=0.686449 A[0][1]=1.66845 A[0][2]=1 A[0][3]=0 A[0][4]=0 A[1][0]=4.03597e-308 A[1][1]=0.624453 A[1][2]=1.55245 A[1][3]=1 A[1][4]=0 A[2][0]=4.03597e-308 A[2][1]=0 A[2][2]=0 A[2][3]=1.39587 A[2][4]=1 A[3][0]=3.1 A[3][1]=-2.5 A[3][2]=9.84852e-315 A[3][3]=0 A[3][4]=2.122e-314 A[4][0]=4.08046-308 A[4][1]=0 A[4][2]=0 A[4][3]=3.4 A[4][4]=-2.5 B[0]=9e-005 B[1]=0.00576 B[2]=0.03087 B[3]=0 B[4]=1.5 X[0]=0.805178 X[1]=0.998421 X[2]=1.11319 X[3]=1.11047 X[4]=1 |
01.09.2017, 16:35 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
так заполняйте, кто вас за руки держит?
|
01.09.2017, 16:57 | #3 |
Регистрация: 01.09.2017
Сообщений: 6
|
|
01.09.2017, 16:59 | #4 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
А как же вы тогда свои A,B,X заполняли?
|
01.09.2017, 17:21 | #5 |
Регистрация: 01.09.2017
Сообщений: 6
|
Заполнить одно,а вот вывести на график другое,тем более.что за график с такими малыми значениями
|
01.09.2017, 18:02 | #6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
А что сложного, если вам надо изменить всего два параметра массив точек и их количество? Если значения маленькие, то подкрутите параметры проекции.
|
01.09.2017, 18:35 | #7 |
Форумчанин
Регистрация: 09.05.2017
Сообщений: 751
|
А зачем OpenGL? Просто по точкам на канве нельзя что-ли построить?
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
|
01.09.2017, 21:03 | #8 | |
Регистрация: 01.09.2017
Сообщений: 6
|
Цитата:
const int nPoinst = 35;//количество точек const int halfOfNPoints = nPoinst / 2; double points[nPoinst] = { //A 0.686449, 1.66845, 1, 0, 0, 4.03597e-308, 0.624453, 1.55245, 1, 0, 4.03597e-308, 0, 0, 1.39587, 1, 3.1, -2.5, 9.84852e-315, 0, 2.122e-314, 4.08046-308, 0, 0, 3.4, -2.5, //B 9e-005, 0.00576, 0.03087, 0, 1.5, //X 0.805178, 0.998421, 1.11319, 1.11047, 1 }; поребление в год кг.jpg только график маленький,ничего не видно синим цветом по оси Х.Его бы масштабировать.OpenGL установлен. А другого способа работы с графикой не знаю. |
|
02.09.2017, 07:51 | #9 |
Пользователь
Регистрация: 13.11.2016
Сообщений: 84
|
Причем здесь указанная программа и решение Вашего дифференциального уравнения?
|
02.09.2017, 09:02 | #10 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Вы хоть в структурах данных программы разберитесь. Поинтс содержит точки в формате х1, у1, х2, у2, ... - поэтому никаких 35 там явно не будет. И чего вы хотели добиться выводя на графики линии по числам из всех ваших матриц? Вы не знаете, что является решением диф. урафнения?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как построить график?? | noob noob | C# (си шарп) | 0 | 20.05.2016 18:59 |
График по уравнениям | Revolver | JavaScript, Ajax | 1 | 05.11.2015 09:40 |
как построить график | Nijaz | Общие вопросы Delphi | 5 | 09.06.2014 11:25 |
Как построить график? | Garlen | C++ Builder | 1 | 18.03.2012 16:05 |
как построить график? | tosha_72 | Общие вопросы Delphi | 5 | 05.05.2011 07:01 |