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

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

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

Автор: Kolt 9.11.2006 3:54

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


program lab3;
uses crt,graph;
var i,
CB,TLX,TLY,BRX,BRY,WRX,WRY,n :integer;
Ax,Ay,Bx,By,
temp, xmin,xmax, ymin,ymax, t :real;
a,b: array[0..359] of real;
text : string;
procedure SetupGraphics;
var
grDriver, grMode :integer;
begin
grDriver := detect;
InitGraph(grDriver,grMode,'c:/bp/bgi');
end;

procedure Stop;
begin
repeat until keypressed;
end;

begin {main}
ClrScr;
write('Введите n ');
read(n);

for i:=0 to 359 do begin
a[i]:=cos(n*i)*cos(i);
b[i]:=cos(n*i)*sin(i);
end;

temp:=a[0];
for i:=0 to 359 do if a[i]<temp then temp:=a[i];
xmin:=temp;
for i:=0 to 359 do if a[i]>temp then temp:=a[i];
xmax:=temp;
temp:=b[0];
for i:=0 to 359 do if b[i]<temp then temp:=b[i];
ymin:=temp;
for i:=0 to 359 do if b[i]>temp then temp:=b[i];
ymax:=temp;

TLX := 60; TLY := 60;
BRX := 460; BRY := 360;
WRX := BRX - TLX; WRY := BRY - TLY;
Ax := WRX/(xmax-xmin); Ay := WRY/(ymax-ymin);
Bx := TLX - Ax*xmin; By := TLY - Ay*ymin;

SetupGraphics;

Rectangle(TLX,TLY, BRX,BRY);

SetColor(green);
i:=TLX+50;
while i<BRY do begin
line(TLX+1,i,BRX-1,i); i:=i+50;
end;
i:=TLY+50;
while i<BRX do begin
line(i,TLY+1,i,BRY-1); i:=i+50;
end;
SetColor(White);
i:=TLX;
while i<=BRY do begin
line(TLX-10,i,TLX,i); i:=i+50;
end;
i:=TLY;
while i<=BRX do begin
line(i,BRY+10,i,BRY); i:=i+50
end;

for i:=0 to 359 do PutPixel(trunc(Ax*a[i]+Bx),trunc(Ay*b[i]+By),red);

SetColor(white);
OutTextXY(TLX-10,TLY-20,'Y');
OutTextXY(BRX+10,BRY,'X');
t:=(ymax-ymin)/6;
i:=TLX-3;
while i<=BRY do begin
str(ymax:1:2,text); ymax:=ymax-t;
OutTextXY(0,i,text); i:=i+50;
end;
t:=(xmax-xmin)/8;
i:=TLY-20;
while i<=BRX do begin
str(xmax:1:2,text); xmax:=xmax-t;
OutTextXY(i,BRY+20,text); i:=i+50;
end;
Stop;
CloseGraph
end.



От n зависит количество лепестков



Прикрепленные файлы
Прикрепленный файл  LAB3.PAS ( 2.29 килобайт ) Кол-во скачиваний: 265

Автор: volvo 9.11.2006 4:19

Вот так попробуй:
Прикрепленный файл  LEP.PAS ( 2.4 килобайт ) Кол-во скачиваний: 556


Кстати, обрати внимание, ты работал не с градусами, а с радианами ! (Sin/Cos вычисляют функцию аргумента, заданного именно в радианах). Я перевел это в градусы...

Еще одно добавление - переменная _T, показывающая на сколько частей делить каждый градус при вычислении функций (она используется потом и при расчетах тоже)... Чем больше значение _T, тем ближе точки графика. НО: одновременно с этим во столько же раз увеличивается используемый буфер, и если ты задашь _T больше, чем (65520 div (360 * SizeOf(Real))), т. е. больше 30, то твоя программа перестанет компилироваться в Турбо Паскале, ибо там размер массива ограничен размером сегмента...

Автор: Kolt 9.11.2006 4:29

Спасибо так гораздо красивее smile.gif Сейчас ещё только заголовок добавлю и хоть завтра сдавай...

Цитата

НО: одновременно с этим во столько же раз увеличивается используемый буфер, и если ты задашь _T больше, чем (65520 div (360 * SizeOf(Real))), т. е. больше 30, то твоя программа перестанет компилироваться в Турбо Паскале, ибо там размер массива ограничен размером сегмента...

У меня уже при 15 тормозит

Автор: Kolt 9.11.2006 4:46

Ещё вопросик, как можно найти свободное место над графиком и подписать его мол y=cos(n,x)

Автор: volvo 9.11.2006 4:57

Цитата
У меня уже при 15 тормозит
Ну, само собой, у тебя же 2 массива (A и B), а я посчитал для одного...

Цитата
как можно найти свободное место над графиком

Что значит "найти"? Ты хочешь программно искать?

Автор: Kolt 9.11.2006 17:34

Цитата
Что значит "найти"? Ты хочешь программно искать?

Да чтобы программа сама нашла место над линией графика и подписала его, чтобы подпись не перекрывала сам график. Есть какие-нибудь идеи?

Автор: volvo 9.11.2006 17:42

Есть, конечно... Высоту подписи ты знаешь (TextHeight('y=cos(n,x)')), аналогично же находится и ширина подписи, правда? Вот и проходи по линии высотой Height, отстоящей на Width символов от левой (или правой) границы поля, и проверяй, есть там пикселы с цветом, равным цвету графика, или нет... Если нет - сдвигайся еще правее/левее, и опять проверяй... Можешь двигаться и по диагонали, и по вертикали, выбирай, что тебе удобнее... Как только нашел пиксел красного цвета - возвращаешься на 1 шаг назад, и выводишь надпись... Идея понятна?

Автор: Kolt 10.11.2006 22:00

Да, идея понятна, попробую реализовать, но может получится так что надпись выйдет за рамку графика или пересечет её, тогда нужно пробег уменьшить что ли на "минус" ширину/высоту справа, или "плюс" слева