Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 01.09.2017, 17:20   #1
scherbakovss2012
Новичок
 
Регистрация: 01.09.2017
Сообщений: 6
Репутация: 10
По умолчанию Как построить 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
scherbakovss2012 вне форума   Ответить с цитированием
Старый 01.09.2017, 17:35   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,521
Репутация: 2099
По умолчанию

так заполняйте, кто вас за руки держит?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 01.09.2017, 17:57   #3
scherbakovss2012
Новичок
 
Регистрация: 01.09.2017
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
так заполняйте, кто вас за руки держит?
Я не знаю как.Потому и задаю вопрос.
scherbakovss2012 вне форума   Ответить с цитированием
Старый 01.09.2017, 17:59   #4
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,521
Репутация: 2099
По умолчанию

А как же вы тогда свои A,B,X заполняли?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 01.09.2017, 18:21   #5
scherbakovss2012
Новичок
 
Регистрация: 01.09.2017
Сообщений: 6
Репутация: 10
По умолчанию

Заполнить одно,а вот вывести на график другое,тем более.что за график с такими малыми значениями
scherbakovss2012 вне форума   Ответить с цитированием
Старый 01.09.2017, 19:02   #6
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,521
Репутация: 2099
По умолчанию

А что сложного, если вам надо изменить всего два параметра массив точек и их количество? Если значения маленькие, то подкрутите параметры проекции.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 01.09.2017, 19:35   #7
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 391
Репутация: 85
По умолчанию

А зачем OpenGL? Просто по точкам на канве нельзя что-ли построить?
Cuprum5 вне форума   Ответить с цитированием
Старый 01.09.2017, 22:03   #8
scherbakovss2012
Новичок
 
Регистрация: 01.09.2017
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А что сложного, если вам надо изменить всего два параметра массив точек и их количество? Если значения маленькие, то подкрутите параметры проекции.
// Points
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 установлен. А другого способа работы с графикой не знаю.
scherbakovss2012 вне форума   Ответить с цитированием
Старый 02.09.2017, 08:51   #9
Мановар
Форумчанин
 
Регистрация: 13.11.2016
Сообщений: 81
Репутация: 58
По умолчанию

Причем здесь указанная программа и решение Вашего дифференциального уравнения?
Мановар вне форума   Ответить с цитированием
Старый 02.09.2017, 10:02   #10
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,521
Репутация: 2099
По умолчанию

Вы хоть в структурах данных программы разберитесь. Поинтс содержит точки в формате х1, у1, х2, у2, ... - поэтому никаких 35 там явно не будет. И чего вы хотели добиться выводя на графики линии по числам из всех ваших матриц? Вы не знаете, что является решением диф. урафнения?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как построить график?? noob noob C# (си шарп) 0 20.05.2016 19:59
График по уравнениям Revolver JavaScript, Ajax 1 05.11.2015 10: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


00:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru