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

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

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

Автор: 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) Как сделать, чтобы график состоял не из точек, а были линии.
Заранее благодарен.



Прикрепленные файлы
Прикрепленный файл  VALENOK3.pas ( 2.41 килобайт ) Кол-во скачиваний: 278

Автор: volvo 18.11.2006 21:55

Цитата(GeoRGe @ 18.11.2006 15:28) *
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), и будет тебе счастье...

Автор: GeoRGe 18.11.2006 22:55

Цитата(volvo @ 18.11.2006 17:55) *

...и будет тебе счастье...

большое спасибо... good.gif