/******************************************************/ /*************** optika1_2.ccl **************/ /******************************************************/ /* opticke prvky - cviceni 14.3.2007*/ /* Vyukovy Program optika1_2.ccl definuje prikaz s1_2 /* Prikaz s1_2 je volan z databaze optickych soustav, jejiz strukturu jsme definovali jen pro potrebu vyuky. /* Kazda zde uvazovana databaze odpovida jedne opticke soustave, ktera obsahuje konstrukcni data opticke soustavy /* a vypocte jeji ohniskovou vzdalenost a polohu ohniska. /* Uzivatel muze otevrenou databazi v systemu Oslo modifikovat a ulozit ji pod jinym nazvem */ /*****************halavickove soubory ccl ***************/ #include "inc/gendefs.h" #include "inc/dbdefs.h" /*********************************************************/ cmd s1_2() { int pocet_ploch, max_pocet_ploch; max_pocet_ploch=100; float r[max_pocet_ploch]; //polomery krivosti plan plochy maji pri vzpoctu r[i]=10e+20 v tabulce //se zobrazuje jako 0 float d[max_pocet_ploch]; //mezery za plochami, float n[max_pocet_ploch]; //indexy lomu za plochami !! float h[max_pocet_ploch]; //opticke vysky na plochach /***********************************************************************************/ /*Nasledujci cast programu zajistuje komunikaci s databazi, ve ktere jsou ulozeny data opticke soustavy*/ int db_dsprows, db_dspcols, pocet_sloupcu, db_leftcol, db_rightcol; //promenne s udaji o databazi char db_cbfct[80], db_nazev[80], db_adresa[80]; //promenne s udaji o databazi //*nasledujici prikaz prevezme z databaze optickych soustav dulezite udaje a ulozi je do promennych */ db_get_database_properties(&db_dsprows,&pocet_ploch,&db_dspcols,&pocet_sloupcu,&db_leftcol,&db_rightcol,db_cbfct,db_nazev,db_adresa); db_get_rcolumn(r,pocet_ploch,1);//do r[] ulozi hodnoty z 1.sloupce databaze, tj. r[1], r[2],... a do r[0] pocet radku databaze db_get_rcolumn(d,pocet_ploch,2);//do d[] ulozi hodnoty z 2.sloupce databaze, tj. d[1], d[2],... a do d[0] pocet radku databaze db_get_rcolumn(n,pocet_ploch,4);//do n[] ulozi hodnoty z 4.sloupce databaze, tj. n[1], n[2],... a do n[0] pocet radku databaze n[0]=1.0; //stanoveni indexu lomu v predmetovem prostoru timestr(astr, " %X dne %x \n"); // funkce timestr vlozi do promenne astr aktualni cas a datum printf(db_nazev); // zobrazi nazev opticke soustavy printf(astr); // zobrazi aktualni datum a cas vedle nazvu soustavy print("pocet_ploch = ",pocet_ploch); // vypise pocet ploch zjistenych v databazi /*Polomer, ktery ma v databazi hodnotu 0, je ve skutecnosti plan plocha, kterou bereme jako radius o velkem polomeru*/ for(i=1;i<=pocet_ploch;i++) { if(fabs(r[i])>10e-10); else r[i]=10e20; } /************************************************************************************/ /*Nasleduje deklarace promennych pouzitych pri vypoctu*/ float s0; //vzdalenost predmetu float y0; //velikost predmetu float m; //pricne zvetseni float f; //obrazova ohniskova vzdalenost float nu; //promenna nu obsahuje soucin indexu lomu n a uhlu u pro urcitou plochu float hh; //vyska paprsku na urcite plose float ni; //index lomu za urcitou plochou float di; //mezera za urcitou plochou float ro; //krivost urcite plochy float nn; //rozdil inexu lomu za a pred urcitou plochou float poloha_ohniska, poloha_obrazu; /***************************************************************************************/ /* Nasleduje vypocet ohniskove vzdalenosti*/ hh=1.0; nu=0.0; //pro paprsky z nekonecna pred prvni plochou je soucin n*u= 0 for(i=1;i<=pocet_ploch;i++) { ro=1.0/r[i]; di=d[i]; nn=n[i]-n[i-1]; ni=n[i]; nu=nu-hh*nn*ro; if (i==pocet_ploch);else hh=hh+nu*di/ni; } f=-n[pocet_ploch]/nu; // upraveny tvar vztahu f=h1/u[k], protoze jsme zvolili h1 na prvni plose 1.0 poloha_ohniska=-hh*ni/nu; print("f' = ",f); print("s'(F') = ",poloha_ohniska); /*****************************************************************************************/ /*Nasleduje vstup dat pro dalsi vypocty*/ input(&s0, "poloha predmetu:"); input(&y0, "velikost predmetu:"); printf("s0 = %8.3f \n",s0); printf("y0 = %8.3f \n",y0); printf("\n"); printf(" Nyni prostudujte kod programu a rozsirte ho dle dale ulozenych cviceni. \n"); printf(" Nazev upraveneho prikazu zmente na s1_uzivatel \n"); printf(" Upraveny program ulozte pod nazvem optika1_uzivatel.ccl \n"); /*****************************************************************************************/ /* Zadana cviceni: */ /* *** 1. Rozsirte program o vypocet predmetove ohniskove vzdalenosti */ /* *** 2. Rozsirte program o vypocet polohy predmetoveho ohniska */ /* *** 3. Rozsirte program o vypocet pricneho meritka zvetseni */ /* *** 4. Rozsirte program o vypocet Lagrange-Helmholtzova invariantu */ }