Построение графика заданной функции в указанном диапазоне.
Цель: Разработать алгоритм и программу решения прикладной задачи – построение графика заданной функции. Научиться переводить декартовые координаты в экранные.
Задача : Построить график функции y = Ax 2 + Bx + C в диапазоне ( x min , y min ) – ( x max , y max ). Постоянные А, В, С, x min , y min , x max , y max вводятся через пользовательский интерфейс.
Математическая модель.
Перевод из декартовой системы координат в экранную.
Рассмотрим точку М, координаты которой в декартовой системе координат ( x , y ). Координаты данной точки в экранной системе координат ( x sc , y sc ).
Пусть на экране (на поверхности графического объекта) отображается область, размеры которой в декартовой с.к. ( x min , y min ) – ( x max , y max ). Если графический объект использует в качестве поверхности для рисования объект PictureBox , то ширина данной области в экранной системе координат PictureBox . Width , а высота – PictureBox . Height .
Тогда экранные координаты точки М могут быть выражены следующим образом:

где k x и k y – коэффициенты масштабирования по Ox и Oy соответственно.


Построение графика функции.
Уравнение параболы: 
В диапозоне:
.
При том,
– переменные.
Программирование.
Введение.
Программа написана на языке C# в среде программирование Visual Studio. Далее не учитывается код программы, отвечающий за инициализацию программы и код дизайна элементов формы.
Код программы.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace paint {
public partial class Form1 : Form {
Bitmap graphMap;
Graphics graphGraphics;
Pen basicsPen;
Pen graphPen;
Brush basicsBackgroundBrush;
float graphScale;
float graphMin;
float graphMax;
int middleY;
int middleX;
int bufferX;
int bufferY;
bool moveMiddle;
int funcA;
int funcB;
int funcC;
bool funcChecked;
public Form1() {
InitializeComponent();
basicsPen = new Pen(Color.Gray,1);
basicsBackgroundBrush = Brushes.White;
graphPen = new Pen(Color.Black,2.5f);
graphScale = 1.5f;
middleY = form_Picture.Height / 2;
middleX = form_Picture.Width / 2;
graphMin = -200;
graphMax = 200;
moveMiddle = false;
funcChecked = false;
this.MouseWheel += new MouseEventHandler(form_Picture_MouseWheel);
}
private void Form1_Load(object sender, EventArgs e) {
CreateBasicsGrapf();
}
private void CreateBasicsGrapf() {
graphMap = new Bitmap(form_Picture.Width, form_Picture.Height);
form_Picture.Image = graphMap;
graphGraphics = Graphics.FromImage(graphMap);
graphGraphics.FillRectangle(basicsBackgroundBrush, 0, 0, graphMap.Width, graphMap.Height);
graphGraphics.DrawLine(basicsPen,0,middleY,graphMap.Width,middleY);
graphGraphics.DrawLine(basicsPen, middleX, 0, middleX, graphMap.Height);
for (int i = -150; i < 150; i+=1) {
graphGraphics.DrawLine(basicsPen,
middleX + i * graphScale,
middleY - 2,
middleX + i * graphScale,
middleY + 2
);
}
for (int i = -150; i < 150; i += 1) {
graphGraphics.DrawLine(basicsPen,
middleX - 2 ,
middleY + i * graphScale,
middleX + 2,
middleY + i * graphScale
);
}
}
private void CreateParaballa() {
if (funcChecked) {
float x_1 = graphMin;
float y_1 = Function(x_1);
float x = 0;
float y = 0;
PointF prev = new PointF(x_1 * graphScale, y_1 * graphScale);
PointF next = new PointF(x, y);
for (float i = x_1; i < graphMax; i += 0.1f) {
x = i;
y = Function(x);
prev.X = (middleX + x_1 * graphScale);
prev.Y = (middleY - y_1 * graphScale);
next.X = (middleX + x * graphScale);
next.Y = (middleY - y * graphScale);
graphGraphics.DrawLine(graphPen, prev, next);
x_1 = x;
y_1 = y;
}
}
}
private void Zoom(bool zoomIn) {
if (zoomIn) {
graphScale += 2.5f;
CreateBasicsGrapf();
CreateParaballa();
}
if (!zoomIn && graphScale > 2.5) {
graphScale -= 2.5f;
CreateBasicsGrapf();
CreateParaballa();
}
}
void form_Picture_MouseWheel(object sender, MouseEventArgs e) {
if (e.X > form_Picture.Left && e.X < form_Picture.Left + form_Picture.Width
&& e.Y > form_Picture.Top && e.Y < form_Picture.Top + form_Picture.Height) {
if (e.Delta > 0) {
Zoom(true);
} else {
Zoom(false);
}
}
}
private void form_Picture_MouseUp(object sender, MouseEventArgs e) {
moveMiddle = false;
}
private void form_Picture_MouseDown(object sender, MouseEventArgs e) {
bufferX = e.X;
bufferY = e.Y;
moveMiddle = true;
}
private void form_Picture_MouseMove(object sender, MouseEventArgs e) {
if (moveMiddle) {
middleX += e.X - bufferX;
middleY += e.Y - bufferY;
bufferX = e.X;
bufferY = e.Y;
CreateBasicsGrapf();
CreateParaballa();
}
}
private void button1_Click(object sender, EventArgs e) {
try {
funcA = Int32.Parse(maskedTextBox1.Text);
funcB = Int32.Parse(maskedTextBox2.Text);
funcC = Int32.Parse(maskedTextBox3.Text);
funcChecked = true;
CreateBasicsGrapf();
CreateParaballa();
} catch {
funcChecked = false;
}
}
private float Function(float x) {
return funcA * x * x + funcB * x + funcC;
}
private void form_Picture_SizeChanged(object sender, EventArgs e) {
CreateBasicsGrapf();
CreateParaballa();
}
}
}
Демонстрация
Исходные коды можно найти: здесь
e06e8ac0-fc67-474d-98c6-d5d30d3624da|4|4.8
Компьютерная графика, математика, JonyRock, .NET
c#, графика, gdi+