Лабораторная работа #3

29. October 2009

Построение графика заданной функции в указанном диапазоне.

Цель: Разработать алгоритм и программу решения прикладной задачи – построение графика заданной функции. Научиться переводить декартовые координаты в экранные.

Задача : Построить график функции 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 .

Тогда экранные координаты точки М могут быть выражены следующим образом:

CG_lab_3_clip_image002

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

CG_lab_3_clip_image004

CG_lab_3_clip_image005

Построение графика функции.

Уравнение параболы: image002

В диапозоне: image004.

При том, image006 – переменные.

 

Программирование.

Введение.

Программа написана на языке 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();

}

}
}

Демонстрация

Исходные коды можно найти: здесь

Компьютерная графика, математика, JonyRock, .NET , ,

Comments

Елена
Елена
5/21/2010 3:16:13 PM #
Прости ты не мог бы перезалить исходный код, он не качается. Заранее спасибо.