Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2011, 15:41   #1
HeRo!N
 
Регистрация: 20.04.2011
Сообщений: 3
По умолчанию Как сделать чтобы при функции sqr(x) засечки на оси не слипались

Как сделать чтобы при функции sqr(x) засечки на оси не слипались, а просто подписывались по-другому, т.е не 1,2,3,4.. а 10,20,30,40 и т.п. ну и чтобы график в соответствии масштабировался?

Код:
uses graph;
function F(x:real):real;
var y1,y2:real;
begin
{if x=-2 then y1:=0 else y1:=exp(ln(sqr(x+2))/3);
if x=2 then y2:=0 else y2:=exp(ln(sqr(x-2))/3);
F:=y1-y2;}
F:=sqr(x);
end;
var xn,xk,max,min,z,x,y,mx,my,dx:real;
    x0,y0,i,px,py:integer;
    s:string;
begin
x0:=0;
initgraph(x0,y0,'');
y0:=getmaxX div 2;{центр экрана}
x0:=getmaxY div 2;
xn:=-10;xk:=10;{интервал по Х}
mx:=(x0-20)/xk;{масштаб по Х}
{найдем максимум и минимум для масштаба по У}
max:=F(xn);min:=max;
x:=xn;
while x<=xk do
 begin
 x:=x+0.01;
  if F(x)>max then max:=F(x)
  else if F(x)<min then min:=F(x);
 end;
if max>abs(min) then z:=max else z:=abs(min);
my:=(y0-100)/z;{по У}
setbkcolor(15);{цвет фона}
setcolor(8);{цвет линий}
line(0,x0,getmaxX,x0);{оси}
line(y0,0,y0,getmaxY);
for i:=1 to round(xk-xn)+1 do{максимальное количество засечек в одну сторону}
  begin
    line(y0-3,x0+round(i*mx),y0+3,x0+round(i*mx));{засечки на оси X}
    line(y0-3,x0-round(i*mx),y0+3,x0-round(i*mx));
    line(y0+round(i*my),x0-3,y0+round(i*my),x0+3); {засечки на оси Y}
    line(y0-round(i*my),x0-3,y0-round(i*my),x0+3);
    str(i,s);
     {подпись оси X}
    outtextXY(y0-35,x0+round(i*mx),'-'+s);{соответственно засечкам}
    outtextXY(y0-35,x0-round(i*mx),s);
    {подпись оси Y}
    str(i,s);
    outtextXY(y0+round(i*my),x0+10,s);
    outtextXY(y0-round(i*my),x0+10,'-'+s);
  end;
{центр}
outtextXY(y0+5,x0+10,'0');
{подписи концов осей}
outtextXY(getmaxX-10,x0-10,'Y');
outtextXY(y0-10,10, 'X');
setcolor(8);
{график}
x:=xk;
dx:=0.3;
setcolor(4);
while x>=xn do
 begin
   x:=x-dx; {наращиваем х}
  px:=x0+round(x*mx); {изменение по оси Х}
  y:=F(x); {график в реальных координатах}
  py:=y0+round(y*my);{в экранных}
  outtextxy(py,px,'*');
 end;
readln;
end.

Последний раз редактировалось HeRo!N; 20.04.2011 в 15:44.
HeRo!N вне форума Ответить с цитированием
Старый 20.04.2011, 16:41   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
т.е не 1,2,3,4.. а 10,20,30,40 и т.п.
видимо рисовать не все а только каждую десятую
Код:
if i mod 10 =0 then begin
    line(y0-3,x0+round(i*mx),y0+3,x0+round(i*mx));{засечки на оси X}
    line(y0-3,x0-round(i*mx),y0+3,x0-round(i*mx));
end;
if i mod 10 =0 then begin
    line(y0+round(i*my),x0-3,y0+round(i*my),x0+3); {засечки на оси Y}
    line(y0-round(i*my),x0-3,y0-round(i*my),x0+3);
end;
то же и для надписей
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.04.2011, 16:57   #3
HeRo!N
 
Регистрация: 20.04.2011
Сообщений: 3
По умолчанию

Ну а как будет выглядить условие <Если график не влазит в экран, то тогда сжимаем его и рисуем засечки в виде 10,20,30,40...и т.п.>?
HeRo!N вне форума Ответить с цитированием
Старый 20.04.2011, 17:14   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
график не влазит в экран
число точек графика > число точек экрана
Цитата:
тогда сжимаем его
новое число точек графика = старое число точек DIV масштаб

на самом деле задачу ставить по другому
есть минимальная и максимальное значения требующие отображения.
есть минимальное расстояние межу разными соседними (визуально) точками
или максимально возможное число отображаемых точек( ~разрешение)
есть минимальное визуально различимое расстояние между засечками
по эти величинам определяем определяем шаг графика и шаг засечки.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.04.2011 в 17:26.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так чтобы при наведение мыши subbota HTML и CSS 3 03.03.2016 09:36
Как сделать,чтобы программа работала при низком разрешение монитора? RomanDemidov Общие вопросы Delphi 5 13.12.2010 19:10
как сделать так, чтобы при записи макроса имена формул peq Microsoft Office Excel 11 29.10.2010 15:18
Как сделать, чтобы при переходе по ссылке включалась подсветка текста? Benderbej JavaScript, Ajax 2 03.09.2010 11:09
Как сделать так,чтобы при нажатии на кнопку выполнялась процедура? Bolgarin Общие вопросы Delphi 10 03.06.2008 23:48