Вот значит написал программу выводящую на экран график функции, оси, деление и подпись осей....
Помогите плиз организовать сжатие и растяжение графика вдоль оси Ох: т.е. при нажатии стрелки вправо - растяжение, стрелка влево - сжатие...
Да,я понимаю, что это нудная задачка...Ну, помогите хотя бы правильно обозначить деление осей координат
Я разделил на отрезки, но что-то для Оу-оси деление неправильное. И вообще, я думаю, чтобы справиться с этой задачей, нужно организовать цикл, в котором при нажатии стрелок будет увеличиваться(уменьшаться) кол-во делений оси Ох...Что скажете?
а у тебя тот код, что ты привел, нормально компилируется и работает?
по поводу сжатия/растяжения. я бы хранила какой-то поправочный коэффициент, который бы при нажатии стрелки влево делился на, скажем, 2, а при нажатии вправо - умножался.
при рисовании графика его надо будет учитывать.
Ну,помогите вставить этот кфц. в нужную часть кода...
ну ты сам хоть попробуй что ли.
для приличия.
и ответь на вопрос.
Начнем с того, что эту прогу я сам написал. Но, по-моему здесь деление оси Оу выполнено неверно.
молодец.
у меня твой код НЕ компилируется. Вообще.
потому и спрашиваю - у ТЕБЯ он работает?
Я знаю, что у меня TP на графике иногда глючит не по делу.
Если у тебя работает - буду искать проблемы у себя. Если не работает - приведи его в состояние, чтобы хоть как-то работал.
а ты даже не соизволиваешь ответить.
Изменения:
1. x1, y1, x2, y2 стали типа real
2. Добавил цикл, о котором ты говоришь ("чтобы справиться с этой задачей, нужно организовать цикл...")
3. В тело цикла перенес инициализацию x1, x2, y1, y2, h и n. Область вывода (I1, J1, I2, J2) остается неизменной, меняется (по x) только часть графика, которую мы туда впихиваем. n меняем, потому что с увеличением масштаба точки улетают высоко вверх, а видимая часть рисуется с плохой детализацией.
4. Вот в этом цикле:
for i:=x1 to x2 do
begin
PutPixel(II(x1+i+3),JJ(0),15); {cena deleniya}
str(i,s);
OutTextXY(II(x1+i+3-0.05),JJ(0.1),s)
end;
for i:=trunc(x1)-1 to trunc(x2)+1 do
begin
PutPixel(II(i),JJ(0),15); {cena deleniya}
str(i,s);
OutTextXY(II(i-0.05),JJ(0.1),s)
end;
uses Crt, Graph ;
var
x,y,h:real;
I1,I2,J1,J2,k:integer;
x1,x2,y1,y2:real;
i,n,j:integer;
s:string;
driver,Regim:integer;
xkoef: real;
c: char;
function II(x:real):Integer;
begin
II:=I1 + Trunc ((x-x1)*(I2-I1)/(x2-x1))
end;
function JJ(y:real):Integer;
begin
JJ:=J1 + Trunc ((y-y1)*(J2-J1)/(y2-y1))
end;
begin
I1:=10;I2:=400;
j1:=10;J2:=300;
driver:=VGA;
Regim:=1;
InitGraph(driver,regim,'');
xkoef := 1.0;
while true do begin
n:=trunc(30*xkoef);
x1:=-3*xkoef;x2:=5*xkoef;
y1:=-7;y2:=2;
h:=(x2-x1)/n;
SetColor(blue);
SetFillStyle(blue,yellow);
Bar(I1,J1,I2,J2);
rectangle(I1,J1,I2,J2);
SetColor(LightRed);
MoveTo(II(x1),JJ(0));LineTo(II(x2),JJ(0));
MoveTo(II(0),JJ(y1));LineTo(II(0),JJ(y2));
for i:=trunc(x1)-1 to trunc(x2)+1 do
begin
PutPixel(II(i),JJ(0),15); {cena deleniya}
str(i,s);
OutTextXY(II(i-0.05),JJ(0.1),s)
end;
for j:=trunc(y1)-1 to trunc(y2)+1 do {-5,1}
begin
if j=0 then
else
begin
str(-j,s);
PutPixel(II(0),JJ(j),15);
OutTextXY(II(0.1),JJ(j),s)
end
end;
OutTextXY(II(x2),JJ(0.1),'x');
Line(II(x2),JJ(0),II(x2-0.1),JJ(0+0.05));
Line(II(x2),JJ(0),II(x2-0.1),JJ(0-0.05));
OutTextXY(II(-0.2),JJ(y1-0.18),'y');
Line(II(0),JJ(y1),II(0.1),JJ(y1+0.15));
Line(II(0),JJ(y1),II(-0.1),JJ(y1+0.15));
SetBkColor(white);
SetColor(green);x:=x1;y:=sqrt(x*x+2);
MoveTo(II(x),JJ(-y));
for i:=1 to n do
begin
x:=x+h;
y:=sqrt(x*x+2);
LineTo(II(x),JJ(-y))
end;
while true do begin
c := ReadKey;
if Ord( c ) = 27 then
halt;
if Ord( c ) = 0 then begin
c := ReadKey;
if Ord( c ) = 75 then
xkoef := xkoef * 1.2
else if Ord( c ) = 77 then
xkoef := xkoef / 1.2
else
continue;
break;
end;
end;
end;
readln;
closegraph
end.
Спасибо, за прекрасное объяснение. Я бы тебе плюсег поставил, но пока не могу
Р.С. Только, когда сжимаем график, остается что-то вроде шлейфа на экране
A();
while B do begin
C();
A();
end;
while true do begin
A();
if not B then break;
C();
end;
repeat
stop:= false;
c := ReadKey;
if Ord( c ) = 27 then
halt;
if Ord( c ) = 0 then begin
c := ReadKey;
if Ord( c ) = 75 then begin
xkoef := xkoef * 1.2;
stop := true;
end else if Ord( c ) = 77 then begin
xkoef := xkoef / 1.2;
stop := true;
end;
end;
until stop;
ну, еще бывают циклы с постусловием - это если говорить о первом случае.
while true do begin
c := ReadKey;
if Ord( с ) = 27 then
halt;
if Ord( c ) = 0 then
begin
c := ReadKey;
if Ord( с ) = 75 then
xkoef := xkoef * 1.2
else
if Ord( с )= 77 then
xkoef := xkoef / 1.2
else
continue;
break;
end;