<?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=51648&amp;view=findpost&amp;p=354238</guid>
        <pubDate>Sat, 08 May 2004 14:16:12 +0000</pubDate>
        <title>Геометрия на плоскости</title>
        <link>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=354238</link>
        <description><![CDATA[tserega: <div class='tag-align-center'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='11' style='font-size:11pt;'>Нахождение центра описанной окружности</span></span></div><br>
<br>
Из школьной программы известно, что через три точки, не лежащие на одной прямой, проходит окружность, притом только одна. Уравнение окружности с центром (x0, y0) и радиусом r выглядит так:<br>
(x - x0)^2 + (y - y0)^2 = r^2.<br>
Пусть известно, что окружность идет через точки с координатами (x1, y1), (x2, y2) и (x3, y3). Это обозначает, что будут выполняться условия:<br>
(x1 - x0)^2 + (y1 - y0)^2 = r^2<br>
(x2 - x0)^2 + (y2 - y0)^2 = r^2<br>
(x3 - x0)^2 + (y3 - y0)^2 = r^2<br>
Получаем три уравнения с тремя неизвестными. Осталось аккуратно открыть скобки, произвести нехитрые действия (на самом деле, система сводиться к трем линейным уравнениям, которые решить можно как угодно, хотя бы методом Крамера, что и сделано в программе).<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">Type TPoint = Record {Тип точка}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;X, Y : Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp; End;</div><div class="code_line">&nbsp;</div><div class="code_line">{Поиск центра описанной окружности. Если точки лежат на одной прямой, функция возвращает false, иначе true}</div><div class="code_line">Function FindOuterRadius(A, B, C : TPoint; Var Rr : TPoint): Boolean;</div><div class="code_line">Var M : Array[1..2,1..3] Of Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp;D, Dx, Dy : Extended;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;M[1, 1] := 2 * (A.X - B.X);</div><div class="code_line">&nbsp;M[1, 2] := 2 * (A.Y - B.Y);</div><div class="code_line">&nbsp;M[1, 3] := Sqr(A.X) +Sqr(A.Y) - (Sqr(B.X) + Sqr(B.Y));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;M[2, 1] := 2 * (B.X - C.X);</div><div class="code_line">&nbsp;M[2, 2] := 2 * (B.Y - C.Y);</div><div class="code_line">&nbsp;M[2, 3] := Sqr(B.X) +Sqr(B.Y) - (Sqr(C.X) + Sqr(C.Y));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;D := M[1, 1] * M[2, 2] - M[2, 1] * M[1, 2];</div><div class="code_line">&nbsp;Dx := M[1, 3] * M[2, 2] - M[2, 3] * M[1, 2];</div><div class="code_line">&nbsp;Dy := M[1, 1] * M[2, 3] - M[2, 1] * M[1, 3];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;If D &#60;&#62; 0 Then</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; Rr.X := Dx/D;</div><div class="code_line">&nbsp;&nbsp; Rr.Y := Dy/D;</div><div class="code_line">&nbsp;&nbsp; FindOuterRadius := True;</div><div class="code_line">&nbsp;&nbsp;End Else</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; Rr.X := 0;</div><div class="code_line">&nbsp;&nbsp; Rr.Y := 0;</div><div class="code_line">&nbsp;&nbsp; FindOuterRadius := False;</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">End;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> <br>
<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-05-08T18:34:42+04:00">08.05.04, 14:34</time></strong>:</span></span><br>
<div class='tag-align-center'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='11' style='font-size:11pt;'>Проведение параболы через три точки</span></span></div><br>
<br>
Через три точки, не лежащие на одной прямой проходит парабола, причем только одна (если три точки лежат на одной прямой, то парабола вырождается в прямую линию).<br>
<br>
Даны три точки A(x1, y1), B(x2, y2) и C(x3, y3), через которые надо провести параболу.<br>
Уравнение параболы y = ax^2 + bx + c.<br>
Составим систему с неизвестными a, b и c:<br>
y1 = a*x1^2 + b*x1 + c<br>
y2 = a*x2^2 + b*x2 + c<br>
y3 = a*x3^2 + b*x3 + c<br>
которая эквивалентна данной:<br>
a(x1^2 - x2^2) + b(x1 - x2) = y1 - y2<br>
a(x2^2 - x3^2) + b(x2 - x3) = y2 - y3<br>
c = y1 - a*x1^2 - b*x1<br>
Первые два уравения решаются методом Крамера через определители второго порядка. Коэфициент c находится из третьего уравнения.<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">Type TPoint = Record</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;X, Y : Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp; End;</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure Parabola(A, B, C : TPoint; Var KoefA, KoefB, KoefC : Extended);</div><div class="code_line">Var M : Array[1..2, 1..3] Of Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp;D, Da, Db : Extended;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;M[1, 1] := Sqr(A.X) - Sqr(B.X);</div><div class="code_line">&nbsp;M[1, 2] := A.X - B.X;</div><div class="code_line">&nbsp;M[1, 3] := A.Y - B.Y;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;M[2, 1] := Sqr(B.X) - Sqr(C.X);</div><div class="code_line">&nbsp;M[2, 2] := B.X - C.X;</div><div class="code_line">&nbsp;M[2, 3] := B.Y - C.Y;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;D := M[1, 1] * M[2, 2] - M[1, 2] * M[2, 1];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;If D &#60;&#62; 0 Then</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; Da := M[1, 3] * M[2, 2] - M[2, 3] * M[1, 2];</div><div class="code_line">&nbsp;&nbsp; Db := M[1, 1] * M[2, 3] - M[1, 2] * M[1, 3];</div><div class="code_line">&nbsp;&nbsp; KoefA := Da / D;</div><div class="code_line">&nbsp;&nbsp; KoefB := Db / D;</div><div class="code_line">&nbsp;&nbsp; KoefC := A.Y - KoefA * Sqr(A.X) - KoefB * A.X;</div><div class="code_line">&nbsp;&nbsp;End</div><div class="code_line">&nbsp;&nbsp;Else</div><div class="code_line">&nbsp;&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; KoefA := 0; KoefB := 0; KoefC := 0;</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Var A, B, C : TPoint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;KoefA, KoefB, KoefC : Extended;</div><div class="code_line">&nbsp;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;A.X := -1; A.Y := 1;</div><div class="code_line">&nbsp;B.X := &nbsp;0; B.Y := 0;</div><div class="code_line">&nbsp;C.X := &nbsp;1; C.Y := 2;</div><div class="code_line">&nbsp;Parabola(A, B, C, KoefA, KoefB, KoefC);</div><div class="code_line">&nbsp;Writeln(&#39;y = &#39;, KoefA:10:10, &#39;x^2 + &#39;, KoefB:10:10, &#39;x + &#39;, KoefC:10:10);</div><div class="code_line">End.</div></ol></div></div></div></div><br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Сообщения были разделены в тему &quot;<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=304153' target='_blank'>Построение выпуклой оболочки</a>&quot;</span></span>]]></description>
        <author>tserega</author>
        <category>Pascal: Математика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=354203</guid>
        <pubDate>Sat, 08 May 2004 13:11:44 +0000</pubDate>
        <title>Геометрия на плоскости</title>
        <link>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=354203</link>
        <description><![CDATA[tserega: <div class='tag-align-center'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='11' style='font-size:11pt;'>Найти радиус вписанной окружности</span></span></div><br>
<br>
Дан треугольник со сторонами A, B, C. Требуется найти радиус вписанной окружности. Вывести рисунок на экран в графическом режиме.<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">uses crt,graph;</div><div class="code_line">&nbsp;</div><div class="code_line">{Инициализация графики}</div><div class="code_line">Procedure InitGr;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;grDriver: Integer;</div><div class="code_line">&nbsp;&nbsp;grMode: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;grDriver := Detect;</div><div class="code_line">&nbsp;&nbsp;InitGraph(grDriver, grMode,&#39;..\BGI&#39;);</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">{Вычисление площади треугольника}</div><div class="code_line">Function Square(A, B, C : Extended) : Extended;</div><div class="code_line">Var P : Extended;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;P:=(A + B + C) / 2;</div><div class="code_line">&nbsp;Square:=Sqrt(P * (P - A) * (P - B) * (P - C));</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">{Вычисление радиуса треугольника}</div><div class="code_line">Function Radius(A, B, C : Extended) : Extended;</div><div class="code_line">{S = p*r =&#62; r = S/p}</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Radius:=2 * Square(A, B, C) / (A + B + C);</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">{Рисование всей картинки: A, B, C - стороны треугольника, X, Y - координаты на экране, Scale - масштаб}</div><div class="code_line">Procedure Draw(A, B, C : Extended; X, Y : Longint; Scale : Extended);</div><div class="code_line">Var R : Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp;X1, Y1, X2, Y2, X3, Y3 : Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SinAlpha, CosAlpha : Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TgAlphaDiv2, SinAlphaDiv2, CosAlphaDiv2 : Extended;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Xr, Yr : Extended;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;A := A * Scale; B := B * Scale; C := C * Scale;</div><div class="code_line">&nbsp;R := Radius(A, B, C);</div><div class="code_line">&nbsp;{Пусть одна из сторон будет нарисована горизонтальной}</div><div class="code_line">&nbsp;X1 := 0; Y1 := 0;</div><div class="code_line">&nbsp;X2 := C; Y2 := 0;</div><div class="code_line">&nbsp;{Найдем координаты третей вершины. Сначала найдем синус и косинус одного из углов треугольника}</div><div class="code_line">&nbsp;CosAlpha := (Sqr(B) + Sqr( C ) - Sqr(A)) / (2 * B * C);</div><div class="code_line">&nbsp;SinAlpha := Sqrt(1 - Sqr(CosAlpha));</div><div class="code_line">&nbsp;X3 := B * CosAlpha;</div><div class="code_line">&nbsp;Y3 := B * SinAlpha;</div><div class="code_line">&nbsp;{Чертим треугольник}</div><div class="code_line">&nbsp;Line(X + Round(X1), Y + Round(Y1), X + Round(X2), Y + Round(Y2));</div><div class="code_line">&nbsp;Line(X + Round(X1), Y + Round(Y1), X + Round(X3), Y + Round(Y3));</div><div class="code_line">&nbsp;Line(X + Round(X3), Y + Round(Y3), X + Round(X2), Y + Round(Y2));</div><div class="code_line">&nbsp;{Центр вписанной окружности лежит в точке пересечения биссектрис}</div><div class="code_line">&nbsp;CosAlphaDiv2 := Sqrt((1 + CosAlpha) / 2);</div><div class="code_line">&nbsp;SinAlphaDiv2 := Sqrt(1 - Sqr(CosAlphaDiv2));</div><div class="code_line">&nbsp;TgAlphaDiv2 := SinAlphaDiv2 / CosAlphaDiv2;</div><div class="code_line">&nbsp;{Найдем координаты центра окружности}</div><div class="code_line">&nbsp;Xr := R / TgAlphaDiv2;</div><div class="code_line">&nbsp;Yr := R;</div><div class="code_line">&nbsp;{Рисуем окружность}</div><div class="code_line">&nbsp;Circle(X + Round(Xr), Y + Round(Yr), Round(R));</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;InitGr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Draw(6, 5, 6, 100, 200, 30.0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;repeat until keypressed;</div><div class="code_line">&nbsp;&nbsp;CloseGraph;</div><div class="code_line">End.</div></ol></div></div></div></div>]]></description>
        <author>tserega</author>
        <category>Pascal: Математика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=352024</guid>
        <pubDate>Wed, 05 May 2004 11:31:53 +0000</pubDate>
        <title>Геометрия на плоскости</title>
        <link>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=352024</link>
        <description><![CDATA[tserega: <div class='tag-align-center'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='11' style='font-size:11pt;'>Определить, что точка находиться внутри треугольника</span></span></div><br>
<br>
Определить, что точка находиться внутри <span class='tag-u'>треугольника</span> можно намного проще.<br>
Пусть даны координаты вершин треуголькика, т.е. координаты вершин A, B и C. Надо определить, находится ли точка D внутри или снаружи. Если S(ABC) = S(ABD) + S(ACD) + S(BCD), то точка лежит внутри (это видно чисто геометрически). В противном случае точка лежит вне треуголькика. <br>
Вот реализация функции:<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">Const</div><div class="code_line">&nbsp;&nbsp; Epsilon = 1e-6;</div><div class="code_line">Function InTriangle(X1,Y1,X2,Y2,X3,Y3,X,Y:Real):Boolean;</div><div class="code_line">{ &nbsp; &nbsp;/</div><div class="code_line">&nbsp;&nbsp; &nbsp;/ \</div><div class="code_line">&nbsp;&nbsp; b &nbsp; c</div><div class="code_line">&nbsp;/ &nbsp; &nbsp; &nbsp;\</div><div class="code_line">------a---</div><div class="code_line">}</div><div class="code_line">Function Dist(XX1,YY1,XX2,YY2:Real):Real;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Dist:=Sqrt (Sqr(XX2 - XX1) + Sqr(YY2 - YY1));</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Function Square(A,B,C:Real):Real;</div><div class="code_line">Var P:Real;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;P := (A + B + C) / 2;</div><div class="code_line">&nbsp;Square := Sqrt (P * (P - A) * (P - B) * (P - C));</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp; Ab,Ac,Bc:Real;</div><div class="code_line">&nbsp;&nbsp; S,S1:Real;</div><div class="code_line">&nbsp;&nbsp; Da,Db,Dc:Real;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Ab := Dist(X1, Y1, X2, Y2);</div><div class="code_line">&nbsp;Bc := Dist(X2, Y2, X3, Y3);</div><div class="code_line">&nbsp;Ac := Dist(X1, Y1, X3, Y3);</div><div class="code_line">&nbsp;S := Square(Ab, Bc, Ac);</div><div class="code_line">&nbsp;Da := Dist(X1, Y1, X, Y);</div><div class="code_line">&nbsp;Db := Dist(X2, Y2, X, Y);</div><div class="code_line">&nbsp;Dc := Dist(X3, Y3, X, Y);</div><div class="code_line">&nbsp;S1 := Square(Ac, Da, Dc) + Square(Ab, Db, Da) + Square(Bc, Db, Dc);</div><div class="code_line">&nbsp;InTriangle := Abs(S - S1) &#60; Epsilon;</div><div class="code_line">End.</div></ol></div></div></div></div>]]></description>
        <author>tserega</author>
        <category>Pascal: Математика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=348976</guid>
        <pubDate>Thu, 29 Apr 2004 17:42:05 +0000</pubDate>
        <title>Геометрия на плоскости</title>
        <link>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=348976</link>
        <description><![CDATA[tserega: <div class='tag-align-center'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='11' style='font-size:11pt;'>Построение выпуклой оболочки множества</span></span></div><br>
<br>
<span class='tag-u'>Выпуклая оболочка множества точек</span> - минимальный многоугольник, который содежит все точки данного множества.<br>
<strong class='tag-b'>Алгоритм решения задачи</strong>: скажем, что начальная вершина V = V0 - самая нижняя (если таких несколько, то самая правая). Выберем произвольную ось (допустим, параллельную оси ОХ и идущую через первую вершину). Для каждой вершины T найдем углы между осью ОХ и отрезком VT. Выберем наименьший такой угол (углы считаются против часовой стрекли с &quot;3 часов&quot;). Выведем вершину T. Теперь присвоим V = T. Когда T = V0 - алгоритм заканчивается.<br>
<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">{ Построение выпуклой оболочки множества }</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TPoint = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;x,y: Integer;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;MaxN = 400;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;N: Integer;</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">&nbsp;&nbsp;P: array [1..MaxN] of TPoint; &nbsp; &nbsp; { Точки множества }</div><div class="code_line">&nbsp;&nbsp;Used: array [1..MaxN] of Boolean;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;First,Point,NewPoint: Integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;procedure WritePoint(i: Integer);</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(&#39;[&#39;,i:3,&#39;] (&#39;,P[i].x, &#39;;&#39;, P[i].y, &#39;)&#39;);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function Bigger(P,P1,P2: TPoint): Boolean;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Bigger := (P1.x - P.x) * (P2.y - P.y) - (P1.y - P.y) * (P2.x - P.x) &#62; 0;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;assign(input,&#39;input.txt&#39;); reset(input);</div><div class="code_line">&nbsp;&nbsp;Readln(N);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;First:=1;</div><div class="code_line">&nbsp;&nbsp;for i:=1 to N do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Readln(P[i].x, P[i].y);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (P[i].y &#60; P[First].y) then First:=i else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (P[i].y = P[First].y) and (P[i].x &#60; P[First].x) then First:=i;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;close(input);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;FillChar(Used,SizeOf(Used),False);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;Выпуклая оболочка идет через вершины: &#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Point:=First;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;WritePoint(Point); Used[Point]:=True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;NewPoint:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Поиск следующей вершины }</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=1 to N do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if i &#60;&#62; Point then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (NewPoint = 0) or (Bigger(P[Point], P[i], P[NewPoint]))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;then NewPoint:=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Point:=NewPoint;</div><div class="code_line">&nbsp;&nbsp;until Point = First;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div>]]></description>
        <author>tserega</author>
        <category>Pascal: Математика</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=340258</guid>
        <pubDate>Sat, 17 Apr 2004 13:55:45 +0000</pubDate>
        <title>Геометрия на плоскости</title>
        <link>https://forum.sources.ru/index.php?showtopic=51648&amp;view=findpost&amp;p=340258</link>
        <description><![CDATA[romtek: <div class='tag-align-center'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='11' style='font-size:11pt;'>Определение принадлежности точки к многоугольнику.</span></span></div><br>
<br>
<strong class='tag-b'>Алгоритм</strong>: Точка лежит внутри многоугольника, если кол-во точек пересечения нечетно.<br>
   Все   отрезки кроме горизонтальных проверяются на пересечение с горизонтальным лучом,<br>
   выходящим из проверяемой точки.<br>
   При попадании луча в вершину пересечение засчитывается только с теми отрезками,<br>
   выходящими из вершины, для которых она является верхней.<br>
На границе значение функции не определено.<br>
<hr><strong class='tag-b'><span class='tag-u'>Примечание:</span> порядок ввода точек должен быть против часовой стрелки.</strong><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">{</div><div class="code_line">&nbsp;&nbsp; Code by VanDamM // [WRC]</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">Program Check_Point_In_Poly;</div><div class="code_line">Uses Crt;</div><div class="code_line">&nbsp;</div><div class="code_line">Type Point = Record &nbsp; { тип точка }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;x, y : integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; End;</div><div class="code_line">&nbsp;</div><div class="code_line">Var &nbsp;PointXY : Point; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { проверяемая точка }</div><div class="code_line">&nbsp;&nbsp; &nbsp; Poly &nbsp; &nbsp;: array[0..24] of Point; { массив вершин многоугольника }</div><div class="code_line">&nbsp;&nbsp; &nbsp; C &nbsp; &nbsp; &nbsp; : integer; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { кол-во вершин многоугольника }</div><div class="code_line">&nbsp;&nbsp; &nbsp; i, j &nbsp; &nbsp;: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">Function Max( Num1, Num2 : integer ) : integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;If Num1&#62;Num2 then Max:=Num1 else Max:=Num2;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Function Min( Num1, Num2 : integer ) : integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;If Num1&#60;Num2 then Min:=Num1 else Min:=Num2;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure EnterData; { Процедура ввода данных }</div><div class="code_line">Begin</div><div class="code_line">&nbsp;Write(&#39;Enter poly`s vertex number: &#39;); ReadLn ( C );</div><div class="code_line">&nbsp;For i:=0 to C-1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; Write(&#39;X[&#39;,i,&#39;]: &#39;); ReadLn(Poly[i].x);</div><div class="code_line">&nbsp;&nbsp; Write(&#39;Y[&#39;,i,&#39;]: &#39;); ReadLn(Poly[i].y);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp; WriteLn;</div><div class="code_line">&nbsp;&nbsp; Write(&#39;Point X: &#39;); ReadLn(PointXY.x);</div><div class="code_line">&nbsp;&nbsp; Write(&#39;Point Y: &#39;); ReadLn(PointXY.y);</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Function PointInPoly ( A : Point; P : array of Point; N : integer) : integer;</div><div class="code_line">Var Count : integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;T &nbsp; &nbsp; : real;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;T:=0;</div><div class="code_line">&nbsp;&nbsp;Count:=0;</div><div class="code_line">&nbsp;For i:=0 to N-1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; j:=(i+1) mod N;</div><div class="code_line">&nbsp;&nbsp; If P[i].y = P[j].y then Continue;</div><div class="code_line">&nbsp;&nbsp; If (P[i].y &#62; A.y) and (p[j].y &#62; A.y) then Continue;</div><div class="code_line">&nbsp;&nbsp; If (P[i].y &#60; A.y) and (p[j].y &#60; A.y) then Continue;</div><div class="code_line">&nbsp;&nbsp; If Max(P[i].y, P[j].y) = A.y then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Inc(Count)</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp;If Min(P[i].y, P[j].y) = A.y then</div><div class="code_line">&nbsp;&nbsp; &nbsp; Continue</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;T := (A.y-P[i].y)/(P[j].y-P[i].y);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;If ((T&#62;0) and (T&#60;1)) and ((P[i].x + T*(P[j].x-P[i].x)) &#62;= A.x) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Inc(Count);</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;PointInPoly:= Count AND 1;</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;ClrScr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;EnterData;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;writeln;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;If PointInPoly(PointXY, Poly, C) = 0 then</div><div class="code_line">&nbsp;&nbsp;Write(&#39;Answer: Point out of poly&#39;)</div><div class="code_line">&nbsp;else</div><div class="code_line">&nbsp;&nbsp;Write(&#39;Answer: Point in poly&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;readln;</div><div class="code_line">End.</div></ol></div></div></div></div>]]></description>
        <author>romtek</author>
        <category>Pascal: Математика</category>
      </item>
	
      </channel>
      </rss>
	