ПАСКАЛЬ - ГРАФИКА

Ответить
verty
Сообщения: 20
Зарегистрирован: 23 апр 2007, 13:55

Помогите кто чем может решить задачу пожалуста

Написать программу построения графика функции. Вывод графика осуществляется в созданном на экране окне, в другом окне выполнить вывод уравнения функции с конкретными значениями параметров. Выполнить смену 3-х экранов с конкретными значениями параметров.
“Бабочка”:
X=sin(At + B)cos(Ct), Y=sin(At + B)sin(Dt), A>0, B>0, C>0, D>0, 0<=t<=2пи

Заранее благодарю
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Переводишь в графический режим, рисуешь по центру экрана вертикальную и горизонтальную линии. Дальше: по виду функции ясно, что |X|<=1, |Y|<=1. Поскольку разрешение по Y меньше (480 против 640 по Х), умещаем в эти 480 всю ОДЗ, т.е. от -1 до 1 - 2. 480/2=240.
Определяем функции для отображения точек на экране:
function Х_screen(X:real):integer
begin
X_screen:=getmaxx div 2 + X*240;
end;
function Y_screen(Y:real):integer
begin
Y_screen:=getmaxy div 2 - Y*240; {минус - потому что в паскале начало координат находится в левом верхнем углу. Впрочем, здесь это не играет роли, потому что график симметричен относительно оси Х}
end;
Задаешь A, B, C, D, определяешь функции X(t) и Y(t) по заданию, потом
t:=0;
moveto(X_screen(X(t)), Y_Screen(Y(t));
Дальше в цикле увеличиваешь t, допустим, на 0.01 и делаешь
lineto(X_screen(X(t)), Y_Screen(Y(t));
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
verty
Сообщения: 20
Зарегистрирован: 23 апр 2007, 13:55

Я вот вроде бы решил может посмотрите, протестируете

Код: Выделить всё

Uses Crt, Graph;



var GraphDriver, GraphMode, ErrorCode : Integer;



    Center_x, Center_y, {Координаты центра координатной сетки}

    Width_x, Height_y : integer; {Ширина и высота координатной сетки для

     масштабирования значений аргумента и функции}



procedure InitGrp;

begin

{ драйвер и режимы по умолчанию }

GraphDriver := Detect;

{ драйвер egavga.bgi в текущей папке }

InitGraph(GraphDriver, GraphMode, 'egavga.bgi');

ErrorCode := GraphResult;

{ обработка ошибки }

if ErrorCode <> grOK then begin

   Writeln('Graphics error: ', GraphErrorMsg(ErrorCode));

   CloseGraph;

   Halt(1); 

   end;

end;



const {Шаг наращивания t. Чем меньше, тем более плавно рисуется график.

       В данном случае принимается дискретность - 200 шагов}

      Td = 2*Pi / 200;



var

    X, Y, A, B, C, D, t, y_scale : real;

    {Переменные для хранения координат построения графика}

    xx, yy : integer;

    {Вспомогательные переменные}

    sA, sB, sC, sD : string;



Begin

Clrscr;

Write('Enter A>0:');

Readln(A);

Write('Enter B>0:');

Readln(B);

Write('Enter C>0:');

Readln(C);

Write('Enter D>0:');

Readln(D);





{Задаём исходные данные для тестирования алгоритма программы}

{A:=2;

B:=3;

C:=4;

D:=5;

}



{Загружаем графический драйвер и включаем графический режим}

InitGrp;



{Устанавливаем параметры координатной сетки исходя из максимального

 разрешения установленного граф.режима}

Center_x := GetMaxX div 2;

Center_y := GetMaxY div 2;

Width_x := (GetMaxX div 2) - 50;

Height_y := (GetMaxY div 2) - 50;

{Предполагаем, что максимальное значение U(t) не превысит 20, поэтому

 вычисляем масштабный коэффициент для вывода графика функции}

y_scale:=Height_y/1;



{Рисуем оси координат белым цветом}

SetColor(white);

Line(Center_x+Width_x,Center_y,Center_x-Width_x,Center_y);

Line(Center_x,0,Center_x,Center_y+Height_y);



{Рисуем график функции красным цветом}

SetColor(red);



t:=0; {Начальное значение времени}

repeat

  {Вычисляем значения функции}

  X:=sin(A*t + B) * cos(C*t);

  Y:=sin(A*t + B) * sin(D*t);

  {Поскольку в графическом режиме координаты по вертикали растут сверху вниз, то

   параметр Y следует не складывать, а отнимать от осевой координаты Center_y }

  xx:=trunc(Center_x + X * Width_x);

  yy:=trunc(Center_y - Y * y_scale{Height_y});

  if t=0 then MoveTo(xx,yy)

     else LineTo(xx,yy);

  t:=t+Td; {Наращиваем t}

until t>2*Pi;



{Получаем символьный вид параметров A,B,C,D}

Str(A:2:2,sA);

Str(B:2:2,sB);

Str(C:2:2,sC);

Str(D:2:2,sD);



{Задаём координату высоты вывода уравнения функции}

yy:=Center_y+Height_y+10;

OutTextXY(0,yy,'X=Sin(' + sA + '*t+' + sB + ')*Cos(' + sC + '*t)');



{Переходим на следующую строку и выводим вторую половину уравнения}

yy:=yy+10;

OutTextXY(0,yy,'Y=Sin(' + sA + '*t+' + sB + ')*Sin(' + sD + '*t)');



readln;

{Выходим из граф. режима в текстовый режим}

CloseGraph;

End.
hertoortbiach
Сообщения: 1
Зарегистрирован: 18 окт 2012, 00:43
Откуда: Tunisia
Контактная информация:

Здравствуйте!
Пожалуйста, пришлите нам по электронной почте если вы владеете акциями в некоторых компаниях. shareholders@forexspot.biz
У нас есть к вам вопрос.
Ответить