Консультация № 35771
20.02.2006, 02:27
0.00 руб.
0 2 2
Здравствуйте, Уважаемые эксперты!

Как на координатной сетке приведенной в приложении построить график какой-нибудь функции, т.е. можно ли использовать координатную сетку в виде шаблона для построения разных графиков функций. (для координатной сетки необходимо наличие всех 4-х четвертей, все остальное не так важно)
Приводить примеры построения графиков функций с использованием 1-й, 2-х четвертей не надо.


Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(TForm) procedure FormPaint(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormPaint(Sender: TObject);var x0,y0:integer; // координаты начала координатных осей dx,dy:integer; // шаг координатной сетки (в пикселах) x,y:integer; lx,ly:real; // метки (оцифровка) линий сетки по X и Y dlx,dly:real; // шаг меток (оцифровки) линий сетки по X и Ybegin x0:=form1.Width div 2; // оси начинаются в центре form1 y0:=form1.Height div 2; dx:=40; dy:=40; // шар координатной сетки 40 пикселов dlx:=1.0; // шаг меток оси X dly:=1.0; // шаг меток оси Y with form1.Canvas do begin MoveTo(x0,y0); LineTo(x0,0); // ось Y+ MoveTo(x0,y0); LineTo(x0,form1.Height); // ось Y- MoveTo(x0,y0); LineTo(form1.Width,y0); // ось X+ MoveTo(x0,y0); LineTo(0,y0); // ось X- TextOut(x0-12,y0+4,‘0‘); // выводим 0 в точке пересечения осей // засечки, сетка и оцифровка по оси X+ x:=x0+dx; // переходим на место 1-й засечки на оси X+ lx:=dlx; // 1-я метка - единица repeat MoveTo(x,y0-3);LineTo(x,y0+3); // засечка TextOut(x-8,y0+5,FloatToStr(lx)); // оцифровка Pen.Style:=psDot; // линия - штрихпунктирная MoveTo(x,0);LineTo(x,form1.Height); // линия сетки lx:=lx+dlx; // увеличиваем метку на шаг x:=x+dx; // переходим к следующей засечке until (x>form1.Width); // засечки, сетка и оцифровка по оси X- lx:=0; // обнуляем метку lx:=lx-dlx; // теперь метки отрицательные x:=x0-dx; // переходим на место 1-й засечки на оси X- repeat MoveTo(x,y0-3);LineTo(x,y0+3); TextOut(x-12,y0+5,FloatToStr(lx)); // оцифровка Pen.Style:=psDot; // линия - штрихпунктирная MoveTo(x,0);LineTo(x,form1.Height); // линия сетки lx:=lx-dlx; // уменьшаем метку на шаг, т. к. ось X- x:=x-dx; // переходим к следующей засечке until (x<0); // засечки, сетка и оцифровка по оси Y+ ly:=dly; // 1-я метка - единица y:=y0-dx; // переходим на место 1-й засечки на оси Y+ repeat MoveTo(x0-3,y);LineTo(x0+3,y); // засечка TextOut(x0-12,y,FloatToStr(ly)); // оцифровка Pen.Style:=psDot; // линия - штрихпунктирная MoveTo(x0+form1.Width,y); LineTo(0,y); // линия сетки ly:=ly+dly; // увеличиваем мету на шаг y:=y-dy; // переходим к следующей засечке until (y<0); // засечки, сетка и оцифровка по оси Y- ly:=0; // обнуляем метку ly:=ly-dly; // отрицательные метки для оси Y- y:=y0+dy; // переходим на место 1-й засечки на оси Y- repeat MoveTo(x0-3,y);LineTo(x0+3,y); // засечка TextOut(x0-15,y,FloatToStr(ly)); // оцифровка Pen.Style:=psDot; // линия - штрихпунктирная MoveTo(x0+form1.Width,y); LineTo(0,y); // линия сетки y:=y+dy; // переходим к следующей засечке ly:=ly-dly; // уменьшаем метку на шаг т. к. Ось Y- until (y>form1.Height); end;end;end.

Обсуждение

давно
Мастер-Эксперт
425
4118
20.02.2006, 07:53
общий
это ответ
Здравствуйте, Solovej!
Координатная сетка - это не более чем расположение пикселей заданного цвета на какой-то поверхности. График же Вы строите распологая собственные пиксели на поверхности. К координатной сетке, в принципе, это не имеет никакого отношения. Координатная сетка нужна лишь для удобства восприятия графика тем, кто его смотрит.
График функции строится на основе расчета расположения точек на поверхности рисования. Т.е. у Вас должна быть формула для расчета графика, например y=sin(x) и формула для расчета коэффициентов полученых значений для правильного расположения этих значений на поверхности рисования (X, Y).
Может быть я неверно понял Ваш вопрос?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
20.02.2006, 17:36
общий
это ответ
Здравствуйте, Solovej!
Ну вот, скажем, добавьте в процедуру прорисовки (после циклов) строки из приложения, и посмотрите, как это нарисуется. Если ещё вспомните, что число пи=3.14, то всё станет ясно. Масштаб по горизонтали - 1 градус. Можно через пи нарисовать, тогда умножить на пи надо параметры функции.

Приложение:
moveto(-800, y0);pen.Color:=clfuchsia;for x:=-20 to 20 do for y:=0 to 40 do begin lineto(x0+x*40+y, y0-round(40*sin(x+y/40))); end;
Форма ответа