Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > 3 Графика функции


Автор: Sannyore 2.4.2011, 14:06
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x0, y0 : integer; // начало координат
  f1, f2, f3 : real; // значения функций
  kx: integer; // кол-во пикселей в единичном отрезке
  x1, x2 : real; // диапозон изменения аргументов
  y1, y2, y3 : real; // диапозон изменения значений
  dx : real; // приращение     // шаг аргумента
  xp, yp1, yp2, yp3, a, b : real;//преобразованные точки для вывода на график
  s : integer; // размерность системы координат


implementation

{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
pi = 3.14;
begin
s:=350;
dx := 0.00003;
x1:= 0;
x2:=pi;
a:= 0;
b :=pi;
x0 := 150; //ось x
y0 := 120; //ось y
//построение осей
with form1.Canvas do
  begin // рисуем оси
    MoveTo(x0,25);    // ось х
    LineTo(x0,750);
    MoveTo(700,y0);    // ось у
    LineTo(25,y0);
     TextOut(135, 125, '0');
      TextOut(700, 114, '>');
      TextOut(146, 24, '^');
       TextOut(700, 125, 'x');
       TextOut(160, 24, 'y');

    while x1<x2 do
      begin
      kx := s div Round(b - a); //кол-во пикселей в ед. отрезке по х
      y1 := sqrt(sqr(x1)) + 2; //считаем  для 1-ой фун-ии
      y2 :=sin(sqrt(2*x1)) + cos(x1) ; // считаем  для 2-ой фун-ии
      y3 := (sqrt(sqr(x1)) + 2) - Abs(sin(sqrt(2*x1)) + cos(x1));  //считаем  для 3-ей фун-ии
      xp := x0 + kx*x1;
    {  yp1 := y0 + 10*y1;
      yp2 := y0 + 10*y2;
      yp3 := y0 + 10*y3; } -   вот тут нужен ky
   Pixels[Round(xp),Round(yp1)] := clRed;
     Pixels[Round(xp),Round(yp2)] := clGreen;
      Pixels[Round(xp),Round(yp3)] := clBlue;
      x1 := x1 + dx;        //  пробег от 1-го значения х1 до х2
                      //(проход всех значений от x1 + шаг dx  до x2 с шагом dx)
      end;
end;
end;
end.


Уважаемые форумчане, помогите с задачей. Проблема только в одном, надо найти {ky}. Т.к. {kx} есть, т.е. коэффициент масштаба для ОсиХ, нужно теперь как-то сделать коэф. масштаба для осиУ. Как сказали, нужно находить через мин и макс этих трех заданных функций, найти для них единый коэффициент, т.е. ky. Я не могу разобраться как к сожалению( Я выделили именно ту область, в которой как раз и нужен этот коэффициент kу, сейчас в этой части кода указаны значения 10. Но это не подходит.
Помогите пожалуйста. Заранее вам благодарен.

Автор: cat512 3.4.2011, 15:13
Находишь Fмах(x) всех трёх функций. Находишь Ymax(Fmax1, Fmax2, Fmax3) максимальное значение фун. из трёх, найденных на предыдущем этапе. Находишь Fmin(x) всех трёх функций. Находишь Ymin(Fmin1, Fmin2, Fmin3)минимальное значение фун. из трёх, найденных на предыдущем этапе.
ky=Ymax/Ymin
Надеюсь так понятно?

Автор: Sannyore 3.4.2011, 16:02
Так то это понятно, на словах мне почти также сказали, я что-то попробовал, но не получилось у меня(
Не слишком понял как находить именно в этой программе коэф. для Оси У.

Автор: cat512 3.4.2011, 16:08
Для твоего кода
Код

var
. . .
  Ymax, Ymin: double;
  Ky: integer;
begin
. . .
xp := x0 + kx*x1;
Ymax := MaxValue([y1, y2, y3]);
Ymin := MinValue([y1, y2, y3]);
Ky := Round(YMax / Ymin);
. . .
end;

Автор: Sannyore 3.4.2011, 22:32
Спасибо, но вылетают почему-то такие ошибки:
[Pascal Error] Unit1.pas(63): E2003 Undeclared identifier: 'MaxValue'
[Pascal Error] Unit1.pas(63): E2001 Ordinal type required
[Pascal Error] Unit1.pas(64): E2003 Undeclared identifier: 'MinValue'

Автор: cat512 3.4.2011, 23:30
Т.е. ты считаешь что, МОЗГ включать вообще не нужно? smile 
Модуль math подключи! 

Автор: Sannyore 3.4.2011, 23:44
Модуль есть, запусается форма, вылетает ошибка:
First chance exception at $75BDB760. Exception class EInvalidOp with message 'Invalid floating point operation'. Process Project1.exe (2152)

Автор: Keeper89 4.4.2011, 00:17
Sannyore, можешь пройтись отладчиком, где падает, вот лень все эти k-итые просматривать smile

Автор: Sannyore 4.4.2011, 00:29
вот что получилось, теперь запускается нормально, без ошибок, но рисует такие корявые грфики
Вот программа сам, посмотрите пожалуйста:

Автор: cat512 4.4.2011, 01:35
Я начинаю растраиваться за нашу молодёжь, которая вообще не хочет трудиться!!!
Графики получаются такими, потому что у тебя на каждой итерации коэффициент Ку меняется!
Оьсюда следствие - не копируй бездумно код! Чувствую проще самому поправить сие кривое творение smile 
Код

procedure TForm1.Button1Click(Sender: TObject);
const
pi = 3.14;
var
  Scale: Integer;
begin
s:=350;
dx := 0.00003;
x1:= 0;
x2:=pi;
a:= 0;
b :=pi;
x0 := 150; //îñü x
y0 := 120; //îñü y
Ymax := 1;
Ymin := 1;
Scale := 2;
//ïîñòðîåíèå îñåé
with form1.Canvas do
  begin // ðèñóåì îñè
    MoveTo(x0,25);    // îñü õ
    LineTo(x0,750);
    MoveTo(700,y0);    // îñü ó
    LineTo(25,y0);
     TextOut(135, 125, '0');
      TextOut(700, 114, '>');
      TextOut(146, 24, '^');
       TextOut(700, 125, 'x');
       TextOut(160, 24, 'y');

    while x1 < x2 do
    begin
          kx := s div Round(b - a); //êîë-âî ïèêñåëåé â åä. îòðåçêå ïî õ
          y1 := sqrt(sqr(x1)) + 2; //ñ÷èòàåì  äëÿ 1-îé ôóí-èè
          y2 :=sin(sqrt(2*x1)) + cos(x1) ; // ñ÷èòàåì  äëÿ 2-îé ôóí-èè
          y3 := (sqrt(sqr(x1)) + 2) - Abs(sin(sqrt(2*x1)) + cos(x1));  //ñ÷èòàåì  äëÿ 3-åé ôóí-èè
          xp := x0 + kx*x1;
          Ymax := MaxValue([Ymax, y1, y2, y3]);
          Ymin := MinValue([Ymin, y1, y2, y3]);
          ky := Abs(Round(YMax / Ymin)) * Scale;
          x1 := x1 + dx;        //  ïðîáåã îò 1-ãî çíà÷åíèÿ õ1 äî õ2
    end;
    x1:= 0;
    x2:=pi;

    while x1<x2 do
      begin
      y1 := sqrt(sqr(x1)) + 2; //ñ÷èòàåì  äëÿ 1-îé ôóí-èè
      y2 :=sin(sqrt(2*x1)) + cos(x1) ; // ñ÷èòàåì  äëÿ 2-îé ôóí-èè
      y3 := (sqrt(sqr(x1)) + 2) - Abs(sin(sqrt(2*x1)) + cos(x1));  //ñ÷èòàåì  äëÿ 3-åé ôóí-èè
      xp := x0 + kx*x1;
      yp1 := y0 + ky*y1;
      yp2 := y0 + ky*y2;
      yp3 := y0 + ky*y3;
    Pixels[Round(xp),Round(yp1)] := clRed;
     Pixels[Round(xp),Round(yp2)] := clGreen;
      Pixels[Round(xp),Round(yp3)] := clBlue;
      x1 := x1 + dx;        //  ïðîáåã îò 1-ãî çíà÷åíèÿ õ1 äî õ2
                      //(ïðîõîä âñåõ çíà÷åíèé îò x1 + øàã dx  äî x2 ñ øàãîì dx)
      end;
end;
end;



Добавлено через 3 минуты и 39 секунд
Коэффициент Scale меняет масштаб

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)