<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=913749</guid>
        <pubDate>Fri, 11 Nov 2005 21:36:13 +0000</pubDate>
        <title>Как нарисовать график функции</title>
        <link>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=913749</link>
        <description><![CDATA[Romtek: и картинка графика в полярной системе координат:]]></description>
        <author>Romtek</author>
        <category>Pascal: Графика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=913747</guid>
        <pubDate>Fri, 11 Nov 2005 21:35:02 +0000</pubDate>
        <title>Как нарисовать график функции</title>
        <link>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=913747</link>
        <description><![CDATA[Romtek: Вот картинка графика в параметрической системе координат:]]></description>
        <author>Romtek</author>
        <category>Pascal: Графика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=358580</guid>
        <pubDate>Fri, 14 May 2004 22:04:03 +0000</pubDate>
        <title>Как нарисовать график функции</title>
        <link>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=358580</link>
        <description><![CDATA[romtek: А вот графики в<br>- параметрической С.К. (plotgraf2.pas)<br>- полярной С.К. (plotgraf3.pas)]]></description>
        <author>romtek</author>
        <category>Pascal: Графика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=344659</guid>
        <pubDate>Fri, 23 Apr 2004 21:16:32 +0000</pubDate>
        <title>Как нарисовать график функции</title>
        <link>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=344659</link>
        <description><![CDATA[romtek: Мой вариант:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{$N+,E-}</div><div class="code_line">&nbsp;</div><div class="code_line">uses Crt,Graph;</div><div class="code_line">&nbsp;</div><div class="code_line">type TFunction=function(x:real):real;</div><div class="code_line">&nbsp;</div><div class="code_line">Const Scale=80.0; { Коэффициент увеличения графика }</div><div class="code_line">var cx,cy, { центр, точка отсчета }</div><div class="code_line">&nbsp;&nbsp; &nbsp;mx,my: integer; { Максимальные значения по X и Y }</div><div class="code_line">&nbsp;</div><div class="code_line">function InitGraphics: integer;</div><div class="code_line">Var grDriver, grMode : Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; grDriver:=Detect;</div><div class="code_line">&nbsp;&nbsp; &nbsp; InitGraph(grDriver, grMode, &#39;..\bgi&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; InitGraphics:=GraphResult;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function CoordX(X: real): integer; {графика не признает действительных чисел}</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; CoordX:=cx+Trunc(X*Scale);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function CoordY(Y: real): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; CoordY:=cy-Trunc(Y*Scale);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function MyVeryCoolFunction(MyVar:real):real; Far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;MyVeryCoolFunction:=sin(exp(MyVar));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure PlotAxis;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; SetColor(LightBlue);</div><div class="code_line">&nbsp;&nbsp; &nbsp; Line(0,cy,mx,cy);</div><div class="code_line">&nbsp;&nbsp; &nbsp; Line(cx,0,cx,my);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure DrawGraph(PF: Pointer; a,b: real);</div><div class="code_line">var F: TFunction;</div><div class="code_line">&nbsp;&nbsp; &nbsp;temp,</div><div class="code_line">&nbsp;&nbsp; &nbsp;Step, { Шаг }</div><div class="code_line">&nbsp;&nbsp; &nbsp;x,y,</div><div class="code_line">&nbsp;&nbsp; &nbsp;Minimum,Maximum: real;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Net;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;z,t: real;</div><div class="code_line">&nbsp;&nbsp; &nbsp;i,j: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;s: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; SetColor(Red);</div><div class="code_line">&nbsp;&nbsp; &nbsp; z:=a;</div><div class="code_line">&nbsp;&nbsp; &nbsp; t:=(b-a)/10.0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; while z&#60;=b do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;str(z:0:1,s);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i:=CoordX(z);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Line(i,cy-2,i,cy+2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OutTextXY(i,cy+6,s);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;z:=z+t;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; SetColor(LightRed);</div><div class="code_line">&nbsp;&nbsp; &nbsp; SetLineStyle(DottedLn, 0, NormWidth);</div><div class="code_line">&nbsp;&nbsp; &nbsp; j:=CoordY(Minimum);</div><div class="code_line">&nbsp;&nbsp; &nbsp; Line(0,j,mx,j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; j:=CoordY(Maximum);</div><div class="code_line">&nbsp;&nbsp; &nbsp; Line(0,j,mx,j);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; @F:=PF;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; {если А=Б, то график - точка}</div><div class="code_line">&nbsp;&nbsp; &nbsp; if a=b then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; putpixel(CoordX(a),CoordX(F(a)),Yellow);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; exit</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if a&#62;b then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; temp:=a;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; a:=b;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; b:=temp; {поменяли местами}</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; {интервал изменения значения ф-и, чтобы каждый раз не считать}</div><div class="code_line">&nbsp;&nbsp; &nbsp; Step:=(b-a)/(MX+1)*1.0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; {теперь считаем диапазон значений ф-и}</div><div class="code_line">&nbsp;&nbsp; &nbsp; Minimum:=F(a);</div><div class="code_line">&nbsp;&nbsp; &nbsp; Maximum:=Minimum;</div><div class="code_line">&nbsp;&nbsp; &nbsp; x:=a;</div><div class="code_line">&nbsp;&nbsp; &nbsp; MoveTo(CoordX(x),CoordY(F(x)));</div><div class="code_line">&nbsp;&nbsp; &nbsp; SetColor(Yellow);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; {собственно рисуем}</div><div class="code_line">&nbsp;&nbsp; &nbsp; while x&#60;=b do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; x:=x+Step;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; y:=F(x); { вычисление значения функции в точке }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; LineTo(CoordX(x),CoordY(y)); {из предыдущего положения - в текущее, а предыдущее</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; сначала задается MoveTo, его помнит модуль графики}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if Minimum&#60;y then Minimum:=y;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if Maximum&#62;y then Maximum:=y;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; {график нарисовали, теперь оформлЯем}</div><div class="code_line">&nbsp;&nbsp; &nbsp; Net;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if InitGraphics&#60;&#62;grOK then Exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; MX := GetMaxX;</div><div class="code_line">&nbsp;&nbsp; &nbsp; MY := GetMaxY;</div><div class="code_line">&nbsp;&nbsp; &nbsp; CX := MX div 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; CY := MY div 2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PlotAxis;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; DrawGraph(@MyVeryCoolFunction,-4.0,4.0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; repeat until keypressed;</div><div class="code_line">&nbsp;&nbsp; &nbsp; CloseGraph;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Проверено в Turbo Pascal и Free Pascal.<br>
Внизу картинка графика.]]></description>
        <author>romtek</author>
        <category>Pascal: Графика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=344312</guid>
        <pubDate>Fri, 23 Apr 2004 12:37:53 +0000</pubDate>
        <title>Как нарисовать график функции</title>
        <link>https://forum.sources.ru/index.php?showtopic=52226&amp;view=findpost&amp;p=344312</link>
        <description><![CDATA[Vesper: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type TFunction=function(x:real):real;</div><div class="code_line">procedure drawgraph(f:TFunction;a,b:real);</div><div class="code_line">var i,j:integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;d,dd,x,y,m,mm:real;</div><div class="code_line">&nbsp;&nbsp; &nbsp;s:string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if a=b then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;putpixel(getmaxx div 2,getmaxy div 2,14);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit end; {если А=Б, то график - точка, а уж где она будет...}</div><div class="code_line">&nbsp;&nbsp;if a&#62;b then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;d:=a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;a:=b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;b:=d; {поменяли местами}</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;d:=(b-a)/(getmaxx-1); {интервал изменения значения ф-и, чтобы каждый раз не считать}</div><div class="code_line">&nbsp;&nbsp;{теперь считаем диапазон значений ф-и}</div><div class="code_line">&nbsp;&nbsp;m:=f(a);</div><div class="code_line">&nbsp;&nbsp;mm:=f(a);</div><div class="code_line">&nbsp;&nbsp;x:=a;</div><div class="code_line">&nbsp;&nbsp;while x&#60;=b do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;x:=x+d;</div><div class="code_line">&nbsp;&nbsp; &nbsp;y:=f(x); {вот это собственно и есть график, хехе. Мы его просто пока не рисуем}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if m&#60;y then m:=y;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if mm&#62;y then mm:=y;</div><div class="code_line">&nbsp;&nbsp;end; {теперь М - это максимум, ММ - минимум}</div><div class="code_line">&nbsp;&nbsp;dd:=(m-mm)/(getmaxy-1);</div><div class="code_line">&nbsp;&nbsp;{собственно рисуем}</div><div class="code_line">&nbsp;&nbsp;i:=1;</div><div class="code_line">&nbsp;&nbsp;x:=a;</div><div class="code_line">&nbsp;&nbsp;y:=f(a);</div><div class="code_line">&nbsp;&nbsp;setcolor(14);</div><div class="code_line">&nbsp;&nbsp;str(y:0:3,s);</div><div class="code_line">&nbsp;&nbsp;j:=getmaxy-trunc((y-mm)/dd); {графика не признает действительных чисел}</div><div class="code_line">&nbsp;&nbsp;if j&#62;getmaxy-40 then outtextxy(1,j-15,s) else outtextxy(1,j+10,s); {выводим начальное значение F(a)}</div><div class="code_line">&nbsp;&nbsp;setcolor(12);</div><div class="code_line">&nbsp;&nbsp;str(a:0:2,s);</div><div class="code_line">&nbsp;&nbsp;if j&#62;getmaxy div 2 then outtextxy(1,1,s) else outtextxy(1,getmaxy-textheight(s)-1,s); {это значение А}</div><div class="code_line">&nbsp;&nbsp;setcolor(11);</div><div class="code_line">&nbsp;&nbsp;moveto(i,j);</div><div class="code_line">&nbsp;&nbsp;while x&#60;=b do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;x:=x+d;</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(i); {смещение Х на D эквивалентно смещению точки на 1 по экрану}</div><div class="code_line">&nbsp;&nbsp; &nbsp;y:=f(x);</div><div class="code_line">&nbsp;&nbsp; &nbsp;j:=getmaxy-trunc((y-mm)/dd); </div><div class="code_line">&nbsp;&nbsp; &nbsp;lineto(i,j); {из предыдущего положения - в текущее, а предыдущее сначала задается moveto&#39;м, а потом его помнит модуль графики}</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;{график нарисовали, теперь оформлЯем}</div><div class="code_line">&nbsp;&nbsp;setcolor(14);</div><div class="code_line">&nbsp;&nbsp;str(y:0:3,s);</div><div class="code_line">&nbsp;&nbsp;if j&#62;getmaxy-40 then outtextxy(getmaxx-textwidth(s)-1,j-15,s) else outtextxy(getmaxx-textwidth(s)-1,j+10,s); {такой трюк для того, чтобы все цифры поместились на экране}</div><div class="code_line">&nbsp;&nbsp;setcolor(12);</div><div class="code_line">&nbsp;&nbsp;str(b:0:2,s);</div><div class="code_line">&nbsp;&nbsp;if j&#62;getmaxy div 2 then outtextxy(getmaxx-textwidth(s)-1,1,s) else outtextxy(getmaxx-textwidth(s)-1,getmaxy-textheight(s)-1,s); </div><div class="code_line">&nbsp;&nbsp;{ну и хватит}</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Надо же, всего одна ошибка, не ту разницу по Y ставил. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='8' style='font-size:8pt;'><strong class='tag-b'>Добавлено в <time class="tag-mergetime" datetime="2004-04-23T13:08:50+00:00">23.04.04, 13:08</time></strong>:</span></span><br>
Так. Теперь как все это работает.<br>
<br>
Сначала проверяется корректность данных. Вообще-то в любой функции должна быть какая-то проверка входящих данных. Считается, что А меньше Б, но нам могут подсунуть что угодно.<br>
<br>
Считается интервал взятия последовательных Х. Нам не нужна большая точность здесь, хватает смещать точку на графике на один пиксел по горизонтали. Начинается экран с Х=1, туда ставим Х=А, а заканчивается видимая часть в GetMaxX, который может меняться в зависимости от установленного видеорежима. (320, 640, 720, 800, 1024, какие есть драйверы графики в руках.) Посему и шаг взятия значений функции нужно менять.<br>
<br>
Первый цикл while x&lt;=b do begin... ищет границы изменения функции на указанном промежутке. Если нам дали f(x)=1/x, A=-1, B=1, то получится деление на 0. Ну и ладно, пусть программист думает, что он подсунул. Просчет очень простой, проходим по отрезку и ищем максимум и минимум, запоминая их в переменных М и ММ.<br>
<br>
Аналогичным способом берется шаг отображения по оси ординат, переменная DD.<br>
<br>
Строим график, в начале выводим красным цветом А и желтым Y=F(A). График строится как кривая линия с линейной же интерполяцией. А зачем нам больше? В каждом взятом Х берем Y и рассчитываем точку, в которую нужно вести линию. Минимум значения Y соответствует значению GetMaxY, который опять же зависит от установленного режима, а максимум соответствует всегда единице. <br>
<br>
Дошли до конца, выводим на экран конечные значения B, F(B).<br>
<br>
Для того, чтобы можно было передать функцию, она должна быть объявлена так же, как написано в типе (только необязательно, чтобы переменная в формальных параметрах называлась так же), и она должна быть объявлена как далекая (после ее заголовка должна идти директива FAR.) Например вот так:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function MyVeryCoolFunction(MyVar:real):real; far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;MyVeryCoolFunction:=exp(sin(MyVar));</div><div class="code_line">end;</div></ol></div></div></div></div> А передаваться она должна как переменная, т.е. ее необходимо присвоить заведенной где-нибудь переменной типа TFunction.]]></description>
        <author>Vesper</author>
        <category>Pascal: Графика</category>
      </item>
	
      </channel>
      </rss>
	