BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra 1. feladat Készítsen alkalmazást az = + függvény ábrázolására! Az értelmezési tartomány a [-6;5] intervallum, a lépésköz 0,1 legyen! Írjon metódust a függvény adott x helyen felvett értékének kiszámítására! A függvény értékkészletét az adott intervallumon a rajzolás megkezdése előtt határozza meg! A koordinátatengelyeken egyforma skálázást használjon (azonos faktor értékek)! A formon történő kattintásra állítson be véletlen rajzszínt! A rajzolás egy gombon történő kattintásra történjen, egy újabb kattintás a rajzolás végét és a form törlését jelentse! A függvény számított pontjainak koordinátáit írja ki a pontok.txt szöveges állományba, soronként egy-egy (X, Y) értékpárt, pontosvesszővel tagolva! Megoldási mód: Windows Forms alkalmazás A függvény képe: A Form1 osztályba írandó programkód: // értékkészlet float ymin = 0F, ymax = 0F; // értelmezési tartomány float xmin = -6F, xmax = 5F; const float lépés = 0.1F; 1
Color rajzszín = Color.Red; bool rajzoljon = false; // Metódus a függvényértékek kiszámítására private float Fv(float x) return (float)(math.pow(x + 3, 2) - 5 * x - 10); // A form betöltésekor hívódó eseménykezelő private void Form1_Load(object sender, EventArgs e) // fájl megnyitása írásra StreamWriter ki = new StreamWriter("pontok.txt"); float x, y; // a befoglaló téglalap y-koordinátáinak megkeresése ymin = float.maxvalue; ymax = float.minvalue; for (x = xmin; x <= xmax; x += lépés) y = Fv(x); if (y < ymin) ymin = y; if (y > ymax) ymax = y; // fájlba írás ki.writeline("0;1", x, y); // fájl lezárása ki.close(); // A formon való kattintás eseménykezelője private void Form1_Click(object sender, EventArgs e) // véletlen rajzszín generálása Random rnd = new Random(); rajzszín = Color.FromArgb(rnd.Next(256), rnd.next(256), rnd.next(256)); // A form újrarajzolását végző eseménykezelő metódus private void Form1_Paint(object sender, PaintEventArgs e) if (rajzoljon) // rajzterület magassága float képmagasság = ClientSize.Height; // rajzterület szélessége float képszélesség = ClientSize.Width; // a sík ablakba vetítéséhez x- és y-irányban float xfaktor = képszélesség / Math.Abs(xMax - xmin), yfaktor = képmagasság / Math.Abs(yMax - ymin); float faktor = Math.Min(xFaktor, yfaktor); // az origó koordinátái az ablakban float xképorigó = faktor * Math.Abs(xMin); float yképorigó = képmagasság - faktor * Math.Abs(yMin); 2
// a koordinata-tengelyek kirajzolása Graphics g = e.graphics; Pen toll = new Pen(rajzSzín, 1); g.drawline(toll, xképorigó + faktor * xmin, yképorigó, xképorigó + faktor * xmax, yképorigó); g.drawline(toll, xképorigó, yképorigó - faktor * ymin, xképorigó, yképorigó - faktor * ymax); // a függvény rajzolása PointF pelozo = new PointF(xKépOrigó + xmin * faktor, yképorigó - Fv(xMin) * faktor); PointF pkovetkezo = new PointF(); for (float x = xmin + lépés; x <= xmax; x += lépés) pkovetkezo.x = xképorigó + x * faktor; pkovetkezo.y = yképorigó - Fv(x) * faktor; g.drawline(toll, pelozo, pkovetkezo); pelozo = pkovetkezo; // Az ablak átméretezésekor hívódó eseménykezelő private void Form1_Resize(object sender, EventArgs e) // újrarajzolás kérése ablak átméretezésekor // A Rajzolás gomb megnyomásának eseménykezelője private void button1_click(object sender, EventArgs e) // rajzolás vagy törlés kezdeményezése rajzoljon =!rajzoljon; 2. feladat A függvény.txt állomány egy negyedfokú polinom-függvény ( y = x 4 + x 3-5x 2 5x +1 ) pontjainak (legfeljebb 200 pont) koordinátáit tartalmazza, soronként egy (x,y) értékpárt pontosvesszővel tagolva, az x-koordinátákra növekvően rendezve. Olvassa be az állományból a koordinátákat egy-egy valós tömbbe, és rajzolja ki a függvényt! A függvény értékkészletének határait a tárolt intervallumon a form betöltésekor határozza meg! A koordináta-tengelyeken eltérő skálázást használjon (különböző faktor értékek)! A rajzolás megkezdése előtt állítson be véletlen rajzszínt! A rajzolás egy gombon történő kattintásra történjen, egy újabb kattintás a rajzolás végét és a form törlését jelentse! Megoldási mód: Windows Forms alkalmazás 3
A függvény képe: A Form1 osztályba írandó programkód: // értékkészlet float ymin = 0F, ymax = 0F; // értelmezési tartomány float xmin = 0F, xmax = 0F; const float lépés = 0F; Color rajzszín = Color.Red; bool rajzoljon = false; float[] x = new float[200]; float[] y = new float[200]; int n = 0; // a tárolt pontok száma Random rnd = new Random(); // A form újrarajzolását végző eseménykezelő metódus private void Form1_Paint(object sender, PaintEventArgs e) if (rajzoljon) // rajzszín beállítása rajzszín = Color.FromArgb(rnd.Next(256), rnd.next(256), rnd.next(256)); // rajzterület magassága float képmagasság = ClientSize.Height; // rajzterület szélessége float képszélesség = ClientSize.Width; // a sík ablakba vetítéséhez x- és y-irányban float xfaktor = képszélesség / Math.Abs(xMax - xmin), yfaktor = képmagasság / Math.Abs(yMax - ymin); // az origó koordinátái az ablakban float xképorigó = xfaktor * Math.Abs(xMin); float yképorigó = képmagasság - yfaktor * Math.Abs(yMin) ; // a koordinata-tengelyek kirajzolása Graphics g = e.graphics; Pen toll = new Pen(rajzSzín, 1); g.drawline(toll, xképorigó + xfaktor * xmin, yképorigó, 4
xképorigó + xfaktor * xmax, yképorigó); g.drawline(toll, xképorigó, yképorigó - yfaktor * ymin, xképorigó, yképorigó - yfaktor * ymax); // a függvény rajzolása PointF pelozo = new PointF(xKépOrigó + x[0] * xfaktor, yképorigó - y[0] * yfaktor); PointF pkovetkezo = new PointF(); for (int i = 1; i < n; i++) pkovetkezo.x = xképorigó + x[i] * xfaktor; pkovetkezo.y = yképorigó - y[i] * yfaktor; g.drawline(toll, pelozo, pkovetkezo); pelozo = pkovetkezo; // Az ablak átméretezésekor hívódó eseménykezelő private void Form1_Resize(object sender, EventArgs e) // A Rajzolás gomb megnyomásának eseménykezelője private void button1_click(object sender, EventArgs e) rajzoljon =!rajzoljon; // A form betöltésekor hívódó eseménykezelő private void Form1_Load(object sender, EventArgs e) // olvasás fájlból, a fájl végéig StreamReader be = new StreamReader("függvény.txt"); while (n<200 && be.peek()>-1) string[] puffer = be.readline().split (';'); x[n] = float.parse(puffer[0]); y[n] = float.parse(puffer[1]); n++; be.close(); // értelmezési tartomány meghatározása xmin = x[0]; xmax = x[n - 1]; // értékkészlet meghatározása ymin = float.maxvalue; ymax = float.minvalue; for (int i = 0; i < n; i++) if (y[i] < ymin) ymin = y[i]; if (y[i] > ymax) ymax = y[i]; 5
3. feladat önálló munka Oldjon meg egy feladatot önálló munkavégzés keretében az alább felsorolt feladatok közül! Gyakorló feladatok - függvényábrázolás 1. Készítsen alkalmazást az = + + függvény ábrázolására a [-0,55; 10] intervallumban 0,1-es lépésközzel! Írjon metódust a függvény adott x helyen felvett értékének kiszámítására! A függvény értékkészletét ezen az intervallumon a form betöltésekor határozza meg! A koordináta-tengelyeken egyforma skálázást használjon (azonos faktor értékek)! A formon történő kattintásra állítson be véletlen rajzszínt! A rajzolás egy gombon történő kattintásra történjen, egy újabb kattintás a rajzolás végét és a form törlését jelentse! Írja ki a pontok.txt szöveges állományba az ábrázolás során meghatározott pontok koordinátáit, soronként egy pontét, pontosvesszővel tagolva! 2. Készítsen alkalmazást az = + + függvény ábrázolására a [-2; 10] intervallumban 0,1-es lépésközzel! Írjon metódust a függvény adott x helyen felvett értékének kiszámítására! A függvény értékkészletét ezen az intervallumon a form betöltésekor határozza meg! A koordináta-tengelyeken eltérő skálázást használjon (különböző faktor értékek)! Egy gombra történő kattintáskor állítson be véletlen rajzszínt! A rajzolás a formra történő kattintásra történjen, egy újabb kattintás a rajzolás végét és a form törlését jelentse! Írja ki a pontok.txt szöveges állományba az ábrázolás során meghatározott pontok koordinátáit, soronként egy pontét, pontosvesszővel tagolva! 6
3. Készítsen alkalmazást az =, függvény ábrázolására a [-3π/2; 5π/2] intervallumban π/32-es lépésközzel! Írjon metódust a függvény adott x helyen felvett értékének kiszámítására! Készítsen menüt a Rajzszín és Rajzolás menüelemekkel! A függvény értékkészletét ezen az intervallumon a form betöltésekor határozza meg! A koordináta-tengelyeken egyforma skálázást használjon (azonos faktor értékek)! A Rajzszín menüpontra kattintáskor állítson be véletlen rajzszínt! A rajzolás a Rajzolás menüpontra kattintáskor történjen, egy újabb kattintás a rajzolás végét és a form törlését jelentse! Írja ki a pontok.txt szöveges állományba az ábrázolás során meghatározott pontok koordinátáit, soronként egy pontét, pontosvesszővel tagolva! 7