Добавлен: 03.12.2023
Просмотров: 63
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
от нуля, тем колебания осциллятора менее похожи на гармонические.
Вынужденные колебания
Вынужденные колебания осциллятора Ван дер Поля как с потерями энергии, так и без оных рассчитываются по формуле
t), где
А — амплитуда внешнего гармонического сигнала,
— его угловая частота.
Один из первых примеров хаоса в электрических цепях был открыт Уэдой в цепи с нелинейным индуктивным элементом. Цепь с нелинейной индуктивностью и линейным сопротивлением, возбуждаемая гармонической электродвижущей силой, описывается уравнением
)
которое является частным случаем уравнения Дуффинга. С помощью аналогового и численного моделирования Уэда, сотрудник университета Киото в Японии, получил интересную визуализацию отображений Пуанкаре, описывающую хаотическую динамику этого уравнения. Уравнения этой модели, записанные в виде системы уравнений первого порядка, имеют вид
Для разработки программы был выбран язык программирования C++ и среда программирования Microsoft Visual Studio 2017.
Код программы:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
using namespace std;
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//otrisovka-------------------------------------------------------------------------------------------------
static float angle = 0; // кут повороту фігур
int width = 1, height = 1;
int button = -1; // кнопка миші (-1 - не натиснутa, 0 - ліва, 2 - права)
float angleX, angleY; // поточний кут повороту сцени
float zm;
float mouseX, mouseY; // поточні координати
float distZ = 0; // відстань по осі Z до сцени
//otrisovka---------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//kkk------------------------------------------------------------------------------------------------------------------
float hk = 0.05, xnk, ynk, znk, qk = 10, rk = 28, xk, yk, zk, tk, bk = 8 / 3;
int nk = 10000;
//kkk-----------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a formulx----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
struct diya {
float * q;
float * w;
float * r;
float(*f)(float q, float w);
};
diya sdiy[50], sdix[50], sdiz[50]; //struktura funkcxy
int tfx = 0, tfy = 0, tfz = 0; //koliqestvo funkcxy
float bqisel[20]; //bufer qisel
//dl'a formulx-----------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a vvoda--------------------------------------------------------------------------------------------------------------------------------
float* uvum; //kkk bufer dl'a constant
int vvod = 0; //status vvoda
float bust = 0; //kkk bust uveliq'eniya constant
char *a = new char[200]; //bufer dl'a vvoda
char *ba = new char[10];
int teka = 0; //polojeniye karetki a
//dl'a vvoda----------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a obratnogo vvoda--------------------------------------------------
char *itog = new char[200]; //dl'a oratnoy formulx
char *stek = new char[50]; //stek funkcxy
int pstek[50]; //prioritet funkcxy steka
int flag; //0-cifra 1-toqka 2-x 3-operator i ( 4-)
int skobki, toqki; //kolvo skobok i tiqek
int j, k; //j t'ekuw'iy el'em'ent itog;stek
//dl'a obratnogo vvoda--------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a ploskosti--------------------------------------------------
void(*tekpaint)();
int flagploskosti = 0;// 1 - risuet; 0 - net ; 2 - proekcxxya x ; 3 - y ; 4 - z
int rejxmploskosti = 1;// 1 - norma; 2 - proekcxxya x ; 3 - y ; 4 - z
int flagproekcxi[4] = { 1,1,1,1 };
struct Vctr3
{
float x; float y; float z;
};
float skalarnoye(Vctr3 a, Vctr3 b) { return (a.x*b.x + a.y*b.y + a.z*b.z); }
Vctr3 raznicaVctr3(Vctr3 a, Vctr3 b) { a.x -= b.x; a.y -= b.y; a.z -= b.z; return (a); }
Vctr3 sumaVctr3(Vctr3 a, Vctr3 b) { a.x += b.x; a.y += b.y; a.z += b.z; return (a); }
Vctr3 proizvVctr3(Vctr3 a, float b) { a.x *= b; a.y *= b; a.z *= b; return (a); }
Vctr3 normal, point, nmp,start;
Vctr3 uglx[4];
int znakploskosti = 1;
//dl'a ploskosti--------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
float Plus(float q, float w) { return q + w; }
float Minus(float q, float w) { return q - w; }
float Umnojxt(float q, float w) { return q * w; }
float Delit(float q, float w) { return q / w; }
float Stepen(float q, float w) { return powf(q, w); }
float COS(float q, float w) { return cos(q); }
float SIN(float q, float w) { return sin(q); }
float TAN(float q, float w) { return tan(q); }
float EXP(float q, float w) { return exp(q); }
float LOG(float q, float w) { return log(q); }
float OTR(float q, float w) { return -q; }
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//vxvod r'eweniya formulx--------------------------------------------------------------------------------------------------------
//eylera----------------------------------------------------------------------
float vdiy(diya *sdiy, int &toqki)
{
for (int i = 0; i < toqki; i++)
*sdiy[i].r = sdiy[i].f(*sdiy[i].q, *sdiy[i].w);
if (toqki) {
// cout << endl << "!!!!! =" << *sdiy[toqki - 1].r;
return *sdiy[toqki - 1].r;
}
else {
// cout << endl << "!!!!! =" << 1;
return 0;
}
}
//rungekuta------------------------------------------------------------------------
int meta = 0;
float rkdiy(diya *sdiy, int &toqki)
{
float k1, k2, k3, k4;
k1 = hk * vdiy(sdiy, toqki); xk += k1 / 2; yk += k1 / 2; zk += k1 / 2;
k2 = hk * vdiy(sdiy, toqki); xk -= k1 / 2 - k2 / 2; yk -= k1 / 2 - k2 / 2; zk -= k1 / 2 - k2 / 2;
k3 = hk * vdiy(sdiy, toqki); xk -= k2 / 2 - k3; yk -= k2 / 2 - k3; zk -= k2 / 2 - k3;
k4 = hk * vdiy(sdiy, toqki); xk -= k3; yk -= k3; zk -= k3;
return hk * (k1 + 2 * k2 + 2 * k3 + k4) / 6;
}
float(*metod)(diya *sdiy, int &toqki) = vdiy;
//vxvod r'eweniya formulx--------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//otrisovka po t---------------------------------------------------------------------------------------------------------------------
void Tpaint() {
glClearColor(1, 1, 1, 0);
glViewport(0, 0, width, height); // Установити область перегляду таку, щоб вона вміщувала все вікно
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);// включаємо режим роботи з видовою матрицею
glLoadIdentity();
glTranslatef(0, 0, distZ);
glRotatef(0, 0, 0, 1);
glLineWidth(2);
glBegin(GL_LINES);
glColor3f(0, 0, 1);
glVertex2f(-distZ, 2.0 / 6 * distZ);
glVertex2f(distZ, 2.0 / 6 * distZ);
glColor3f(1, 0, 0);
glVertex2f(-distZ, -2.0 / 6 * distZ);
glVertex2f(distZ, -2.0 / 6 * distZ);
glColor3f(0, 1, 0);
glVertex2f(-distZ, 0);
glVertex2f(distZ, 0);
glColor3f(0, 0, 0);
glVertex2f(0, -distZ);
glVertex2f(0, distZ);
glEnd();
float *masx = new float[nk];
float *masy = new float[nk];
float *masz = new float[nk];
xk = start.x;// n
yk = start.y;// e
zk = start.z;// m
tk = 0.1;
for (int i = 0; i < nk; i++)
{
tk += 0.1;
//xnk = vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));
//ynk = vdiy(sdiy, tfy);//yk + hk*(rk*xk - yk - zk*xk);
//znk = vdiy(sdiz, tfz);//zk + hk*(-bk*zk + xk*yk);
xnk = metod(sdix, tfx) + xk * meta;
ynk = metod(sdiy, tfy) + yk * meta;
znk = metod(sdiz, tfz) + zk * meta;
xk = xnk;
yk = ynk;
zk = znk;
masx[i] = xnk;
masy[i] = ynk;
masz[i] = znk;
}
glBegin(GL_LINE_STRIP);
tk = 0;
for (int i = 0; i < nk; i++)
{
tk += 0.01;
if (masx[i] - 2.0 / 6 * distZ < -1.0 / 6 * distZ)masx[i] = 1.0 / 6 * distZ;
glVertex2f(tk, masx[i] - 2.0 / 6 * distZ);
}
glEnd();
glBegin(GL_LINE_STRIP);
tk = 0;
for (int i = 0; i < nk; i++)
{
tk += 0.01;
if (masy[i] > -1.0 / 6 * distZ)masy[i] = -1.0 / 6 * distZ;
if (masy[i] < 1.0 / 6 * distZ)masy[i] = 1.0 / 6 * distZ;
glVertex2f(tk, masy[i]);
}
glEnd();
glBegin(GL_LINE_STRIP);
tk = 0;
for (int i = 0; i < nk; i++)
{
tk += 0.01;
if (masz[i] + 2.0 / 6 * distZ > 1.0 / 6 * distZ)masz[i] = -1.0 / 6 * distZ;
glVertex2f(tk, masz[i] + 2.0 / 6 * distZ);
}
glEnd();
glFlush();
glutSwapBuffers();
delete[nk] masx;
delete[nk] masy;
delete[nk] masz;
}
//otrisovka po t---------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//otrisovka---------------------------------------------------------------------------------------------------------------------
void on_paint()
{
// 1 ustanovka naqal'nxh param'etrov-----------------------------------------------------------------------------------------------------------------------------------
angle = 0.0f; // збільшення кута повороту
glViewport(0, 0, width, height); // Установити область перегляду таку, щоб вона вміщувала все вікно
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очистка буферів OpenGL// задано функцией f(d) = 1.0 / (0.4 * d * d + 0.2 * d)
glMatrixMode(GL_PROJECTION);// включаємо режим роботи з матрицею проекцій
glLoadIdentity();
gluPerspective(60, (GLfloat)width / height, 1, 1000);
glMatrixMode(GL_MODELVIEW);// включаємо режим роботи з видовою матрицею
glLoadIdentity();
glTranslatef(0, 0, distZ); // камера з початку координат зсувається на distZ,
if (rejxmploskosti == 1) {
glRotatef(angleX, 0.0f, 1.0f, 0.0f); // потім повертається по осі Oy
glRotatef(angleY, 1.0f, 0.0f, 0.0f); // потім повертається по осі Ox
}
else if (rejxmploskosti == 2)glRotatef(90, 0.0f, 1.0f, 0.0f);
else if (rejxmploskosti == 3)glRotatef(90, 1.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glPushMatrix();
// 1 ustanovka naqal'nxh param'etrov-----------------------------------------------------------------------------------------------------------------------------------
// 2 osi-----------------------------------------------------------------------------------------------------------------------------------
glColor4f(1, 0, 0, 1);
glLineWidth(2);
glBegin(GL_LINES);
glVertex3f(-1000, 0, 0);
glVertex3f(1000, 0, 0);
glColor4f(0, 1, 0, 1);
glVertex3f(0, -1000, 0);
glVertex3f(0, 1000, 0);
glColor4f(0, 0, 1, 1);
glVertex3f(0, 0, -1000);
glVertex3f(0, 0, 1000);
glEnd();
// 2 osi-----------------------------------------------------------------------------------------------------------------------------------
// 3 grafik-----------------------------------------------------------------------------------------------------------------------------------
xk = start.x;// n
yk = start.y;// e
zk = start.z;// m
tk = 0.1;
//glPointSize(2.5);
glColor4f(1, 0, 0, 1);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < nk - 30; i++)
{
tk += 0.01;
xnk = metod(sdix, tfx) + xk * meta;
ynk = metod(sdiy, tfy) + yk * meta;
znk = metod(sdiz, tfz) + zk * meta;
// xnk=vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));
// ynk=vdiy(sdiy, tfy);//yk + hk*(rk*xk - yk - zk*xk);
// znk=vdiy(sdiz, tfz);//zk + hk*(-bk*zk + xk*yk);
if (flagploskosti == 1)
if (((xnk - point.x)*nmp.x + (ynk - point.y)*nmp.y + (znk - point.z)*nmp.z)*znakploskosti <= 0 && flagproekcxi[3] == 1)
{
float x = (nmp.y*(xk*(ynk - yk) / (xnk - xk) - yk + point.y) + nmp.z*(xk*(znk - zk) / (xnk - xk) - zk + point.z) + nmp.x*point.x) /
(nmp.x + nmp.y*(ynk - yk) / (xnk - xk) + nmp.z*(znk - zk) / (xnk - xk));
znakploskosti *= -1;
glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);
glEnd();
glPointSize(7);
glColor4f(0, 1, 1, 1);
glBegin(GL_POINTS);
glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);
glEnd();
// glPointSize(2.5);
glColor4f(1, 0, 0, 1);
glBegin(GL_LINE_STRIP);
glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);
}
xk = xnk;
yk = ynk;
zk = znk;
glVertex3f(xnk*flagproekcxi[0], ynk*flagproekcxi[1], znk*flagproekcxi[2]);
}
glEnd();
/* glPointSize(10);
glColor3d(0, 1, 0);
glBegin(GL_POINTS);
for (int i = 0; i < 30; i++)
{
tk++;
xnk = vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));
ynk = vdiy(sdiy, tfy);// yk + hk*(rk*xk - yk - zk*xk);
znk = vdiy(sdiz, tfz);// zk + hk*(-bk*zk + xk*yk);
xk = xnk;
yk = ynk;
zk = znk;
glVertex3f(xnk, ynk, znk);
}
glEnd();*/
// 3 grafik-----------------------------------------------------------------------------------------------------------------------------------
// 4 ploskost'-------------------------------------------------------------------------------------
if (flagploskosti)
{
glLineWidth(5);
glColor4f(0, 0, 0, 0.3);
glBegin(GL_POLYGON);
for (int i = 0; i < 4; i++)
{
//cout<
glVertex3f(point.x + uglx[i].x, point.y + uglx[i].y, point.z + uglx[i].z);
}
glEnd();
}
// 4 ploskost'-------------------------------------------------------------------------------------
// 4 finiw-----------------------------------------------------------------------------------------------------------------------------------
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glDisable(GL_BLEND);
// glPopMatrix();
glFlush();
glutSwapBuffers(); // перемикання буферів
// 4 finiw-----------------------------------------------------------------------------------------------------------------------------------
}
//otrisovka---------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//vbivaniye v stek funkcxi----------------------------------------------------------------------------------------------------------------------------------------
void stuk(int p, int ii)
{
if (k == 1) {
stek[k] = a[ii];
pstek[k] = p; k++;
}
else
{
k--;
while (pstek[k] >= p)
{
itog[j] = stek[k]; j++; k--;
}k++; stek[k] = a[ii]; pstek[k] = p; k++;
}
}
//vbivaniye v stek funkcxi----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//cvf----------------------------------------------------------------------------------------------------------------------------------------
float charvfloat(char* a, int l) {
char mch[] = "0123456789";
int toqki = l;
float e = 0;
cout << endl << "#a#=";
for (int i = 0; i < l; i++)
cout << a[i];
for (int i = 0; i < l; i++)
if (a[i] == '.')toqki = i;
for (int i = 0; i < toqki; i++)
for (int j = 0; j < 10; j++)
if (a[i] == mch[j])e += j * pow(10.0, toqki - 1 - i);
for (int i = toqki + 1; i < l; i++)
for (int j = 0; j < 10; j++)
if (a[i] == mch[j])e += j * pow(10.0, toqki - i);
cout << endl << "qislo=" << e << " !";
return e;
}
//cvf----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//vbivaniye funkcxi v formulu----------------------------------------------------------------------------------------------------------------------------------------
void zdiy(int uno, diya *sdiy, int &toqki) {
/* flag--;
if (pstek[flag] == 1) {
sdiy[toqki].w = &xk; flag--;
sdiy[toqki].q = bqisel[flag];
}
else {
*sdiy[toqki].w =
*bqisel[flag];
flag--;
*sdiy[toqki].q = *bqisel[flag];
}
bqisel[flag] = sdiy[toqki].r;
pstek[flag] = 1; flag++; toqki++;*/
sdiy[toqki].q = new float;
sdiy[toqki].w = new float;
sdiy[toqki].r = new float;
flag--;
if (uno == 0) {
if (pstek[flag] == 1) { sdiy[toqki].w = &xk; flag--; }
else if (pstek[flag] == 2) { sdiy[toqki].w = &yk; flag--; }
else if (pstek[flag] == 3) { sdiy[toqki].w = &zk; flag--; }
else if (pstek[flag] == 5) { sdiy[toqki].w = &tk; flag--; }
else if (pstek[flag] == 0) { sdiy[toqki].w = new float; *(sdiy[toqki].w) = bqisel[flag]; flag--; }
else if (pstek[flag] == 4) { sdiy[toqki].w = sdiy[(int)bqisel[flag]].r; flag--; }
}
else { sdiy[toqki].w = new float; *(sdiy[toqki].w) = 0; }
if (pstek[flag] == 1) { sdiy[toqki].q = &xk; }
else if (pstek[flag] == 2) { sdiy[toqki].q = &yk; }
else if (pstek[flag] == 3) { sdiy[toqki].q = &zk; }
else if (pstek[flag] == 5) { sdiy[toqki].q = &tk; }
else if (pstek[flag] == 0) { sdiy[toqki].q = new float; *sdiy[toqki].q = bqisel[flag]; }
else if (pstek[flag] == 4) { sdiy[toqki].q = sdiy[(int)bqisel[flag]].r; }
bqisel[flag] = toqki + 0.1;
pstek[flag] = 4; flag++; toqki++;
}
//vbivaniye funkcxi v formulu----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//sozdaniye fomulx---------------------------------------------------------------------------------------------------------------------------------------
int f(diya *sdiy, int &tf) {
j = 0;
k = 1;
pstek[0] = -1;
skobki = toqki = 0;
flag = 3;
strcpy(itog, "0+");
cout << a;
strcpy(a, strcat(itog, a));
strcpy(itog, "");
//------------------------------------------------------------------------------------------------------------------------------
for (int i = 0; i < strlen(a); i++)
{
if (a[i] == '0' || a[i] == '1' || a[i] == '2' || a[i] == '3' || a[i] == '4' ||
a[i] == '5' || a[i] == '6' || a[i] == '7' || a[i] == '8' || a[i] == '9')
{
if (flag == 2 || flag == 4)return i;
itog[j] = a[i]; j++; flag = 0;
}
else if (a[i] == '.')
{
toqki++;
if (flag != 0 || toqki > 1)return i;
itog[j] = a[i]; j++; flag = 1;
}
else if (a[i] == 'x' || a[i] == 'y' || a[i] == 'z' || a[i] == 'v')
{
if (flag != 3)return i;
itog[j] = a[i]; j++; flag = 2;
}
else if (a[i] == '(' || a[i] == 's' || a[i] == 'c' || a[i] == 't' || a[i] == 'l' || (a[i] == '-' && flag == 3))
{
if (flag != 3)
{
return i;
}
//itog[j] = a[i]; j++;
//-----------------------------------
if (a[i] == '(')
{
skobki--;
stek[k] = '(';
pstek[k] = 0; k++;
}
else
{
if (a[i] == '-') { itog[j] = '0'; j++; itog[j] = '!'; j++; }
stek[k] = a[i];
pstek[k] = 4; k++;
}
//-----------------------------------
flag = 3;
}
else if (a[i] == ')')
{
toqki = 0;
if (flag == 0) { itog[j] = '!'; j++; }
else
if (flag % 2 == 1)return i;
//itog[j] = a[i]; j++;
//-------------------------------------
k--;
while (stek[k] != '(')
{
itog[j] = stek[k]; j++; k--;
}
//-------------------------------------
flag = 4;
skobki++;
}
else if (a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/' || a[i] == '^')
{
toqki = 0;
if (flag == 0) { itog[j] = '!'; j++; }
else
if (flag % 2 == 1)return i;
//itog[j] = a[i]; j++;
//-------------------------------------
if (a[i] == '+' || a[i] == '-') { stuk(1, i); }
else if (a[i] == '^') { stuk(3, i); }
else { stuk(2, i); }
//-------------------------------------
flag = 3;
}
}
//konec cxkla-------------------------------------------------------------------------------------------------------------------
{ if (flag == 0) { itog[j] = '!'; j++; }
if (skobki != 0)return 999;
k--;
while (k > 0)
{
itog[j] = stek[k];
j++; k--;
}
cout << "itog=";
for (int i = 0; i < j; i++)
cout << itog[i];
}
//konec vxvoda obratnoy formx--------------------------------------------------------------------------------------------------
//flag - tekuw'iy bqisel
//k - tekuw'ee naqalo v itog
//tf - tek fciya
k = 0;
flag = 0;
tf = 0;
for (int i = 0; i < j; i++)
{
/*cout << endl << "a[i]=" << a[i]
<< endl << "i=" << i
<< endl << "k=" << k;*/
if (itog[i] == '0' || itog[i] == '1' || itog[i] == '2' || itog[i] == '3' || itog[i] == '4' ||
itog[i] == '5' || itog[i] == '6' || itog[i] == '7' || itog[i] == '8' || itog[i] == '9' || itog[i] == '.')
{
a[i - k] = itog[i];
}
else if (itog[i] == '!')
{
bqisel[flag] = charvfloat(a, i - k);
pstek[flag] = 0;
k = i + 1; flag++;
}
else if (itog[i] == 'x') { pstek[flag] = 1; flag++; k = i + 1; }
else if (itog[i] == 'y') { pstek[flag] = 2; flag++; k = i + 1; }
else if (itog[i] == 'z') { pstek[flag] = 3; flag++; k = i + 1; }
else if (itog[i] == 'v') { pstek[flag] = 5; flag++; k = i + 1; }
else if (itog[i] == '-')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Minus;
k = i + 1;
}
else if (itog[i] == '+')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Plus;
k = i + 1;
}
else if (itog[i] == '*')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Umnojxt;
k = i + 1;
}
else if (itog[i] == '/')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Delit;
k = i + 1;
}
else if (itog[i] == '^')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Stepen;
k = i + 1;
}
else if (itog[i] == 's')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = SIN;
k = i + 1;
}
else if (itog[i] == 'c')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = COS;
k = i + 1;
}
else if (itog[i] == 't')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = TAN;
k = i + 1;
}
else if (itog[i] == 'l')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = LOG;
k = i + 1;
}
}
vdiy(sdiy, tf);
return (-1);
}
//sozdaniye fomulx----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//opisaniye ploskosti-------------------------------------------------------------------------------------------------------------
float ortonorm(Vctr3 e1, Vctr3 n2) { return((e1.x*n2.x + e1.y*n2.y + e1.z*n2.z) / skalarnoye(e1, e1)); }
void oppl(Vctr3 n, Vctr3 p)
{
nmp = raznicaVctr3(normal, point);
Vctr3 n2, n3;
n = raznicaVctr3(n, p);
n3.x = n2.x = n.x;
n3.y = n2.y = n.y;
n3.z = n2.z = n.z;
if (n.x != 0) { n2.y += 1; n3.z += 1; }
else if (n.y != 0) { n2.x += 1; n3.z += 1; }
else if (n.z != 0) { n2.y += 1; n3.x += 1; }
else flagploskosti = 0;
n2 = raznicaVctr3(n2, proizvVctr3(n, ortonorm(n, n2)));
cout << endl << "n " << n.x << " " << n.y << " " << n.z << " ";
cout << endl << "n2 " << n2.x << " " << n2.y << " " << n2.z << " ";
n3 = raznicaVctr3(n3, proizvVctr3(n, ortonorm(n, n3)));
n3 = raznicaVctr3(n3, proizvVctr3(n2, ortonorm(n2, n3)));
n3 = proizvVctr3(n3, 100);
n2 = proizvVctr3(n2, 100);
uglx[0] = sumaVctr3(n3, n2);
n3 = proizvVctr3(n3, -1);
uglx[1] = sumaVctr3(n3, n2);
n2 = proizvVctr3(n2, -1);
uglx[2] = sumaVctr3(n3, n2);
n3 = proizvVctr3(n3, -1);
uglx[3] = sumaVctr3(n3, n2);
cout << endl << "n3 " << n3.x << " " << n3.y << " " << n3.z << " ";
flagploskosti = 1;
}
//opisaniye ploskosti-------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void on_keyboard(unsigned char key, int x, int y) //обробка події від клавіатури
{
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 1 vvod peremennxh-----------------------------------------------------------------------------------------------------------------
//vvod 0 nichego ne vvoditsya
//vvod 1 vxbor peremennoy
//vvod 2 vvod x
//vvod 3 vvod y
//vvod 4 vvod z
//vvod 5 ploskost' vvodits'a normal' x
//vvod 6 ploskost' vvodits'a normal' y
//vvod 7 ploskost' vvodits'a normal' z
//vvod 8 ploskost' vvodits'a toqki x
//vvod 9 ploskost' vvodits'a toqki x
//vvod 10 ploskost' vvodits'a toqki x
//vvod 11 start x
//vvod 12 start y
//vvod 13 start z
if (vvod && key != 13)
{
system("cls");
//cout << "r\t\t\ \r";
//strcat(a, (char*)&key);
if (key == 8)
{
teka--;
a[teka] = '\0';
}
else
{
a[teka] = key;
teka++;
a[teka] = '\0';
}
cout << "a=" << a;
}
// 1 vvod peremennxh-----------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 2 obrabotka hotk'eyev-------------------------------------------------------------------------------------------------------------
else
{
switch (key)
{
//case 27: exit(0); break; // escape - вихід
case 'n':
nk += 30;
Вынужденные колебания
Вынужденные колебания осциллятора Ван дер Поля как с потерями энергии, так и без оных рассчитываются по формуле
t), где
А — амплитуда внешнего гармонического сигнала,
— его угловая частота.
Аттрактор Уэды
Один из первых примеров хаоса в электрических цепях был открыт Уэдой в цепи с нелинейным индуктивным элементом. Цепь с нелинейной индуктивностью и линейным сопротивлением, возбуждаемая гармонической электродвижущей силой, описывается уравнением
)
которое является частным случаем уравнения Дуффинга. С помощью аналогового и численного моделирования Уэда, сотрудник университета Киото в Японии, получил интересную визуализацию отображений Пуанкаре, описывающую хаотическую динамику этого уравнения. Уравнения этой модели, записанные в виде системы уравнений первого порядка, имеют вид
Алгоритм и программа
Для разработки программы был выбран язык программирования C++ и среда программирования Microsoft Visual Studio 2017.
Код программы:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
using namespace std;
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//otrisovka-------------------------------------------------------------------------------------------------
static float angle = 0; // кут повороту фігур
int width = 1, height = 1;
int button = -1; // кнопка миші (-1 - не натиснутa, 0 - ліва, 2 - права)
float angleX, angleY; // поточний кут повороту сцени
float zm;
float mouseX, mouseY; // поточні координати
float distZ = 0; // відстань по осі Z до сцени
//otrisovka---------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//kkk------------------------------------------------------------------------------------------------------------------
float hk = 0.05, xnk, ynk, znk, qk = 10, rk = 28, xk, yk, zk, tk, bk = 8 / 3;
int nk = 10000;
//kkk-----------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a formulx----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
struct diya {
float * q;
float * w;
float * r;
float(*f)(float q, float w);
};
diya sdiy[50], sdix[50], sdiz[50]; //struktura funkcxy
int tfx = 0, tfy = 0, tfz = 0; //koliqestvo funkcxy
float bqisel[20]; //bufer qisel
//dl'a formulx-----------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a vvoda--------------------------------------------------------------------------------------------------------------------------------
float* uvum; //kkk bufer dl'a constant
int vvod = 0; //status vvoda
float bust = 0; //kkk bust uveliq'eniya constant
char *a = new char[200]; //bufer dl'a vvoda
char *ba = new char[10];
int teka = 0; //polojeniye karetki a
//dl'a vvoda----------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a obratnogo vvoda--------------------------------------------------
char *itog = new char[200]; //dl'a oratnoy formulx
char *stek = new char[50]; //stek funkcxy
int pstek[50]; //prioritet funkcxy steka
int flag; //0-cifra 1-toqka 2-x 3-operator i ( 4-)
int skobki, toqki; //kolvo skobok i tiqek
int j, k; //j t'ekuw'iy el'em'ent itog;stek
//dl'a obratnogo vvoda--------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//dl'a ploskosti--------------------------------------------------
void(*tekpaint)();
int flagploskosti = 0;// 1 - risuet; 0 - net ; 2 - proekcxxya x ; 3 - y ; 4 - z
int rejxmploskosti = 1;// 1 - norma; 2 - proekcxxya x ; 3 - y ; 4 - z
int flagproekcxi[4] = { 1,1,1,1 };
struct Vctr3
{
float x; float y; float z;
};
float skalarnoye(Vctr3 a, Vctr3 b) { return (a.x*b.x + a.y*b.y + a.z*b.z); }
Vctr3 raznicaVctr3(Vctr3 a, Vctr3 b) { a.x -= b.x; a.y -= b.y; a.z -= b.z; return (a); }
Vctr3 sumaVctr3(Vctr3 a, Vctr3 b) { a.x += b.x; a.y += b.y; a.z += b.z; return (a); }
Vctr3 proizvVctr3(Vctr3 a, float b) { a.x *= b; a.y *= b; a.z *= b; return (a); }
Vctr3 normal, point, nmp,start;
Vctr3 uglx[4];
int znakploskosti = 1;
//dl'a ploskosti--------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
float Plus(float q, float w) { return q + w; }
float Minus(float q, float w) { return q - w; }
float Umnojxt(float q, float w) { return q * w; }
float Delit(float q, float w) { return q / w; }
float Stepen(float q, float w) { return powf(q, w); }
float COS(float q, float w) { return cos(q); }
float SIN(float q, float w) { return sin(q); }
float TAN(float q, float w) { return tan(q); }
float EXP(float q, float w) { return exp(q); }
float LOG(float q, float w) { return log(q); }
float OTR(float q, float w) { return -q; }
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//vxvod r'eweniya formulx--------------------------------------------------------------------------------------------------------
//eylera----------------------------------------------------------------------
float vdiy(diya *sdiy, int &toqki)
{
for (int i = 0; i < toqki; i++)
*sdiy[i].r = sdiy[i].f(*sdiy[i].q, *sdiy[i].w);
if (toqki) {
// cout << endl << "!!!!! =" << *sdiy[toqki - 1].r;
return *sdiy[toqki - 1].r;
}
else {
// cout << endl << "!!!!! =" << 1;
return 0;
}
}
//rungekuta------------------------------------------------------------------------
int meta = 0;
float rkdiy(diya *sdiy, int &toqki)
{
float k1, k2, k3, k4;
k1 = hk * vdiy(sdiy, toqki); xk += k1 / 2; yk += k1 / 2; zk += k1 / 2;
k2 = hk * vdiy(sdiy, toqki); xk -= k1 / 2 - k2 / 2; yk -= k1 / 2 - k2 / 2; zk -= k1 / 2 - k2 / 2;
k3 = hk * vdiy(sdiy, toqki); xk -= k2 / 2 - k3; yk -= k2 / 2 - k3; zk -= k2 / 2 - k3;
k4 = hk * vdiy(sdiy, toqki); xk -= k3; yk -= k3; zk -= k3;
return hk * (k1 + 2 * k2 + 2 * k3 + k4) / 6;
}
float(*metod)(diya *sdiy, int &toqki) = vdiy;
//vxvod r'eweniya formulx--------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//otrisovka po t---------------------------------------------------------------------------------------------------------------------
void Tpaint() {
glClearColor(1, 1, 1, 0);
glViewport(0, 0, width, height); // Установити область перегляду таку, щоб вона вміщувала все вікно
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);// включаємо режим роботи з видовою матрицею
glLoadIdentity();
glTranslatef(0, 0, distZ);
glRotatef(0, 0, 0, 1);
glLineWidth(2);
glBegin(GL_LINES);
glColor3f(0, 0, 1);
glVertex2f(-distZ, 2.0 / 6 * distZ);
glVertex2f(distZ, 2.0 / 6 * distZ);
glColor3f(1, 0, 0);
glVertex2f(-distZ, -2.0 / 6 * distZ);
glVertex2f(distZ, -2.0 / 6 * distZ);
glColor3f(0, 1, 0);
glVertex2f(-distZ, 0);
glVertex2f(distZ, 0);
glColor3f(0, 0, 0);
glVertex2f(0, -distZ);
glVertex2f(0, distZ);
glEnd();
float *masx = new float[nk];
float *masy = new float[nk];
float *masz = new float[nk];
xk = start.x;// n
yk = start.y;// e
zk = start.z;// m
tk = 0.1;
for (int i = 0; i < nk; i++)
{
tk += 0.1;
//xnk = vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));
//ynk = vdiy(sdiy, tfy);//yk + hk*(rk*xk - yk - zk*xk);
//znk = vdiy(sdiz, tfz);//zk + hk*(-bk*zk + xk*yk);
xnk = metod(sdix, tfx) + xk * meta;
ynk = metod(sdiy, tfy) + yk * meta;
znk = metod(sdiz, tfz) + zk * meta;
xk = xnk;
yk = ynk;
zk = znk;
masx[i] = xnk;
masy[i] = ynk;
masz[i] = znk;
}
glBegin(GL_LINE_STRIP);
tk = 0;
for (int i = 0; i < nk; i++)
{
tk += 0.01;
if (masx[i] - 2.0 / 6 * distZ < -1.0 / 6 * distZ)masx[i] = 1.0 / 6 * distZ;
glVertex2f(tk, masx[i] - 2.0 / 6 * distZ);
}
glEnd();
glBegin(GL_LINE_STRIP);
tk = 0;
for (int i = 0; i < nk; i++)
{
tk += 0.01;
if (masy[i] > -1.0 / 6 * distZ)masy[i] = -1.0 / 6 * distZ;
if (masy[i] < 1.0 / 6 * distZ)masy[i] = 1.0 / 6 * distZ;
glVertex2f(tk, masy[i]);
}
glEnd();
glBegin(GL_LINE_STRIP);
tk = 0;
for (int i = 0; i < nk; i++)
{
tk += 0.01;
if (masz[i] + 2.0 / 6 * distZ > 1.0 / 6 * distZ)masz[i] = -1.0 / 6 * distZ;
glVertex2f(tk, masz[i] + 2.0 / 6 * distZ);
}
glEnd();
glFlush();
glutSwapBuffers();
delete[nk] masx;
delete[nk] masy;
delete[nk] masz;
}
//otrisovka po t---------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//otrisovka---------------------------------------------------------------------------------------------------------------------
void on_paint()
{
// 1 ustanovka naqal'nxh param'etrov-----------------------------------------------------------------------------------------------------------------------------------
angle = 0.0f; // збільшення кута повороту
glViewport(0, 0, width, height); // Установити область перегляду таку, щоб вона вміщувала все вікно
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очистка буферів OpenGL// задано функцией f(d) = 1.0 / (0.4 * d * d + 0.2 * d)
glMatrixMode(GL_PROJECTION);// включаємо режим роботи з матрицею проекцій
glLoadIdentity();
gluPerspective(60, (GLfloat)width / height, 1, 1000);
glMatrixMode(GL_MODELVIEW);// включаємо режим роботи з видовою матрицею
glLoadIdentity();
glTranslatef(0, 0, distZ); // камера з початку координат зсувається на distZ,
if (rejxmploskosti == 1) {
glRotatef(angleX, 0.0f, 1.0f, 0.0f); // потім повертається по осі Oy
glRotatef(angleY, 1.0f, 0.0f, 0.0f); // потім повертається по осі Ox
}
else if (rejxmploskosti == 2)glRotatef(90, 0.0f, 1.0f, 0.0f);
else if (rejxmploskosti == 3)glRotatef(90, 1.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glPushMatrix();
// 1 ustanovka naqal'nxh param'etrov-----------------------------------------------------------------------------------------------------------------------------------
// 2 osi-----------------------------------------------------------------------------------------------------------------------------------
glColor4f(1, 0, 0, 1);
glLineWidth(2);
glBegin(GL_LINES);
glVertex3f(-1000, 0, 0);
glVertex3f(1000, 0, 0);
glColor4f(0, 1, 0, 1);
glVertex3f(0, -1000, 0);
glVertex3f(0, 1000, 0);
glColor4f(0, 0, 1, 1);
glVertex3f(0, 0, -1000);
glVertex3f(0, 0, 1000);
glEnd();
// 2 osi-----------------------------------------------------------------------------------------------------------------------------------
// 3 grafik-----------------------------------------------------------------------------------------------------------------------------------
xk = start.x;// n
yk = start.y;// e
zk = start.z;// m
tk = 0.1;
//glPointSize(2.5);
glColor4f(1, 0, 0, 1);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < nk - 30; i++)
{
tk += 0.01;
xnk = metod(sdix, tfx) + xk * meta;
ynk = metod(sdiy, tfy) + yk * meta;
znk = metod(sdiz, tfz) + zk * meta;
// xnk=vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));
// ynk=vdiy(sdiy, tfy);//yk + hk*(rk*xk - yk - zk*xk);
// znk=vdiy(sdiz, tfz);//zk + hk*(-bk*zk + xk*yk);
if (flagploskosti == 1)
if (((xnk - point.x)*nmp.x + (ynk - point.y)*nmp.y + (znk - point.z)*nmp.z)*znakploskosti <= 0 && flagproekcxi[3] == 1)
{
float x = (nmp.y*(xk*(ynk - yk) / (xnk - xk) - yk + point.y) + nmp.z*(xk*(znk - zk) / (xnk - xk) - zk + point.z) + nmp.x*point.x) /
(nmp.x + nmp.y*(ynk - yk) / (xnk - xk) + nmp.z*(znk - zk) / (xnk - xk));
znakploskosti *= -1;
glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);
glEnd();
glPointSize(7);
glColor4f(0, 1, 1, 1);
glBegin(GL_POINTS);
glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);
glEnd();
// glPointSize(2.5);
glColor4f(1, 0, 0, 1);
glBegin(GL_LINE_STRIP);
glVertex3f(x*flagproekcxi[0], ((x - xk)*(ynk - yk) / (xnk - xk) + yk)*flagproekcxi[1], ((x - xk)*(znk - zk) / (xnk - xk) + zk)*flagproekcxi[0]);
}
xk = xnk;
yk = ynk;
zk = znk;
glVertex3f(xnk*flagproekcxi[0], ynk*flagproekcxi[1], znk*flagproekcxi[2]);
}
glEnd();
/* glPointSize(10);
glColor3d(0, 1, 0);
glBegin(GL_POINTS);
for (int i = 0; i < 30; i++)
{
tk++;
xnk = vdiy(sdix, tfx);// xk + hk*(qk*(yk - xk));
ynk = vdiy(sdiy, tfy);// yk + hk*(rk*xk - yk - zk*xk);
znk = vdiy(sdiz, tfz);// zk + hk*(-bk*zk + xk*yk);
xk = xnk;
yk = ynk;
zk = znk;
glVertex3f(xnk, ynk, znk);
}
glEnd();*/
// 3 grafik-----------------------------------------------------------------------------------------------------------------------------------
// 4 ploskost'-------------------------------------------------------------------------------------
if (flagploskosti)
{
glLineWidth(5);
glColor4f(0, 0, 0, 0.3);
glBegin(GL_POLYGON);
for (int i = 0; i < 4; i++)
{
//cout<
glVertex3f(point.x + uglx[i].x, point.y + uglx[i].y, point.z + uglx[i].z);
}
glEnd();
}
// 4 ploskost'-------------------------------------------------------------------------------------
// 4 finiw-----------------------------------------------------------------------------------------------------------------------------------
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
glDisable(GL_BLEND);
// glPopMatrix();
glFlush();
glutSwapBuffers(); // перемикання буферів
// 4 finiw-----------------------------------------------------------------------------------------------------------------------------------
}
//otrisovka---------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 2 3 4
//vbivaniye v stek funkcxi----------------------------------------------------------------------------------------------------------------------------------------
void stuk(int p, int ii)
{
if (k == 1) {
stek[k] = a[ii];
pstek[k] = p; k++;
}
else
{
k--;
while (pstek[k] >= p)
{
itog[j] = stek[k]; j++; k--;
}k++; stek[k] = a[ii]; pstek[k] = p; k++;
}
}
//vbivaniye v stek funkcxi----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//cvf----------------------------------------------------------------------------------------------------------------------------------------
float charvfloat(char* a, int l) {
char mch[] = "0123456789";
int toqki = l;
float e = 0;
cout << endl << "#a#=";
for (int i = 0; i < l; i++)
cout << a[i];
for (int i = 0; i < l; i++)
if (a[i] == '.')toqki = i;
for (int i = 0; i < toqki; i++)
for (int j = 0; j < 10; j++)
if (a[i] == mch[j])e += j * pow(10.0, toqki - 1 - i);
for (int i = toqki + 1; i < l; i++)
for (int j = 0; j < 10; j++)
if (a[i] == mch[j])e += j * pow(10.0, toqki - i);
cout << endl << "qislo=" << e << " !";
return e;
}
//cvf----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//vbivaniye funkcxi v formulu----------------------------------------------------------------------------------------------------------------------------------------
void zdiy(int uno, diya *sdiy, int &toqki) {
/* flag--;
if (pstek[flag] == 1) {
sdiy[toqki].w = &xk; flag--;
sdiy[toqki].q = bqisel[flag];
}
else {
*sdiy[toqki].w =
*bqisel[flag];
flag--;
*sdiy[toqki].q = *bqisel[flag];
}
bqisel[flag] = sdiy[toqki].r;
pstek[flag] = 1; flag++; toqki++;*/
sdiy[toqki].q = new float;
sdiy[toqki].w = new float;
sdiy[toqki].r = new float;
flag--;
if (uno == 0) {
if (pstek[flag] == 1) { sdiy[toqki].w = &xk; flag--; }
else if (pstek[flag] == 2) { sdiy[toqki].w = &yk; flag--; }
else if (pstek[flag] == 3) { sdiy[toqki].w = &zk; flag--; }
else if (pstek[flag] == 5) { sdiy[toqki].w = &tk; flag--; }
else if (pstek[flag] == 0) { sdiy[toqki].w = new float; *(sdiy[toqki].w) = bqisel[flag]; flag--; }
else if (pstek[flag] == 4) { sdiy[toqki].w = sdiy[(int)bqisel[flag]].r; flag--; }
}
else { sdiy[toqki].w = new float; *(sdiy[toqki].w) = 0; }
if (pstek[flag] == 1) { sdiy[toqki].q = &xk; }
else if (pstek[flag] == 2) { sdiy[toqki].q = &yk; }
else if (pstek[flag] == 3) { sdiy[toqki].q = &zk; }
else if (pstek[flag] == 5) { sdiy[toqki].q = &tk; }
else if (pstek[flag] == 0) { sdiy[toqki].q = new float; *sdiy[toqki].q = bqisel[flag]; }
else if (pstek[flag] == 4) { sdiy[toqki].q = sdiy[(int)bqisel[flag]].r; }
bqisel[flag] = toqki + 0.1;
pstek[flag] = 4; flag++; toqki++;
}
//vbivaniye funkcxi v formulu----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//sozdaniye fomulx---------------------------------------------------------------------------------------------------------------------------------------
int f(diya *sdiy, int &tf) {
j = 0;
k = 1;
pstek[0] = -1;
skobki = toqki = 0;
flag = 3;
strcpy(itog, "0+");
cout << a;
strcpy(a, strcat(itog, a));
strcpy(itog, "");
//------------------------------------------------------------------------------------------------------------------------------
for (int i = 0; i < strlen(a); i++)
{
if (a[i] == '0' || a[i] == '1' || a[i] == '2' || a[i] == '3' || a[i] == '4' ||
a[i] == '5' || a[i] == '6' || a[i] == '7' || a[i] == '8' || a[i] == '9')
{
if (flag == 2 || flag == 4)return i;
itog[j] = a[i]; j++; flag = 0;
}
else if (a[i] == '.')
{
toqki++;
if (flag != 0 || toqki > 1)return i;
itog[j] = a[i]; j++; flag = 1;
}
else if (a[i] == 'x' || a[i] == 'y' || a[i] == 'z' || a[i] == 'v')
{
if (flag != 3)return i;
itog[j] = a[i]; j++; flag = 2;
}
else if (a[i] == '(' || a[i] == 's' || a[i] == 'c' || a[i] == 't' || a[i] == 'l' || (a[i] == '-' && flag == 3))
{
if (flag != 3)
{
return i;
}
//itog[j] = a[i]; j++;
//-----------------------------------
if (a[i] == '(')
{
skobki--;
stek[k] = '(';
pstek[k] = 0; k++;
}
else
{
if (a[i] == '-') { itog[j] = '0'; j++; itog[j] = '!'; j++; }
stek[k] = a[i];
pstek[k] = 4; k++;
}
//-----------------------------------
flag = 3;
}
else if (a[i] == ')')
{
toqki = 0;
if (flag == 0) { itog[j] = '!'; j++; }
else
if (flag % 2 == 1)return i;
//itog[j] = a[i]; j++;
//-------------------------------------
k--;
while (stek[k] != '(')
{
itog[j] = stek[k]; j++; k--;
}
//-------------------------------------
flag = 4;
skobki++;
}
else if (a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/' || a[i] == '^')
{
toqki = 0;
if (flag == 0) { itog[j] = '!'; j++; }
else
if (flag % 2 == 1)return i;
//itog[j] = a[i]; j++;
//-------------------------------------
if (a[i] == '+' || a[i] == '-') { stuk(1, i); }
else if (a[i] == '^') { stuk(3, i); }
else { stuk(2, i); }
//-------------------------------------
flag = 3;
}
}
//konec cxkla-------------------------------------------------------------------------------------------------------------------
{ if (flag == 0) { itog[j] = '!'; j++; }
if (skobki != 0)return 999;
k--;
while (k > 0)
{
itog[j] = stek[k];
j++; k--;
}
cout << "itog=";
for (int i = 0; i < j; i++)
cout << itog[i];
}
//konec vxvoda obratnoy formx--------------------------------------------------------------------------------------------------
//flag - tekuw'iy bqisel
//k - tekuw'ee naqalo v itog
//tf - tek fciya
k = 0;
flag = 0;
tf = 0;
for (int i = 0; i < j; i++)
{
/*cout << endl << "a[i]=" << a[i]
<< endl << "i=" << i
<< endl << "k=" << k;*/
if (itog[i] == '0' || itog[i] == '1' || itog[i] == '2' || itog[i] == '3' || itog[i] == '4' ||
itog[i] == '5' || itog[i] == '6' || itog[i] == '7' || itog[i] == '8' || itog[i] == '9' || itog[i] == '.')
{
a[i - k] = itog[i];
}
else if (itog[i] == '!')
{
bqisel[flag] = charvfloat(a, i - k);
pstek[flag] = 0;
k = i + 1; flag++;
}
else if (itog[i] == 'x') { pstek[flag] = 1; flag++; k = i + 1; }
else if (itog[i] == 'y') { pstek[flag] = 2; flag++; k = i + 1; }
else if (itog[i] == 'z') { pstek[flag] = 3; flag++; k = i + 1; }
else if (itog[i] == 'v') { pstek[flag] = 5; flag++; k = i + 1; }
else if (itog[i] == '-')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Minus;
k = i + 1;
}
else if (itog[i] == '+')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Plus;
k = i + 1;
}
else if (itog[i] == '*')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Umnojxt;
k = i + 1;
}
else if (itog[i] == '/')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Delit;
k = i + 1;
}
else if (itog[i] == '^')
{
zdiy(0, sdiy, tf);
sdiy[tf - 1].f = Stepen;
k = i + 1;
}
else if (itog[i] == 's')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = SIN;
k = i + 1;
}
else if (itog[i] == 'c')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = COS;
k = i + 1;
}
else if (itog[i] == 't')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = TAN;
k = i + 1;
}
else if (itog[i] == 'l')
{
zdiy(1, sdiy, tf);
sdiy[tf - 1].f = LOG;
k = i + 1;
}
}
vdiy(sdiy, tf);
return (-1);
}
//sozdaniye fomulx----------------------------------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//opisaniye ploskosti-------------------------------------------------------------------------------------------------------------
float ortonorm(Vctr3 e1, Vctr3 n2) { return((e1.x*n2.x + e1.y*n2.y + e1.z*n2.z) / skalarnoye(e1, e1)); }
void oppl(Vctr3 n, Vctr3 p)
{
nmp = raznicaVctr3(normal, point);
Vctr3 n2, n3;
n = raznicaVctr3(n, p);
n3.x = n2.x = n.x;
n3.y = n2.y = n.y;
n3.z = n2.z = n.z;
if (n.x != 0) { n2.y += 1; n3.z += 1; }
else if (n.y != 0) { n2.x += 1; n3.z += 1; }
else if (n.z != 0) { n2.y += 1; n3.x += 1; }
else flagploskosti = 0;
n2 = raznicaVctr3(n2, proizvVctr3(n, ortonorm(n, n2)));
cout << endl << "n " << n.x << " " << n.y << " " << n.z << " ";
cout << endl << "n2 " << n2.x << " " << n2.y << " " << n2.z << " ";
n3 = raznicaVctr3(n3, proizvVctr3(n, ortonorm(n, n3)));
n3 = raznicaVctr3(n3, proizvVctr3(n2, ortonorm(n2, n3)));
n3 = proizvVctr3(n3, 100);
n2 = proizvVctr3(n2, 100);
uglx[0] = sumaVctr3(n3, n2);
n3 = proizvVctr3(n3, -1);
uglx[1] = sumaVctr3(n3, n2);
n2 = proizvVctr3(n2, -1);
uglx[2] = sumaVctr3(n3, n2);
n3 = proizvVctr3(n3, -1);
uglx[3] = sumaVctr3(n3, n2);
cout << endl << "n3 " << n3.x << " " << n3.y << " " << n3.z << " ";
flagploskosti = 1;
}
//opisaniye ploskosti-------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void on_keyboard(unsigned char key, int x, int y) //обробка події від клавіатури
{
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 1 vvod peremennxh-----------------------------------------------------------------------------------------------------------------
//vvod 0 nichego ne vvoditsya
//vvod 1 vxbor peremennoy
//vvod 2 vvod x
//vvod 3 vvod y
//vvod 4 vvod z
//vvod 5 ploskost' vvodits'a normal' x
//vvod 6 ploskost' vvodits'a normal' y
//vvod 7 ploskost' vvodits'a normal' z
//vvod 8 ploskost' vvodits'a toqki x
//vvod 9 ploskost' vvodits'a toqki x
//vvod 10 ploskost' vvodits'a toqki x
//vvod 11 start x
//vvod 12 start y
//vvod 13 start z
if (vvod && key != 13)
{
system("cls");
//cout << "r\t\t\ \r";
//strcat(a, (char*)&key);
if (key == 8)
{
teka--;
a[teka] = '\0';
}
else
{
a[teka] = key;
teka++;
a[teka] = '\0';
}
cout << "a=" << a;
}
// 1 vvod peremennxh-----------------------------------------------------------------------------------------------------------------
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 2 obrabotka hotk'eyev-------------------------------------------------------------------------------------------------------------
else
{
switch (key)
{
//case 27: exit(0); break; // escape - вихід
case 'n':
nk += 30;