Курсовая Использование аттракторов. Использование аттракторов
Скачать 367.67 Kb.
|
//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; // on_paint(); break; case 'm': nk -= 30; // on_paint(); break; case 'r': if (rejxmploskosti == 4)rejxmploskosti = 1; else rejxmploskosti++; on_paint(); break; case 'o': if (flagproekcxi[3] == 4) { glutDisplayFunc(Tpaint); tekpaint = Tpaint; flagproekcxi[3] = 0; flagproekcxi[0] = 1; flagproekcxi[1] = 1; flagproekcxi[2] = 1; } else if (flagproekcxi[3] == 3) { flagproekcxi[3]++; flagproekcxi[0] = 1; flagproekcxi[1] = 1; flagproekcxi[2] = 0; } else if (flagproekcxi[3] == 2) { flagproekcxi[3]++; flagproekcxi[0] = 1; flagproekcxi[1] = 0; flagproekcxi[2] = 1; } else if (flagproekcxi[3] == 1) { flagproekcxi[3]++; flagproekcxi[0] = 0; flagproekcxi[1] = 1; flagproekcxi[2] = 1; } else if (flagproekcxi[3] == 0) { flagproekcxi[3]++; glutDisplayFunc(on_paint); tekpaint = on_paint; } on_paint(); break; case 'p': teka = 0; system("cls"); cout << "vvedite x normali ploskosti"; vvod = 5; break; case 't': if (meta) { meta = 0; metod = vdiy; } else { meta = 1; metod = rkdiy; } break; case 'h': system("cls"); cout << "Enter - naqat' vvod peremennxh" << endl << "n - uv'eliqit' wag" << endl << "m - um'en'wxt'" << endl << "p - vv'esti normal' ploskosti" << endl << "t - eyler || rungekut" << endl << "o - proekcxya" << endl << "r - p'er'ekl'uqit' r'ejxm otobrajeniya"; break; case 'k': system("cls"); cout << endl << "n=" << nk << endl << "x=" << xnk << endl << "y=" << ynk << endl << "z=" << znk; break; } } // 2 obrabotka hotk'eyev------------------------------------------------------------------------------------------------------------- //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // 1 vvod peremennxh----------------------------------------------------------------------------------------------------------------- if (key == 13) { if (vvod == 0) { vvod = 1; strcpy(a, ""); cout << endl << "vvedite peremennuyu kotoruyu sobiryet'es' zadat' (x | y | z)"; teka = 0; } else if (vvod == 1) { system("cls"); if (a[0] == 'x')vvod = 2; else if (a[0] == 'y')vvod = 3; else if (a[0] == 'z')vvod = 4; else if (a[0] == 's') { if (a[1] == 'x') vvod = 11; else if (a[1] == 'y') vvod = 12; else if (a[1] == 'z') vvod = 13; else vvod = 0; } else vvod = 0; if (vvod)cout << "vvedite " << a[0] << endl << a[0] << " = "; teka = 0; } else if (vvod == 2) { cout << "f=" << f(sdix, tfx); vvod = 0; } else if (vvod == 3) { cout << "f=" << f(sdiy, tfy); vvod = 0; } else if (vvod == 4) { cout << "f=" << f(sdiz, tfz); vvod = 0; } else if (vvod == 5) { cout << endl << "vvedite normal y"; normal.x = charvfloat(a, teka); teka = 0; vvod = 6; } else if (vvod == 6) { cout << endl << "vvedite normal z"; normal.y = charvfloat(a, teka); teka = 0; vvod = 7; } else if (vvod == 7) { cout << endl << "vvedite point x"; normal.z = charvfloat(a, teka); teka = 0; vvod = 8; } else if (vvod == 8) { cout << endl << "vvedite point y"; point.x = charvfloat(a, teka); teka = 0; vvod = 9; } else if (vvod == 9) { cout << endl << "vvedite point z"; point.y = charvfloat(a, teka); teka = 0; vvod = 10; } else if (vvod == 10) { point.z = charvfloat(a, teka); oppl(normal, point); vvod = 0; } else if (vvod == 11) { start.x = charvfloat(a, teka); vvod = 0; } else if (vvod == 12) { start.y = charvfloat(a, teka); vvod = 0; } else if (vvod == 13) { start.z = charvfloat(a, teka); vvod = 0; } } // 1 vvod peremennxh----------------------------------------------------------------------------------------------------------------- //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } void on_motion(int x, int y) { switch (button) { case 0: angleX += x - mouseX; angleY += y - mouseY; mouseX = x; mouseY = y; break; case 2: distZ += (y - mouseY) / 10; cout << distZ; mouseY = y; break; } } void on_mouse(int _button, int state, int x, int y) { if (state == 1) { // 0 - натиснули на кнопку, 1 - відпустили кнопку button = -1; // ніяка кнопка не натиснута return; } switch (button = _button) { case 0: mouseX = x; mouseY = y;// cout << "0------------------------------------------------"; break; case 2: //angleX = 0; angleY = 0; mouseY = y;// cout << "2------------------------------------------------";//distZ = -15 ; break; } } void on_size(int w, int h) { width = w; height = h; if (height == 0) height = 1; // Запобігання ділення на нуль, якщо вікно занадто коротке // (ви не можете зробити вікно нульовою ширини). } void on_timer(int value) { tekpaint(); // перемалюємо екран glutTimerFunc(50, on_timer, 0); // через 33мс викличеться ця функція } int main(int argc, char* argv[]) { strcpy(a,"50*c(v*3)+34*s(z/7)"); f(sdix, tfx); strcpy(a, "100*s(v*10)"); f(sdiy, tfy); strcpy(a, "100*c(v*10)"); f(sdiz, tfz); start.x = 0.1; start.y = 0.1; start.z = 0.1; glutInit(&argc, argv); // ініціалізація GLUT glutInitWindowSize(600, 600); // установка розмірів вікна glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); // настройка OpenGL контексту glutCreateWindow("Третій приклад"); // створення вікна glutDisplayFunc(on_paint); tekpaint = on_paint; // вказуємо функцію, яка відповідає за перемалювання glutReshapeFunc(on_size); // --//-- за зміну розмірів вікна glutKeyboardFunc(on_keyboard); // --//-- за натискання наклавішу glutMotionFunc(on_motion); // --//-- за переміщення миші з натиснутою кнопкою glutMouseFunc(on_mouse); // --//-- за натискання на кнопку миші glutTimerFunc(50, on_timer, 0); // кожні 33мс викликається ця функція glutMainLoop(); // цикл обробки повідомлень return(0); } |