Регистрация: 26.03.2012
Сообщений: 7
|
Delphi график функции с точками во внешнем файле и возможностью построения трехмерной модели
Доброго времени суток. Уже отчаялась и решила попросить помощи...
У меня такая проблема: нужно построить график функции с переменными численно заданными во внешнем файле с возможностью переключения на трехмерную модель этого графика.
На одной форме размещен StringGrid и кнопки Построить график, Записать точки из SG в файл, Запись точек из файла в SG. На второй собчтвенно выводит сам график. Вот в чем загвостка:
Код:
Код:
type
TGrafik = class(TObject)
x, y: array of double;
procedure ZnF (Sender:TObject); //точки в SG
procedure Gr (Sender:TObject); //график
procedure ZF (Sender: TObject); //запись из SG
procedure ChF (Sender: TObject); //запись в SG
end;
var
Form1: TForm1;
Fun1:TGrafik;
f1:TextFile;
maxRow:integer;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin // При создании формы надо проинициалаизировать таблицу
with StringGrid1 do
begin // Формрование заголовков столбцов таблицы
Cells[0,0]:='№';
Cells[0,1]:='1';
Cells[0,2]:='2';
Cells[0,3]:='3';
Cells[0,4]:='4';
Cells[0,5]:='5';
Cells[0,6]:='6';
Cells[0,7]:='7';
Cells[0,8]:='8';
Cells[0,9]:='9';
Cells[0,10]:='10';
Cells[1,0]:='X';
Cells[2,0]:='Y';
end;
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', #8, '-', DecimalSeparator]) then Key:=#0;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Fun1:=TGrafik.Create;
Fun1.ZnF(Sender);
Fun1.Gr(Sender);
//Fun1.ZF;
//Fun1.ChF;
end;
procedure TGrafik.ZnF(Sender:TObject);
var
i, RowCount: integer;
f:boolean;
tmp:double;
begin
with Form1.StringGrid1 do
maxRow:=10;
RowCount:=MaxRow+2;
for i:=1 to RowCount-1 do
Form1.StringGrid1.Cells[0,i]:=IntToStr(i);
SetLength(x, maxRow); //заполнение массивов координат
SetLength(y, maxRow);
for i:=0 to maxRow-1 do
begin
try
x[i]:=StrToFloat(Form1.StringGrid1.Cells[1,i+1]);
except
x[i]:=0;
end;
try
y[i]:=StrToFloat(Form1.StringGrid1.Cells[2,i+1]);
except
y[i]:=0;
end;
end;
Form2.PaintBox1.Invalidate; // Перерисовать график
end;
procedure TGrafik.Gr (Sender: TObject);
var
cx,cy,i,j,xx,yy:integer;
d:double;
begin
Form2.Show;
with Form2.PaintBox1 do
begin //перерисовка графика
cx:=width div 2;
cy:=height div 2;
if width<height then
d:=(width-30)/20
else
d:=(height-30)/20;
Canvas.pen.color:=clNavy; //оси
Canvas.pen.width:=3;
Canvas.polyline([point(0,cy), point(width,cy), point(width-10, cy+5),
point(width,cy),point(width-10,cy-5)]);
Canvas.polyline([point(cx,height), point(cx,0), point(cx+5,10), point(cx,0),
point(cx-5,10)]);
Canvas.pen.color:=clBlack; //насечки
Canvas.pen.width:=1;
Canvas.font.name:='small';
Canvas.font.size:=7;
Canvas.brush.style:=bsClear; //заливка откл
for i:=-10 to 10 do
if i<>0 then
begin
if i mod 5=0 then j:=5 else j:=3;
Canvas.Polyline([Point(cx+round(i*d) ,cy-j), Point(cx+round(i*d) ,cy+j+1)]);
Canvas.Polyline([Point(cx-j,cy+round(i*d)), Point(cx+j+1,cy+round(i*d))]);
Canvas.TextOut(cx+round(i*d)-4,cy-15, IntToStr(i));
Canvas.TextOut(cx+10, cy-round(i*d)-5,IntToStr(i));
end;
// Строим график
Canvas.Pen.Color:=clMaroon;
Canvas.Brush.Color:=clYellow;
for i:=0 to High(x) do
begin
xx:=cx+round(x[i]*d);
yy:=cy-round(y[i]*d);
Canvas.Rectangle(xx-2,yy-2,xx+3,yy+3);
if i=0 then Canvas.MoveTo(xx,yy) else Canvas.LineTo(xx, yy);
end;
end;
end;
procedure TGrafik.ZF(Sender: TObject);
var
i:integer;
begin
ZnF(Sender);
Form1.SaveDialog1.Execute;
AssignFile(f1, Form1.SaveDialog1.FileName);
Rewrite(f1);
For i:=0 to maxRow-1 do
begin
WriteLN(f1, x[i], ' , ', y[i]); //здесь надо бы добавить округление чисел, а то в файл записывает 'дикими' числами. Не знаю как
end;
CloseFile(f1);
end;
procedure TGrafik.ChF(Sender: TObject); //Незнаю как сделать это, всю голову уже сломала. Нужно чтобы из файла числа записывались в SG
var
i:integer;
s:string;
begin
ChF(Sender);
Form1.OpenDialog1.Execute;
AssignFile(f1, Form1.OpenDialog1.FileName);
Reset(f1);
CloseFile(f1);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Fun1:=TGrafik.Create;
Fun1.ZF(Sender);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Fun1:=TGrafik.Create;
Fun1.ChF(Sender);
end;
end.
И вообще не имею понятия как сделать переключатель на 3D модель данного графика.
Прошу помощи магов)
Последний раз редактировалось ACE Valery; 26.03.2012 в 18:55.
|