/******************************************************************************* Moduli: muunnik.cpp Tarkoitus: Valmis luokka cMuunnettuIkkuna, jonka on tarkoitus helpottaa Windowsin ikkunaan piirtämistä. class cMuunnettuIkkuna{ HWND hwnd; -ikkunan kahva HPEN hpen,old; -kynä, jolla piirretään RECT Rct; -ikkunan koko cMatrix Origo; -siirretty keskipiste int xstep, xjako, yjako; -jakovälin pituus ja lukumäärät double fc,dx,dy; -pikselin kerroin, ikkunan puolikkaat cMatrix Muunnos, Apu; -kuvaus-, koordinaatiston piirtomatriisi int jako; -puolikkaan akselin jakovälien lukumäärä int kuva; -onko kuvaikkuna int aktiivinen; -kumpi ikkunoista on aktiivisena HDC hdc; -laiteyhteys } Projekti: Winlin, Cum laude approbatur -harjoitustyö Tekijät: Virpi Kivinen & Tiina Mäkinen Tehty: 1.1.96 Muutettu 1.7.96 Mitä muutettu: + lisättyyt Muutettu 8.8.96 Mitä muutettu: + HDC cMuunnettuIkkuna::Hdc(void),joka palauttaa hdc:n aseta_piirretaan(...) ja piirretaanko(...) poistettu tarpeettomina Puutteet: tarkistuksia metodeihin. verkko, jota tuskin kannattaa piirtää 3-ulotteisena (piirra_jako(...)) cMuunnettuIkkuna-luokan metodit: - int cMuunnettuIkkuna::aseta_hdc(HDC Hdc) Parametrina tuotu Hdc sijoitetaan luokan hdc:hen, jota k„ytet„„n kaikissa piirroissa. - int cMuunnettuIkkuna::aseta_jako(void) Tekee uuden Origo-matriisin (Origo siirtää origon ylänurkasta keskelle). - int cMuunnettuIkkuna::tarkistus(cVec &b) Tarkistetaan, onko vektorin viimeinen alkio 1. Jos ei, niin sill„ jaetaan kaikki vektorin alkiot. Jos se on nolla, niin muihin vektorin alkioihin sijoitetaan iso luku ja viimeiseen 1. T„m„ kaikki perspektiivi„ varten. - int cMuunnettuIkkuna::move(const cVec &y1) Siirt„„ kyn„n annettuun pisteeseen. Muuttaa sit„ varten y1:n pikse- leiksi. Vrt. MoveToEx - int cMuunnettuIkkuna::line(const cVec &y1) Vet„„ viivan t„h„n pisteeseen, muuttaa y1:n pikseleiksi. Vrt. LineTo - int cMuunnettuIkkuna::text(const cVec &y1,const char *s) s:ss„ oleva teksti kirjoitetaan koordinaatistoon vektorin y1 osoittamaan paikkaan. - int cMuunnettuIkkuna::line(const cJana &j) Piirret„„n jana j, jossa on alku- ja loppupiste reaalivektoreina. - double cMuunnettuIkkuna::Jako(void) Palauttaa luokan muuttujan jako. - int cMuunnettuIkkuna::Kuva(void) Palauttaa, onko ikkuna kuva- vai alkukuvaikkuna. - HWND cMuunnettuIkkuna::Kahva(void) Palauttaa ikkunan kahvan. - int cMuunnettuIkkuna::muuta_step(const int muutos) Muuttaa jakov„lin pituutta muutoksen verran. Tehd„„n, kun on zoomailtu kuvaikkunaa. - cMatrix cMuunnettuIkkuna::muunna(const cMatrix &H) Kertoo ikkunan matriisin (Muunnos) H:lla ja palauttaa entisen matriisin. - cMatrix cMuunnettuIkkuna::sijoita(cMatrix &A) Kertoo koordinaatistoon vaikuttavaa Apu-matriisia A:lla. Palauttaa vanhan Apu-matriisin. - cMatrix cMuunnettuIkkuna::yksikkom(void) Tekee Muunnos-matriisista yksikkömatriisin. Palauttaa vanhan Muunnos- matriisin. Kutsutaan ainakin koordinaatiston piirrossa, koska ne piirre- tään "suoraan" eikä kuvattuna. - cMatrix cMuunnettuIkkuna::yksikkokoord(void) Tekee Apu-matriisista yksikkömatriisin. Palauttaa vanhan Apu- matriisin. - int cMuunnettuIkkuna::kaanna_o(cMatrix &apu) K„„nt„„ matriisin, joka siirt„„ origon keskelle. Ei toimi muille matriiseille. - cVec cMuunnettuIkkuna::vektori_reaaliksi(cVec &a ) Tekee pikselivektorista reaalivektorin. - int cMuunnettuIkkuna::palauta(const cMatrix &A) Sijoittaa parametrina tuodun matriisin A Muunnos-matriisiin. - int cMuunnettuIkkuna::piirra_jako(const cVec &place,const int axel,const int verkko) Piirtää jakoviivat koordinaattiakseleihin. Jos verkko on valittuna menussa, niin tässä piirretään sekin. - int cMuunnettuIkkuna::koordinaatisto(const cVec &place, int axel, HPEN kyna,const int verkko) Piirtää axel:in osoittaman koordinaattiakselin. - void cMuunnettuIkkuna::luo_kyna(HPEN pen) Vaihtaa kynäksi parametrina tuodun pen-kynän. Laittaa vanhan talteen old:iin. - void cMuunnettuIkkuna::poista_kyna(void) Vaihtaa kynän takaisin old:ksi ja laittaa edellisen kynän hpen:iin. Tätä käytetään pareittain luo_kyna(...)-metodin kanssa. - int cMuunnettuIkkuna::aseta_aktiivinen(int a) Sijoittaa aktiiviseen a:n. - int cMuunnettuIkkuna::Aktiivinen(void) Palauttaa aktiivisen. Muut aliohjelmat: - int round(double d) Py”rist„„ reaaliluvun l„himp„„n kokonaislukuun. *************************************************************************/ #include #include #include #include"muunnik.h" int round(double d) { if ( d < 0 ) return (int)(d-0.5); return (int)(d+0.5); } int cMuunnettuIkkuna::aseta_hdc(HDC Hdc) { hdc=Hdc; return 0; } int cMuunnettuIkkuna::aseta_jako(void) { GetClientRect(hwnd,&Rct); dx=Rct.right/2; dy=Rct.bottom/2; xjako=dx/xstep; yjako=dy/(fc*xstep); if (xjako > yjako) jako = yjako; else jako = xjako; Origo.tee_muunnos(xstep,dx,dy,fc); return 0; } int cMuunnettuIkkuna::tarkistus(cVec &b) //perspektiivi: b[3]!=1 { int i; if(-EPSILON RE = (O) x Pix kaanna_o(apu); return (apu *a ); } int cMuunnettuIkkuna::palauta(const cMatrix &A) { Muunnos=A; return 0; } int cMuunnettuIkkuna::piirra_jako(const cVec &place,const int axel,const int verkko) { int i; cVec apu; HPEN hpen=CreatePen(PS_SOLID,1,RGB(80,80,80)); switch (axel){ case 0: for(i=-jako;i<=jako;i++){ apu[0]=(double)i; apu[1]=place[1]-0.2; if(verkko) { if (apu[0]==place[0]) continue; apu[1]=jako; luo_kyna(hpen); move(apu); apu[1]=-jako; line(apu); poista_kyna(); } else { move(apu); apu[1]+=0.4; line(apu); } } break; case 1: for(i=-jako;i<=jako;i++){ apu[1]=(double)i; apu[0]=place[0]-0.2; if(verkko) { if (apu[1]==place[1]) continue; apu[0]=jako; luo_kyna(hpen); move(apu); apu[0]=-jako; line(apu); poista_kyna(); } else { move(apu); apu[0]+=0.4; line(apu); } } break; case 2: for(i=-jako;i<=jako;i++){ apu[0]=place[0]; apu[1]=place[1]-0.2; apu[2]=(double)i; if(verkko) { luo_kyna(hpen); if (apu[2]==place[2]) continue; apu[1]=jako; move(apu); apu[1]=-jako; line(apu); #if 0 //jumalaton kökkökasahan tästäkin tulisi??!!!! EI käy! int j,k; for (j=-jako;j<=jako;j++) { for (k=-jako;k<=jako;k++){ if (apu[2]==place[2]) continue; apu[1]=j; apu[0]=k; move(apu); apu[1]=jako; line(apu); } } apu[1]=(double)i; for (j=-jako;j<=jako;j++) { for (k=-jako;k<=jako;k++){ if (apu[1]==place[1]) continue; apu[2]=j; apu[0]=k; move(apu); apu[2]=jako; line(apu); } } for (j=-jako;j<=jako;j++) { for (k=-jako;k<=jako;k++){ if (apu[0]==place[0]) continue; apu[0]=-jako; apu[1]=j; apu[2]=k; move(apu); apu[0]=jako; line(apu); } } #endif poista_kyna(); } else { move(apu); apu[1]+=0.4; line(apu); } } break; } DeleteObject(hpen); return 0; } int cMuunnettuIkkuna::koordinaatisto(const cVec &place, int axel, HPEN kyna,const int verkko) { cMatrix B; luo_kyna(kyna); switch (axel) { case 0: B=yksikkom(); move(cVec(place[0]-(double)jako-1.0,place[1])); line(cVec(place[0]+(double)jako+1.0,place[1])); text(cVec(place[0]+(double)jako+1.0,place[1]),"x"); // if (verkko) palauta(B); //halutaanko muka muuttaa akselien väliset kulmatki ?!!!! piirra_jako(place,axel,verkko); //HULLUTUSTA!!!!!! // if (!verkko) palauta(B); palauta(B); break; case 1: B=yksikkom(); move(cVec(place[0],place[1]-(double)jako-1.0)); line(cVec(place[0],place[1]+(double)jako+1.0)); text(cVec(place[0],place[1]+(double)jako+1.0),"y"); // if (verkko) palauta(B); piirra_jako(place,axel,verkko); // if (!verkko) palauta(B); palauta(B); break; case 2: B=yksikkom(); move(cVec(place[0],place[1],place[2]-(double)jako-1.0)); line(cVec(place[0],place[1],place[2]+(double)jako+1.0)); text(cVec(place[0],place[1],place[2]+(double)jako+1.0),"z"); // if (verkko)palauta(B); piirra_jako(place,axel,verkko); // if (!verkko) palauta(B); palauta(B); break; } poista_kyna(); return 0; } void cMuunnettuIkkuna::luo_kyna(HPEN pen) { old=(HPEN)SelectObject(hdc,pen); } void cMuunnettuIkkuna::poista_kyna(void) { hpen=(HPEN)SelectObject(hdc,old); } int cMuunnettuIkkuna::Aktiivinen(void) { return aktiivinen; } int cMuunnettuIkkuna::aseta_aktiivinen(int a) { aktiivinen=a; return 0; }