Форум «Всё о Паскале» _ Задачи _ Помогите с графиком
Автор: GeoRGe 18.11.2006 20:28
У меня есть программа, которая строит график функции, вот она:
Код
program Valenok_3; uses crt,graph; const k=5000; var gm,gd,i:integer; {----------Pamka----------} tlx,tly,brx,bry:integer; bls,blw,blc:integer; {----------rpaфuK----------} Grt{Tun},GRc{color}:integer; Xmin,Xmax,q,max,min,ymax,ymin:real; Ax,Ay,Bx,By:real; f,r:real; fx,fy:integer; a,b: array[0..k] of real; {----------CeTKa----------} gls,glw,glc,nx{число делений оси x},ny{... y},textc:integer; sx,sy,xv,yv:real; w:string; begin writeln('rpafuK fyHKzuu r=cos(q*f)'); writeln('BBeDuTE q'); readln(q); {----------rPafu4eckué pe>|<uM ----------} gd:=0; initgraph(gd,gm,'c:\bp\bgi'); {----------PamKa----------} begin tlx:=20; tly:=20; brx:=620; bry:=460; bls:=0; {Tun} blw:=3; {To/|wuHa} blc:=14; {color} setlinestyle(bls,0,blw); setcolor(blc); rectangle(tlx,tly,brx,bry); end; {----------3Ha4eHuya oCeu u nePeBoD-----------} xmax:=0.2; xmin:=-0.4; ymax:=0.7; ymin:=0; max:=ymin; min:=ymax; Ax:=(brx-tlx)/(xmax-xmin); Bx:=tlx-xmin*Ax; Ay:=(bry-tly)/(max-min); By:=tly-Ay*min; {----------ceTKa----------} begin gls:=1;{CTu/|b} glw:=1;{Tun} glc:=6;{color} textc:=11; nx:=20;{Kol De/|eHuu X} ny:=20;{Kol De/|eHuu Y} sx:=(brx-tlx)/nx; sy:=(bry-tly)/ny; setlinestyle(gls,0,glw); settextstyle(2,0,2); setcolor(glc); for i:=1 to nx-1 do line (trunc(tlx+sx*i),tly,trunc(tlx+sx*i),bry); for i:=1 to ny-1 do line (tlx,trunc(tly+sy*i),brx,trunc(tly+sy*i));
{----------noDnucu----------} setcolor(textc); {----------X----------} for i:=1 to nx+1 do begin str(xmin+(i-1)*sx/Ax:1:2,w); outtextxy(trunc(tlx+sx*(i-1))-4,bry+7,w); end; {----------Y----------} for i:=1 to ny+1 do begin str((max+min)-(max-(i-1)*sy/Ay):1:2,w); outtextxy(tlx-18,trunc(tly+sy*(i-1)-3),w); end; {----------3aro/|oBoK----------} settextstyle(0,0,0); str(q:1:0,w); outtextxy(213,5,'rpafuK fyHKzuu r=cos(q*f) q='); outtextxy(452,5,w); outtextxy(550,450,'PaDuaHb|'); end; {----------rPafuk----------} begin grc:=4; for i:=0 to k do begin r:=(i*180)/(Pi); a[i]:=cos(q*r)*cos(r); b[i]:=cos(q*r)*sin(r); end; for i:=0 to k do PutPixel(trunc(Ax*a[i]+Bx),trunc(Ay*b[i]+By),grc); end; readln; closegraph; end.
У меня есть две проблемы, которые очень нужно решить: 1) (наиболее важная) При xmax, xmin, ymax, ymin, которые заданы сейчас (и при любых других, при которых график полностью не влезает в рамку) график не должен быть виден за рамкой. Я пытался добиться этого при помощи "setviewport", но у меня хрень какая-то получается, может чего не догоняю, как пользоваться этим setviewport'ом. Помогите, plz. И 2) Как сделать, чтобы график состоял не из точек, а были линии. Заранее благодарен.
1) (наиболее важная) При xmax, xmin, ymax, ymin, которые заданы сейчас (и при любых других, при которых график полностью не влезает в рамку) график не должен быть виден за рамкой.
Свой цикл
for i:=0 to k do PutPixel(trunc(Ax*a[i]+Bx),trunc(Ay*b[i]+By),grc);
заменяешь на вот такой:
for i:=0 to k do begin
px := trunc(Ax*a[i]+Bx); py := trunc(Ay*b[i]+By); { Проверяем координаты } if (px > tlx) and (px < brx) and (py > tly) and (py < bry) then PutPixel(px, py,grc);
end;
(не забудь объявить переменные px, py: Integer), и будет тебе счастье...