Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ синусоида

Автор: compiler 22.02.2007 18:44

данная тема была открыта сначало в теор. вопросах, однако вышла за пределы того раздела, за что была закрыта (переместиь отказалались по неизвестным мне причинам).
задача построить синусоиду с заданным периодом
неработающая программа

{$N+}
{$E+}
Uses Graph,crt;
const
{ OPTIONS }
shag=0.0001;
lgr = -50;
pgr = 50;
zcrtX=320;
zcrty=240;
mtrX=10;
mtrY=10;
colorG=15;
colorOXY=4;
OXYminX=-200;
OXYmaxX=200;
OXYminY=-200;
oxymaxY=200;

Var grDriver : Integer;
grMode : Integer;
w:real;
x,y:real;{extended;}
i:integer;
Begin
w:=23.6884;
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
for i:=OXYminX to OXYmaxX do putpixel(zcrtX+i,zcrty,colorOXY); {TP не компилирует из за этих двух строчек}
for i:=OXYminY to OXYmaxY do putpixel(zcrtX,zcrty-i,colorOXY); {***}

x:=lgr;
while x<=pgr do
begin
{ readln(x);}
if x<>2 then begin y:=(sin(2*3/w)*x); {ИМХО, ошибка тут}
{ writeln(y:1:8);}
putpixel(zcrtx+trunc(x*mtrX),zcrty-trunc(y*mtrY),colorg) end;
x:=x+shag;
end;
readkey;
closegraph;
end.

заранее благодарен
премеч FP компилирует, а TP-нет.

Автор: TarasBer 22.02.2007 22:26

Скобки правильно расставить?
У вас: y := (sin (2*3/w) * x)
Надо: y := sin ((2*3/w) * x)

Автор: compiler 22.02.2007 22:38

Цитата(TarasBer @ 22.02.2007 17:26) *

Надо: y := sin ((2*3/w) * x)

точно... как я мог ошибица...

Автор: compiler 22.02.2007 23:15

P.S. А нельзя ли устроить построение графика в том же окне что и Ввод/вывод?

Автор: volvo 22.02.2007 23:18

Цитата
Ввод/вывод
Это ты о чем? В текстовом окне выводить графику хочешь?

Автор: compiler 22.02.2007 23:19

Цитата(volvo @ 22.02.2007 18:18) *

Это ты о чем? В текстовом окне выводить графику хочешь?

да... или текст в окне графики...

Автор: volvo 22.02.2007 23:20

smile.gif Мне почему-то кажется, что второй вариант более разумен...

OutTextXY в помощь... Как вводить данные (строковые) в графическом режиме - было в FAQ-е...

Автор: compiler 22.02.2007 23:22

Цитата(volvo @ 22.02.2007 18:20) *

smile.gif Мне почему-то кажется, что второй вариант более разумен...

OutTextXY в помощь... Как вводить данные (строковые) в графическом режиме - было в FAQ-е...

благодарю, буду искать... но меня больше интересует вывод (допустим легенда графика)

Автор: volvo 22.02.2007 23:38

А что непонятно с выводом?

setcolor(red); { Устанавливаешь требуемый цвет }
outtextxy(10, 10, 'red'); { <--- Выведется строка Red красного цвета }


Для легенды надо будет задействовать еще и Bar (прямоугольник), Rectangle (рамку), возможно - Circle (окружность)... Здесь дело только в твоей фантазии - придумай, что тебе нужно, и реализуй...

Кстати, насчет ввода строк - с FAQ я по-моему погорячился, это было вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=13890&view=findpost&p=80759

Автор: compiler 22.02.2007 23:47

Цитата(volvo @ 22.02.2007 18:38) *

А что непонятно с выводом?

setcolor(red); { Устанавливаешь требуемый цвет }
outtextxy(10, 10, 'red'); { <--- Выведется строка Red красного цвета }


Для легенды надо будет задействовать еще и Bar (прямоугольник), Rectangle (рамку), возможно - Circle (окружность)... Здесь дело только в твоей фантазии - придумай, что тебе нужно, и реализуй...

Кстати, насчет ввода строк - с FAQ я по-моему погорячился, это было вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=13890&view=findpost&p=80759

буду разбераться...

оффтоп
всегда считал что процедуры ненужны, сейчас сменил мнение. как оформить само построение графика в процедуру (чтобы можно было построить 3 графика разными цветами и с разными периодами)

Автор: volvo 23.02.2007 0:30

{$N+}
{$E+}
Uses Graph,crt;
const
{ OPTIONS }
shag=0.0001;
lgr = -50;
pgr = 50;
zcrtX=320;
zcrty=240;
mtrX=10;
mtrY=10;
colorG=15;
colorOXY=4;
OXYminX=-200;
OXYmaxX=200;
OXYminY=-200;
oxymaxY=200;

procedure draw(w: real; color: integer);
var x, y: real;
begin
x:=lgr;
while x<=pgr do begin

y:=sin((2*3/w)*x);
putpixel(zcrtx+trunc(x*mtrX),zcrty-trunc(y*mtrY),color);
x:=x+shag;

end;
end;

Var
grDriver, grMode: smallint; { <-- FPC }
i: integer;

begin
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
for i:=OXYminX to OXYmaxX do putpixel(zcrtX+i,zcrty,colorOXY);
for i:=OXYminY to OXYmaxY do putpixel(zcrtX,zcrty-i,colorOXY);

draw(23.6884, white);
draw(2 * 23.6884, lightblue);

readkey;
closegraph;
end.

Третий - по аналогии...

Автор: compiler 23.02.2007 0:32

Цитата(volvo @ 22.02.2007 19:30) *

Третий - по аналогии...

благодарю