BME MOGI Gépészeti informatika 15. 1. feladat Készítsen alkalmazást a y=2*sin(3*x-π/4)-1 függvény ábrázolására a [-2π; 2π] intervallumban 0,1-es lépésközzel! Ezen az intervallumon a függvény értékkészlete [-3; 1]. Rajzolja ki a koordináta-tengelyeket is! A rajzolás a formon 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! Biztosítsa a kép helyes megjelenését a form átméretezése Megoldási mód: Windows Forms alkalmazás Oktatási cél: A grafikus megjelenítés gyakorlása Az elkészítendő form: A Form1 osztályba írandó programkód: const float ymin = -3, ymax = 1; // értékkészlet const float xmin = (float)(-2 * Math.PI), xmax = (float)(2 * Math.PI); // értelmezési tartomány const float lépés = 0.01F; Color rajzszín = Color.Green; bool rajzoljon = false; private float Fv(float x) return (float)(2 * Math.Sin(3 * x - Math.PI / 4) - 1); private void Form1_Paint(object sender, PaintEventArgs e) if (rajzoljon) float képmagasság = ClientSize.Height; // rajzterület magassága float képszélesség = ClientSize.Width; // rajzterület szélessége 1
// 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); // Koordinata-tengelyek kirajzolása Graphics g = e.graphics; Pen toll = new Pen(rajzSzín, 1); g.drawline(toll, xképorigó + xfaktor * xmin, yképorigó, xképorigó + xfaktor * xmax, yképorigó); g.drawline(toll, xképorigó, yképorigó - yfaktor * ymin, xképorigó, yképorigó - yfaktor * ymax); // függvény rajzolása PointF pelozo = new PointF(xKépOrigó + xmin * xfaktor, yképorigó - Fv(xMin) * yfaktor); PointF pkovetkezo = new PointF(); for (float x = xmin; x <= xmax; x += lépés) pkovetkezo.x = xképorigó + x * xfaktor; pkovetkezo.y = yképorigó - Fv(x) * yfaktor; g.drawline(toll, pelozo, pkovetkezo); pelozo = pkovetkezo; private void Form1_Click(object sender, EventArgs e) rajzoljon =!rajzoljon; private void Form1_Resize(object sender, EventArgs e) 2. feladat Írjon alkalmazást az Arkhimédészi spirál kirajzolására! Az ábrázolandó függvény polárkoordinátás alakja r = a * alfa Az a paraméter értéke legyen 2! A függvényt a [0; 4*π] intervallumban rajzolja ki, a lépésköz π/32 legyen! Határozza meg a Descartes-féle koordináta-rendszerbe történő transzformálás során a megjelenítendő függvény értelmezési tartományát és értékkészletét! Készítsen menüt, a Fájl menüelemnek egyetlen menüpontja legyen a Kilépés, mely az alkalmazásból való kilépést teszi lehetővé! A Grafika menüpontban biztosítsa a véletlen rajzszín választását és a függvénygörbe kirajzolását, illetve a függvénygörbe törlését! Megoldási mód: Windows Forms alkalmazás 2
Oktatási cél: polárkoordináta-rendszerben megadott függvény rajzolásának és menü használatának bemutatása Az elkészítendő form: A Form1 osztályba írandó programkód: const float a = 2F; Color rajzszín = Color.Green; bool rajzoljon = false; float ymin = 0, ymax = 0; // értékkészlet float xmin = 0, xmax = 0; // értelmezési tartomány float lépés = (float)(math.pi / 32); private float R(float a, float alfa) return a * alfa; private void kilépéstoolstripmenuitem_click(object sender, EventArgs e) Close(); private void Form1_Paint(object sender, PaintEventArgs e) if (rajzoljon) // rajzterület magassága float magasság = ClientSize.Height - menustrip1.height; // rajzterület szélessége float szélesség = ClientSize.Width; float faktor = Math.Min(szélesség / Math.Abs(xMax - xmin), magasság / Math.Abs(yMax - ymin)); float xképorigó = faktor * Math.Abs(xMin); float yképorigó = menustrip1.height + faktor * Math.Abs(yMax); // Koordinata-tengelyek kirajzolása 3
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); // függvény rajzolása PointF pelozo = new PointF(xKépOrigó + R(a, 0) * (float)math.cos(0) * faktor, yképorigó - R(a, 0) * (float)math.sin(0) * faktor); PointF pkovetkezo = new PointF(); for (float alfa = 0 + lépés; alfa <= 4 * Math.PI + 0.001; alfa += lépés) pkovetkezo.x = xképorigó + R(a, alfa) * (float)math.cos(alfa) * faktor; pkovetkezo.y = yképorigó - R(a, alfa) * (float)math.sin(alfa) * faktor; g.drawline(toll, pelozo, pkovetkezo); pelozo = pkovetkezo; private void Form1_Load(object sender, EventArgs e) // a befoglaló téglalap koordinátáinak meghatározása float x, y; // a befoglaló téglalap koordinátái xmin = ymin = float.maxvalue; xmax = ymax = float.minvalue; for (float alfa = 0; alfa <= 4 * Math.PI; alfa += lépés) x = (float)(r(a, alfa) * Math.Cos(alfa)); y = (float)(r(a, alfa) * Math.Sin(alfa)); if (x < xmin) xmin = x; if (x > xmax) xmax = x; if (y < ymin) ymin = y; if (y > ymax) ymax = y; e) private void véletlenrajzszíntoolstripmenuitem_click(object sender, EventArgs Random rnd = new Random(); rajzszín = Color.FromArgb(rnd.Next(256), rnd.next(256), rnd.next(256)); 4
private void rajzolástoolstripmenuitem_click(object sender, EventArgs e) rajzoljon =!rajzoljon; private void Form1_Resize(object sender, EventArgs e) 5
Gyakorló feladatok - 1. Készítsen alkalmazást a következő függvény kirajzolására! y=1/(x 2-5*x+6) A függvény nem értelmezett az x=2 és x=3 pontokban, ezekben a pontokban rajzoljon az y- tengellyel azonos hosszúságú, függőleges, szaggatott egyenest! A függvényt a [-3; 1,9], a [2,1; 2,9] és a [3,1; 6] intervallumon ábrázolja, a lépésköz 0,1 legyen! A rajzolás a formon 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! 2. Írjon alkalmazást az alábbi függvény kirajzolására! y=x 2-1/x A függvény nincs értelmezve az x=0 helyen, ezért a görbét a [-3; -0,1] és a [0,1; 3] intervallumokban rajzolja ki 0,1-es lépésközzel! A függvénygörbe az y-tengelyt és az y=x 2 görbét közelíti, ezeket a görbéket is jelenítse meg szaggatott vonallal, fekete színnel! A rajzolást és a form törlését egy Rajzol feliratú gombbal biztosítsa! Minden rajzolás kezdetekor generáljon véletlen színt a megjelenítéshez! 6
3. Készítsen alkalmazást a függvény kirajzolására! y=sin(x)/x A függvény nincs értelmezve az x=0 helyen, ezért a görbét a [-3π; -π/32] és a [π/32; 3π] intervallumokban rajzolja ki π/32-es lépésközzel! A függvény szakadásának jelzésére a (0;1) pontban rajzoljon egy 5 pixel sugarú, kifestett kört! Készítsen menüt, a Műveletek menüelemnek három menüpontja legyen! A Rajzszín menüpontban biztosítsa a véletlen rajzszín választását, a Rajzolás menüpontban a függvénygörbe kirajzolását, illetve a függvénygörbe törlését, a Kilépés menüpontban pedig az alkalmazásból való kilépést tegye lehetővé! 7
4. Írjon alkalmazást a rozetta kirajzolására! Az ábrázolandó függvény polárkoordinákkal megadott alakja r=a/2*sin(2*alfa) Az a paraméter értéke legyen 2! A függvényt a [0; 2*π] intervallumban rajzolja ki, a lépésköz π/32 legyen! Határozza meg a Descartes-féle koordináta-rendszerbe történő transzformálás során a megjelenítendő függvény értelmezési tartományát és értékkészletét! A Rajzszín gombbal tegye lehetővé a véletlen rajzszín választását! A függvénygörbe kirajzolását, illetve a függvénygörbe törlését egy Rajzolás gombbal biztosítsa! 8