Помогите кто чем может решить задачу пожалуста
Написать программу построения графика функции. Вывод графика осуществляется в созданном на экране окне, в другом окне выполнить вывод уравнения функции с конкретными значениями параметров. Выполнить смену 3-х экранов с конкретными значениями параметров.
“Бабочка”:
X=sin(At + B)cos(Ct), Y=sin(At + B)sin(Dt), A>0, B>0, C>0, D>0, 0<=t<=2пи
Заранее благодарю
ПАСКАЛЬ - ГРАФИКА
Переводишь в графический режим, рисуешь по центру экрана вертикальную и горизонтальную линии. Дальше: по виду функции ясно, что |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));
Определяем функции для отображения точек на экране:
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));
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Я вот вроде бы решил может посмотрите, протестируете
Код: Выделить всё
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.
-
- Сообщения: 1
- Зарегистрирован: 18 окт 2012, 00:43
- Откуда: Tunisia
- Контактная информация:
Здравствуйте!
Пожалуйста, пришлите нам по электронной почте если вы владеете акциями в некоторых компаниях. shareholders@forexspot.biz
У нас есть к вам вопрос.
Пожалуйста, пришлите нам по электронной почте если вы владеете акциями в некоторых компаниях. shareholders@forexspot.biz
У нас есть к вам вопрос.