Помощь - Поиск - Пользователи - Календарь
Полная версия: График ф-ции и координатные оси
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
Мне нужно построить график ф-ции у= 2е^x - 4cos2x.
График вроде строит, но я не пойму, почему у меня только горизонтальная ось?
В тот момент, когда программа вычисляет координату У горизонтальной оси (у0), после следует рисовать координатные оси....
???


uses Graph;
var x1, x2, y1, y2, x, y, dx, mx, my : real;
l , b, h, w, x0, y0 : integer;
st : string;
grDriver, grMode, ErrCode : integer;
Function f(x : real) : real;
begin
f := 2*Exp(x) - 4*cos(2*x);
end;
begin
grDriver:=VGA; GrMode:=VGAHi;
InitGraph(grDriver,grMode,' ');
ErrCode:=GraphResult;
if ErrCode<>grOk then Halt(1);
l:=40;b:=400;
h:=300;w:=300;
x1:=0;x2:=25;dx:=0.01;
y1:=0;y2:=0;
x:=x1;
repeat
y:=f(x);
if y<y1 then y1:=y;
if y>y2 then y2:=y;
x:=x+dx;
until(x>=x2);
my:=h/abs(y2-y1);
mx:=w/abs(x2-x1);
x0:=1;
y0:=b-abs(Round(y1*my));
Line(1,b,1,b-h);
Line(x0,y0,x0+w,y0);
Str(y2:5:1,st);
OutTextXY(l+5,b-h,st);
Str(y1:5:1,st);
OutTextXY(l+5,b,st);
x:=x1;
repeat
y:=f(x);
Putpixel(x0+Round(x*mx),y0-Round(y*my),13);
x:=x+dx;
until(x>=x2);
Readln;
CloseGraph;
end.



Алена
Почему же только горизонтальная? У меня обе отображаются, вертикальная тоже...
compiler
Цитата(Алена @ 23.03.2007 17:39) *

Почему же только горизонтальная? У меня обе отображаются, вертикальная тоже...

а у меня нет Нажмите для просмотра прикрепленного файла

Добавлено через 2 мин.
к стате а где ты рисуешь вертикальную ось? (в коде)
18192123
Цитата(compiler @ 23.03.2007 17:44)
а у меня нет

присмотрись внимательнее: вериткальная ось у тебя прям рядом с левой границей окна...

Line(1,b,1,b-h);
Line(x0,y0,x0+w,y0);
compiler
Цитата(18192123 @ 23.03.2007 17:55) *
присмотрись внимательнее: вериткальная ось у тебя прям рядом с левой границей окна...

точно. прошу прощения, больше надо спать...
18192123
может у меня эта ось выскакивает за пределы окна?
Я уже и интервалы изменения аргумента меняла и размеры области вывода(высота и ширина), а оси всё не видно...
Артемий
А ты можешь картинку привести? smile.gif
18192123
Цитата(Артемий2 @ 23.03.2007 18:13) *

А ты можешь картинку привести? smile.gif

прошу прощения за качество...
Артемий
У тебя конкретная обрезка изображения идет! Попробуй использовать другие драйвера и разрешение..

З.Ы. А зачем фоткать было?
18192123
Цитата(Артемий2 @ 23.03.2007 18:41)
А зачем фоткать было?

А через prtscr не получилось..)
compiler
Цитата(18192123 @ 23.03.2007 19:07) *

А через prtscr не получилось..)

а с контрлом, а потом в пэинт или что там у тебя...

ужасное оформление
volvo
Цитата
а с контрлом, а потом в пэинт или что там у тебя...
А не получится... Надо использовать специальный модуль (см. в поиске, "Скриншот" "Графика") ...

18192123, почему именно по САМОМУ левому краю? Отступ в 50 пикселей сделать нельзя?

(проблема, кстати, очень похожа не неправильно выставленный Refresh Rate для определенного разрешения экрана...)
18192123
Цитата(volvo @ 23.03.2007 19:27) *


18192123, почему именно по САМОМУ левому краю? Отступ в 50 пикселей сделать нельзя?


где сделать отступ? ( не поняла тебя...)
а с осями я разобралась (изменила драйвер и режим)

И ёще вопросик: у меня не получается предусмотреть, чтоб график ф-ции рисовался и на отрицательной полуплоскости......
volvo
Цитата
не получается предусмотреть, чтоб график ф-ции рисовался и на отрицательной полуплоскости......
Тогда центр координат - надо перенести в середину экрана... Вот так, например:
SetViewPort(getmaxx div 2, getmaxy div 2, getmaxx, getmaxy, ClipOff)
Тогда при задании отрицательных значений как по OX, так и по OY у тебя будет отображаться правильная точка (относительно центра экрана, только надо учесть, что координата Y изменяется сверху вниз, а не снизу вверх)
18192123
Цитата(volvo @ 23.03.2007 19:57) *

Тогда центр координат - надо перенести в середину экрана... Вот так, например:
SetViewPort(getmaxx div 2, getmaxy div 2, getmaxx, getmaxy, ClipOff)
Тогда при задании отрицательных значений как по OX, так и по OY у тебя будет отображаться правильная точка (относительно центра экрана, только надо учесть, что координата Y изменяется сверху вниз, а не снизу вверх)

