//--------------------------------------------------------------------------- // osuuko.cpp // // Ohjelmalla tutkitaan piste johonkin kuvioon joukossa. // // Vesa Lappalainen 1.3.2001 /* Suunnitelma: Ohjelmalla tutkitaan piste johonkin kuvioon joukossa. Syötä kuviot: L = lopeta kuvioiden syöttö 1 = ympyrä 2 = neliö Valitse kuvio: 1 Anna ympyrän säde>2[ret] Anna keskipiste >3 4[ret] Lisäsit kuvion Ympyrä: säde 2: keskipiste (3,4) L = lopeta kuvioiden syöttö 1 = ympyrä 2 = neliö Valitse kuvio: 2 Anna neliön säde>3[ret] Anna keskipiste >5 6[ret] Lisäsit kuvion Neliö: säde 3: keskipiste (5,6) L = lopeta kuvioiden syöttö 1 = ympyrä 2 = neliö Valitse kuvio: L Anna tutkittava piste>1.5 4[ret] Piste (1.5,4) osuu kuvioon Ympyrä: säde 2: keskipiste (3,4) Anna tutkittava piste>4 4[ret] Piste (4,4) osuu kuvioon Ympyrä: säde 2: keskipiste (3,4) Piste (4,4) osuu kuvioon Neliö: säde 3: keskipiste (5,6) Anna tutkittava piste>[ret] Anna tutkittava piste>1 1[ret] Piste (1,1) ei osu yhteenkään kuvioon! Kiitoksia!! Tietorakenteet: cNaytto cKuviot |--------| |----------| <--------------------------|- o | | | | ------ | | 6 | max_lkm | |3,4 | | cPiste | 2 | lkm |--------| | | | o | alkiot |----------| | | | v cYmpyra |----------| |-------| 0 | o----+---------> | 2 | |----------| | 3,4 | cPiste 1 | o----+-----| |-------| |----------| | cNelio 2 | | | |-------| |----------| ------------------->| 3 | 3 | | | 5,6 | cPiste |----------| |-------| 4 | | |----------| 5 | | |----------| cKuviot - tallettaa kuvioita (lisää yms...) - etsi kuvio johon piste osuu cNaytto - hoitaa yhteistyön käyttäjään cPiste - osaa muuttaa merkkijonon pisteeksi cYmpyra - kp, säde - osuuko piste ympyrään cNelio - kp, säde - osuuko piste neliöön */ #include #include #include #include #include "ioali.h" #include "dosout.h" using namespace std; //--------------------------------------------------------------------------- class cPiste{ double x,y; public: cPiste(double ix=0,double iy=0) : x(ix), y(iy) { } void setAsString(const string &s); string getAsString() const; double etaisyys(const cPiste &piste) const { return sqrt((x-piste.x)*(x-piste.x) + (y-piste.y)*(y-piste.y)); } }; void cPiste::setAsString(const string &s) // kaivaa jonosta 3 4 arvoit x:lle ja y:lle { char apu[10]; sscanf(s.c_str(),"%lf%1[ ,]%lf",&x,apu,&y); } string cPiste::getAsString() const { char s[80]; sprintf(s,"(%lg,%lg)",x,y); return string(s); } class cNaytto { cPiste piste; public: cNaytto() {} void kysy_kuviot(); void kysele_pisteita(); void ohjeet() const { cout << "Ohjelmalla tutkitaan piste johonkin kuvioon joukossa." << endl; } void kiitokset() const { cout << "Kiitoksia!!" << endl; } }; void cNaytto::kysy_kuviot() { cout << "Syötä kuviot:\n"; while (1 ) { cout << "\n"; cout << " L = lopeta kuvioiden syöttö\n"; cout << " 1 = ympyrä\n"; cout << " 2 = neliö\n"; cout << "\n"; cout << " Valitse kuvio:"; char nappain = odota_nappain("L12",'L',MERKKI_ISOKSI); switch ( nappain ) { case 'L': return; case '1': break; case '2': break; } cout << "\n\n"; cout << "Lisäsit kuvion Ympyrä: säde 2: keskipiste (3,4)\n"; } } void cNaytto::kysele_pisteita() { } class cKuvio { protected: double r; cPiste kp; public: cKuvio() { r = 1; } void setR(double ir) { if ( ir >= 0 ) r = ir; } void setKP(const cPiste &piste) { kp = piste; } string getAsString() { char s[200]; sprintf(s,": säde %lg: keskipiste ",r); return getNimi() + string(s) + kp.getAsString(); } virtual string getNimi() const { return "Kuvio"; } virtual bool osuuko(const cPiste &piste) { double etaisyys = kp.etaisyys(piste); return etaisyys <= r; } }; class cYmpyra : public cKuvio { public: virtual string getNimi() const { return "Ympyrä"; } }; class cNelio : public cKuvio { public: virtual string getNimi() const { return "Neliö"; } virtual bool osuuko(const cPiste &piste) { // ht double etaisyys = kp.etaisyys(piste); return etaisyys <= 2*r; // WWW } }; class cKuviot { int max_lkm; int lkm; cKuvio **kuviot; public: cKuviot(int imax) { max_lkm = imax; lkm = 0; kuviot = new cKuvio *[max_lkm]; } ~cKuviot() {} // HT string lisaa(cKuvio *kuvio) { if ( lkm >= max_lkm ) return "Ei mahu"; kuviot[lkm] = kuvio; lkm++; return ""; } }; int main(void) { cPiste piste; cNelio *kuvio; cKuviot kuviot(6); kuvio = new cNelio; string nimi = kuvio->getNimi(); // ympyrä string jono; double r; cout << "Anna " << nimi << "n säde>"; getline(cin,jono); sscanf(jono.c_str(),"%lf",&r); kuvio->setR(r); cout << "Anna keskipiste >"; getline(cin,jono); piste.setAsString(jono); kuvio->setKP(piste); cout << "Lisäsit kuvion " << kuvio->getAsString() << "\n"; kuviot.lisaa(kuvio); cPiste origo; #if 0 bool osuma = ympyra.osuuko(origo); cout << "Osuma " << osuma << "\n"; // Ympyrä: säde 2: keskipiste (3,4) #endif #if 0 string s = "3 4"; string s2; piste.setAsString(s); // => piste on 3,4 s2 = piste.getAsString(); // => s2 = (3,4) cout << "Piste " << s2 << "\n"; #endif #if 0 cNaytto naytto; naytto.ohjeet(); naytto.kysy_kuviot(); naytto.kysele_pisteita(); naytto.kiitokset(); #endif return 0; } //--------------------------------------------------------------------------- /* piste.AsString = "3,4"; s = piste.AsString; */