Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

Как построить OpenGL график С++ по моим 3м уравнениям? - C++
(1 чел.) (1) гость
  • Страница:
  • 1

Как построить OpenGL график С++ по моим 3м уравнениям? - C++

Как построить OpenGL график С++ по моим 3м уравнениям? - C++ 01/09/2017 16:38 #1

  • icvisitor2012
  • ( Пользователь )
  • Вне сайта
  • Новый участник
  • Постов: 2
  • Баллов: 4
  • Репутация: 0
вот готовый код,рассчитывает три матрицы с выводом значения на консоль. Строиться график синуса.А мне нужен график моей матрицы,хоть какой нибуть.
#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

Как построить OpenGL график С++ по моим 3м уравнениям? - C++ 10/03/2018 08:58 #2

  • Сионист
  • ( Пользователь )
  • Вне сайта
  • Осваиваюсь на форуме
  • Постов: 22
  • Баллов: 78
  • Репутация: 0
Сначала научитесь не глотать слова. Может тогда и тема решится.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си!
  • Страница:
  • 1
Время создания страницы: 0.23 секунд

Разделы сайта