А почему, если я увеличиваю интервал изменения аргумента ( например, от -10 до 10), то график в отрицательной полуплоскости вырождается в прямую? ( а если брать -5 до 2.5 - всё нормально).....
18192123
Цитата(18192123 @ 23.03.2007 20:24) *

А почему, если я увеличиваю интервал изменения аргумента ( например, от -10 до 10), то график в отрицательной полуплоскости вырождается в прямую? ( а если брать -5 до 2.5 - всё нормально).....

Кстати, если прокрутить такую ситуацию в Ехсеl, то результат такой же...
???????
volvo
Цитата
А почему, если я увеличиваю интервал изменения аргумента ( например, от -10 до 10), то график в отрицательной полуплоскости вырождается в прямую?
Потому, что функция такая... Тут дело не в отрицательной полуплоскости, а как раз в положительной. Функция возрастает экспоненциально. Смотри. Пишем совсем маленькую программу:

function f(x: real): real;
begin
f := 2 * exp(x) - 4 * cos(2*x);
end;

var
x, xst, xfn: real;

begin
xst := -10; xfn := 10;
x := xst;
repeat
writeln('X = ', x:10:5, '| Y = ', f(x):10:5);
x := x + 0.3;
until x > xfn;

end.
И получаем результат:

X =  -10.00000| Y =   -1.63224
X = -9.70000| Y = -3.40905
X = -9.40000| Y = -3.99492
X = -9.10000| Y = -3.18519
X = -8.80000| Y = -1.26267
X = -8.50000| Y = 1.10106
X = -8.20000| Y = 3.08034
X = -7.90000| Y = 3.98381
X = -7.60000| Y = 3.49595
X = -7.30000| Y = 1.78729
X = -7.00000| Y = -0.54513
X = -6.70000| Y = -2.68631
X = -6.40000| Y = -3.88801
X = -6.10000| Y = -3.73005
X = -5.80000| Y = -2.26710
X = -5.50000| Y = -0.00953
X = -5.20000| Y = 2.25497
X = -4.90000| Y = 3.73660
X = -4.60000| Y = 3.91948
X = -4.30000| Y = 2.74202
X = -4.00000| Y = 0.61863
X = -3.70000| Y = -1.70474
X = -3.40000| Y = -3.41084
X = -3.10000| Y = -3.89607
X = -2.80000| Y = -2.98064
X = -2.50000| Y = -0.97048
X = -2.20000| Y = 1.45094
X = -1.90000| Y = 3.46301
X = -1.60000| Y = 4.39697
X = -1.30000| Y = 3.97262
X = -1.00000| Y = 2.40035
X = -0.70000| Y = 0.31330
X = -0.40000| Y = -1.44619
X = -0.10000| Y = -2.11059
X = 0.20000| Y = -1.24144
X = 0.50000| Y = 1.13623
X = 0.80000| Y = 4.56788
X = 1.10000| Y = 8.36234
X = 1.40000| Y = 11.87929
X = 1.70000| Y = 14.81509
X = 2.00000| Y = 17.39269
X = 2.30000| Y = 20.39698
X = 2.60000| Y = 25.05341
X = 2.90000| Y = 32.80621
X = 3.20000| Y = 45.09232
X = 3.50000| Y = 63.21529
X = 3.80000| Y = 88.39733
X = 4.10000| Y = 122.03719
X = 4.40000| Y = 166.14611
X = 4.70000| Y = 223.89312
X = 5.00000| Y = 300.18260
X = 5.30000| Y = 402.21497
X = 5.60000| Y = 540.04080
X = 5.90000| Y = 727.19321
X = 6.20000| Y = 981.55331
X = 6.50000| Y = 1326.65348
X = 6.80000| Y = 1793.64777
X = 7.10000| Y = 2424.18532
X = 7.40000| Y = 3274.43027
X = 7.70000| Y = 4420.50780
X = 8.00000| Y = 5965.74661
X = 8.30000| Y = 8050.25610
X = 8.60000| Y = 10863.63390
X = 8.90000| Y = 14661.95525
X = 9.20000| Y = 19790.65556
X = 9.50000| Y = 26715.49884
X = 9.80000| Y = 36064.56431
Обрати внимание, насколько значения функции при отрицательных аргументах по модулю меньше, чем при положительных... А у тебя масштабирование, и чтобы отобразить значение в несколько десятков тысяч, естественно, приходится умножать на очень маленький коэффициент, при этом значения порядка единиц просто сливаются с нулем...
18192123
Цитата(volvo @ 24.03.2007 1:39) *

Потому, что функция такая... Тут дело не в отрицательной полуплоскости, а как раз в положительной. Функция возрастает экспоненциально. Обрати внимание, насколько значения функции при отрицательных аргументах по модулю меньше, чем при положительных... А у тебя масштабирование, и чтобы отобразить значение в несколько десятков тысяч, естественно, приходится умножать на очень маленький коэффициент, при этом значения порядка единиц просто сливаются с нулем...

Большое спасибо! Теперь вопросов нет!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.