<?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=425660&amp;view=findpost&amp;p=3859403</guid>
        <pubDate>Sat, 19 Feb 2022 13:24:39 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859403</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>FasterHarder</strong>, поворот вектора на 90° – это умножение на i. Просто напомнил.]]></description>
        <author>Qraizer</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859253</guid>
        <pubDate>Wed, 16 Feb 2022 10:13:11 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859253</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859216'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T20:17:38+00:00">15.02.22, 20:17</time></span><div class='quote '> Самое быстрое, что я находил - это проверка, что для каждой из 4 сторон заданная точка и центр квадрата лежат по одну сторону от прямой, на которой лежит сторона. </div></div><br>
ясно, буду разбираться<br>
<strong class='tag-b'>Akina</strong>, спс за помощь и за код на Basic, тоже буду разбираться)]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859243</guid>
        <pubDate>Wed, 16 Feb 2022 08:33:56 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859243</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859233'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MIF &#064; <time class="tag-quote__quoted-time" datetime="2022-02-16T08:07:52+00:00">16.02.22, 08:07</time></span><div class='quote '>можно по длине проекции на ось</div></div><br>
?? У произвольно расположенного квадрата длины проекций на ось смежных сторон не равны. Равны длины проекций на разные оси, перекрёстно.]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859233</guid>
        <pubDate>Wed, 16 Feb 2022 08:07:52 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859233</link>
        <description><![CDATA[MIF: Находим все отрезки, упорядочиваем их по длине (можно по длине проекции на ось)<br>Проходим по списку. Если количество отрезков одинаковой длины меньше 4, то они точно не принадлежат квадрату. Если &gt;= 4, то используем идин из алгоритмов описанных выше.]]></description>
        <author>MIF</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859216</guid>
        <pubDate>Tue, 15 Feb 2022 20:17:38 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859216</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859215'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T19:36:19+00:00">15.02.22, 19:36</time></span><div class='quote '>я правильно понимаю, что время не учитывает сортировку координат, хотя, наверное, отсортировать 1000 точек - меньше 0.05 сек,ну,понятно</div></div><br>
Неправильно. В коде прекрасно видно, что за время считается - берётся полное время работы алгоритма (из которого чуть ли не половина - это на самом деле вывод на экран (Debug.Print - штука ни хрена не быстрая, порядка 0,01 секунды на один вывод), так что реально скорость обработки 1000 точек где-то 0,12 секунды).<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859215'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T19:36:19+00:00">15.02.22, 19:36</time></span><div class='quote '>А насчет проверки попадания точки в квадрат, есть такая идея</div></div><br>
Самое быстрое, что я находил - это проверка, что для каждой из 4 сторон заданная точка и центр квадрата лежат по одну сторону от прямой, на которой лежит сторона.]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859215</guid>
        <pubDate>Tue, 15 Feb 2022 19:36:19 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859215</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859209'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T17:59:38+00:00">15.02.22, 17:59</time></span><div class='quote '>Ню-ню... ты хотя бы прикинь вероятность, что там хоть один квадрат накопается - сразу поймёшь, что нужен ни фига не рандом. </div></div><br>
я уже понял это) Вероятность того, что на таком огромном пространстве выпадут четко вершины квадрата вообще стремится к 0.<br>
тоже написал программку, только на С++ (250 строк кода, 10 функций) и она ТОЛЬКО занимается полным перебором всех четверок, вот такие результаты получились<br>
при генерации случ.чисел от -0.5 до +0.5 и точности сравнения вещественных до 0.005<br>
<span class="b-attach" data-size="30867" data-hits="1301" data-attach-id="63312" data-attach-post-id="3859215">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3859215&amp;attach_id=63312' title='Скачать файл' target='_blank'>test_2.png</a> (, : 1301)
		</span><br>
<br>
показатели генерации случ.чисел + точность сравнения колоссально влияет на кол-во поиска квадратов, конечно<br>
<br>
еще пример с выводом координат точек<br>
<span class="b-attach" data-size="60542" data-hits="1329" data-attach-id="63313" data-attach-post-id="3859215">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3859215&amp;attach_id=63313' title='Скачать файл' target='_blank'>test_1.png</a> (, : 1329)
		</span><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859209'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T17:59:38+00:00">15.02.22, 17:59</time></span><div class='quote '>В среднем на запуск находит 3-8 квадратов (вырожденные находит, но не выводит), время работы 0,15-0,20 секунды</div></div><br>
т е 1000 точек отрабатывает за 0.2 сек, хм, неплохо, конечно) моя прожка найдет за 0.2 * 10000, мда уж...но я хотел проверить как себя поведет полный перебор в таких задачах, в общем понятно, что до 100 точек еще терпимо, но потом кранты.<br>
<br>
В БИГ ДАТА алгоритмы играю абсолютно решающую роль (разница может доходит до триллион раз и это без преувеличений).<br>
<br>
----------------------------------------------------------------<br>
А насчет проверки попадания точки в квадрат, есть такая идея: соединить эту точку со всеми вершинами квадрата, получив 4ре треугольника (триангуляция), и, если точка попадает в область квадрата, то сумма площадей 4рех треугольников = площади квадрата. Площадь треугольника считать по формуле Герона, а квадрата вроде (любая сторона)^2. Понятно, что время работы моей программы в случае, когда все вершины образуют квадраты ---&#62; &quot;вечность&quot;, а при среднем запуске просто минуты будет, т к реальных квадратов не так уж и много образуется.<br>
<br>
Это ужасная идея или имеет право на жизнь? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-02-15T19:44:30+00:00">15.02.22, 19:44</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859209'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T17:59:38+00:00">15.02.22, 17:59</time></span><div class='quote '>время работы 0,15-0,20 секунды</div></div><br>
я правильно понимаю, что время не учитывает сортировку координат, хотя, наверное, отсортировать 1000 точек - меньше 0.05 сек,ну,понятно]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859209</guid>
        <pubDate>Tue, 15 Feb 2022 17:59:38 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859209</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859190'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T12:54:53+00:00">15.02.22, 12:54</time></span><div class='quote '>пойду раскуривать эти подходы с сортировкой, поворотами и пр., все-таки никуда от них не деться</div></div><br>
Повороты нафиг не нужны. <strong class='tag-b'>AVA12</strong> чётко показал, что достаточно вульгарной арифметики класса плюс-минус и больше-меньше.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859190'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T12:54:53+00:00">15.02.22, 12:54</time></span><div class='quote '>координаты - случ.дробные числа из отрезка [-100; +100], вроде хватит им &quot;пространства&quot; там</div></div><br>
Ню-ню... ты хотя бы прикинь вероятность, что там хоть один квадрат накопается - сразу поймёшь, что нужен ни фига не рандом. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-02-15T18:43:37+00:00">15.02.22, 18:43</time></span></span><br>
В общем, накидал быстренько программку в VBA (Excel 2010). Генерирует 1000 точек с целыми координатами в квадрате (0,0)-(100,100), а потом ищет четвёрки, образующие квадрат.<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 mypoint</div><div class="code_line">&nbsp;&nbsp; &nbsp;x As Integer</div><div class="code_line">&nbsp;&nbsp; &nbsp;y As Integer</div><div class="code_line">End Type</div><div class="code_line">&nbsp;</div><div class="code_line">Dim mypoints() As mypoint</div><div class="code_line">&nbsp;</div><div class="code_line">Const amount As Integer = 1000</div><div class="code_line">&nbsp;</div><div class="code_line">Sub test()</div><div class="code_line">Dim i As Integer, j As Integer</div><div class="code_line">Dim dX As Integer, dY As Integer</div><div class="code_line">Dim tmp As mypoint</div><div class="code_line">Dim t As Single</div><div class="code_line">t = Timer</div><div class="code_line">&nbsp;</div><div class="code_line">Call generate_points</div><div class="code_line">For i = 1 To amount - 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;For j = i + 1 To amount</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dX = mypoints(j).x - mypoints(i).x</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dY = mypoints(j).y - mypoints(i).y</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;If Abs(dX) &#62; Abs(dY) Or (Abs(dX) = Abs(dY) And dY &#62; 0) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit For</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End If</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mypoints(0).x = mypoints(i).x + Abs(dY)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mypoints(0).y = mypoints(i).y - Abs(dX) * Sgn(dY)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;If Not check_presence(i) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit For</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End If</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tmp = mypoints(0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mypoints(0).x = mypoints(i).x + Abs(dX) + Abs(dY)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mypoints(0).y = mypoints(i).y + Abs(dY) - Abs(dX) * Sgn(dY)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;If Not check_presence(i) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit For</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End If</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;If mypoints(i).x &#60;&#62; mypoints(j).x Or mypoints(i).y &#60;&#62; mypoints(j).y Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Debug.Print mypoints(i).x; mypoints(i).y, mypoints(j).x; mypoints(j).y, tmp.x; tmp.y, mypoints(0).x; mypoints(0).y</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End If</div><div class="code_line">&nbsp;&nbsp; &nbsp;Next</div><div class="code_line">Next</div><div class="code_line">&nbsp;</div><div class="code_line">Debug.Print &quot;Elapsed time: &quot;; Timer - t</div><div class="code_line">End Sub</div><div class="code_line">&nbsp;</div><div class="code_line">Sub generate_points()</div><div class="code_line">Dim i As Integer, j As Integer</div><div class="code_line">ReDim mypoints(0 To amount)</div><div class="code_line">For i = 1 To amount</div><div class="code_line">&nbsp;&nbsp; &nbsp;mypoints(i).x = 1 + 99 * Rnd</div><div class="code_line">&nbsp;&nbsp; &nbsp;mypoints(i).y = 1 + 99 * Rnd</div><div class="code_line">Next</div><div class="code_line">For i = 1 To amount - 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;For j = i + 1 To amount</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;If mypoints(i).x &#62; mypoints(j).x Or (mypoints(i).x = mypoints(j).x And mypoints(i).y &#62; mypoints(j).y) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mypoints(0) = mypoints(i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mypoints(i) = mypoints(j)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mypoints(j) = mypoints(0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End If</div><div class="code_line">&nbsp;&nbsp; &nbsp;Next</div><div class="code_line">Next</div><div class="code_line">End Sub</div><div class="code_line">&nbsp;</div><div class="code_line">Function check_presence(n As Integer) As Boolean</div><div class="code_line">Dim i As Integer</div><div class="code_line">For i = n + 1 To amount</div><div class="code_line">&nbsp;&nbsp; &nbsp;If mypoints(0).x = mypoints(i).x And mypoints(0).y = mypoints(i).y Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;check_presence = True</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Exit Function</div><div class="code_line">&nbsp;&nbsp; &nbsp;End If</div><div class="code_line">Next</div><div class="code_line">End Function</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
В среднем на запуск находит 3-8 квадратов (вырожденные находит, но не выводит), время работы 0,15-0,20 секунды (Intel&reg; Core&#153;2 Duo CPU E7500 @ 2.93GHz, 4Gb RAM, Windows 10 x64).]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859190</guid>
        <pubDate>Tue, 15 Feb 2022 12:54:53 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859190</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>Akina</strong>, ясно, попроще не получится), как и всегда в принципе...<br>
но в любом случае крайне полезно мне было разобраться с проверкой на квадрат по 4рем точкам<br>
<br>
ладно, пойду раскуривать эти подходы с сортировкой, поворотами и пр., все-таки никуда от них не деться, эх... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-02-15T12:56:22+00:00">15.02.22, 12:56</time></span></span><br>
но я в любом случае сделаю вариант с перебором, чтобы посмотреть на время выполнения и прогоню для набора из 10, 50, 100, 250, 500, 1000, 1500 и 2000 точек) <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-02-15T12:57:13+00:00">15.02.22, 12:57</time></span></span><br>
координаты - случ.дробные числа из отрезка [-100; +100], вроде хватит им &quot;пространства&quot; там]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859189</guid>
        <pubDate>Tue, 15 Feb 2022 12:46:27 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859189</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859178'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T11:46:47+00:00">15.02.22, 11:46</time></span><div class='quote '>нужно получить все возможные квадраты, которые можно получить по заданным N точкам</div></div><br>
Так это ты вообще не с той стороны заходишь&#33; типичная XY-проблема.<br>
<br>
Достаточно обрабатывать пары. Для каждой пары точек существует всего два варианта, когда эти точки есть вершины стороны. А если предварительно отсортировать по какой-то координате, брать так, что первая левее второй - остаётся проверить вообще один вариант (см. <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859145' target='_blank'>Какой самый простой способ проверить на квадрат по 4рем заданным точкам? (сообщение #3859145)</a>), а если угол меньше +/- 45<sup class='tag-sup'>о</sup> (dX&gt;dY) - так и вовсе ничего не надо проверять, ибо эта пара уже проверена. То есть для каждой пары точек 1 и 2 получаем точки 3 и 4 и проверяем, есть ли точки с такими координатами в наборе. Это будет О(n^2*log), что явно лучше n^5...]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859187</guid>
        <pubDate>Tue, 15 Feb 2022 12:24:45 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859187</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859185'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>AVA12 &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T12:20:05+00:00">15.02.22, 12:20</time></span><div class='quote '>Это уже задача уровня &quot;собеседование в Гугл&quot;</div></div><br>
ну, я ведь не настолько ламер, чтобы уж совсем не мочь решать простейшие задачи))<br>
поэтому, да, возможно, данная задачка и не оч.простая...хотя мне все равно не кажется сложной<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859185'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>AVA12 &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T12:20:05+00:00">15.02.22, 12:20</time></span><div class='quote '>координаты целочисленные?</div></div><br>
нет, конечно, в посте №1 спец. привел декларацию описания сущности &quot;Точка&quot; и там даблы {x; y} <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-02-15T12:27:11+00:00">15.02.22, 12:27</time></span></span><br>
не, а в чем проблема-то? Если есть понимание того, как проверить 4ре координаты на квадратность, то можно проверить и 2000 точек<br>
или здесь проблема с быстродействием всего этого дела...хм...надо попробовать протестить на разном кол-ве точек.. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-02-15T12:35:09+00:00">15.02.22, 12:35</time></span></span><br>
ну, да, я понял, что здесь все упрется в производительность, т к ДЛЯ каждого квадрата нужно прогонять КАЖДУЮ точку на проверку для попадания в этот квадрат, итогда сложность возрастает до N^5 (или еще выше куда-то там), хм...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859185</guid>
        <pubDate>Tue, 15 Feb 2022 12:20:05 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859185</link>
        <description><![CDATA[AVA12: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>... а на другом нет - то это стопудово не квадрат</div></div><br>
Это лишний if, а экономия копеечная, нафиг.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>нужно получить все возможные квадраты, которые можно получить по заданным N точкам и среди них выбрать квадрат, внутри которого попадает больше всего точек из этой коллекции точек (точки, лежащие на границе в квадрат не попадают)</div></div><br>
Это уже задача уровня &quot;собеседование в Гугл&quot;, а то и выше. Ключевой момент: координаты целочисленные? Если да, то на ютубе есть <a class='tag-url' href='https://www.youtube.com/watch?v=EuPSibuIKIg' target='_blank'>пример</a> решения похожей задачи (нужно посчитать количество прямоугольников), кандидат придумал красивое решение для прямоугольников, выровненных по осям, но алгоритм можно адаптировать и для общего случая.]]></description>
        <author>AVA12</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859178</guid>
        <pubDate>Tue, 15 Feb 2022 11:46:47 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859178</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>Akina</strong>, спс за алгоритм, где нужно ТОЛЬКО вычислять расстояния - именно то, что я и хотел)<br>
<br>
насчет этого условия понятно:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859141'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T04:12:20+00:00">15.02.22, 04:12</time></span><div class='quote '>BC2=CD2=AB2=AD2</div></div><br>
по определению квадрата у него все стороны равны (значит, и квадраты сторон равны, т к сторона сама по себе - всегда положительное число)<br>
но этого условия недостаточно, т к, например, у ромба ТОЖЕ все стороны равны<br>
<br>
перпендикулярность диагоналей брать не стоит, т к опять-таки у ромба они перпендикулярны тоже, поэтому берем<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859141'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T04:12:20+00:00">15.02.22, 04:12</time></span><div class='quote '>BD2=AC2</div></div><br>
<br>
и остается ТОЛЬКО квадрат в итоге. Если брать только равенство диагоналей, то было бы также недостаточно, т к, например, у прямоугольника они тоже равны.<br>
<br>
Поэтому строго выполнение одновременно этих двух условий. Безусловно, я знал это, но был настолько не уверен, что этого достаточно, начитавшись в сети споров про квадрат)<br>
<br>
Если я все правильно понял в алгоритме <strong class='tag-b'>Akina</strong>, то теперь нет нужды проверять сначала точки на совпадение по координатам, а достаточно просто, например, проверить квадрат любой стороны, например, АВ на равенство 0, если 0 - это не квадрат и все. Т е всего ОДНА проверка вместо 6.<br>
---------------------------------------<br>
Передо мной стоит задача более сложная, чем проверка на квадрат, просто там это обязательный этап, поэтому решил разобраться с ним и даже на этом (самом простом этапе) получил проблемы)<br>
<br>
В целом, у меня есть коллекция точек (одномерный массив точек) points[N] из N штук, где N in [4; 2000]. И нужно получить все возможные квадраты, которые можно получить по заданным N точкам и среди них выбрать квадрат, внутри которого попадает больше всего точек из этой коллекции точек (точки, лежащие на границе в квадрат не попадают).<br>
<br>
Чтобы получить все возможные квадраты придется запускать 4ре вложенных цикла FOR(&#33;):<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">for i = 0; i &#60; (N - 4); i++</div><div class="code_line">&nbsp;&nbsp; for j = i + 1; j &#60; (N - 3); j++</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for k = j + 1; k &#60; (N - 2); k++</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for l = k + 1; l &#60; (N - 1); l++</div></ol></div></div></div></div><br>
<br>
Если я правильно понимаю, то получаем вычислительную сложность алгоритма O(N^4): (N - 4) * (N - 3) * (N - 2) * (N - 1) = N^4 -... самое &quot;тяжелое&quot; слагаемое в этом выражении в 4ой степени, значит, сложность алгоритма аналогичная, вроде так, но это неточно...Не уверен, что 2000 точек легко комп переберет по 4кам, хотя 2000 не 2млн, справится). Кроме перебора здесь ведь невозможно ничего другого в принципе.<br>
<br>
В итоге текущий квадрат имеет координаты points[ i ], points[ j ], points[ k ], points[ l ]. Точка points[ i ] принимается по дефалту за вершину А.<br>
<br>
Функции программы:<br>
0. ввод количества точек множества точек<br>
1. ввод исходных координат points = Получить_координаты_с_клавиатуры( количество точек ) (этот интерфейс легко расширяется до Получить_координаты_из_файла или Получить_координаты_случ_образом). Возможно, чуть удобнее иметь функцию ввода координат одной точки...<br>
2. нахождение квадрата расстояние между 2 заданными точками: double Получить_квадрат_расстояния_между_заданными_2_точками( точка1, точка2 )<br>
3. вывод координат квадрата на экран: Вывести_квадрат_на_экран( точка1, точка2, точка3, точка4 )<br>
4. важнейшая функция Получить_диагональную_вершину_квадрата (points[ i ], points[ j ], points[ k ], points[ l ]). В качестве ответа она, думаю, что вернет № параметра, это либо число 2, 3 или 4 (параметр №1 это точка А - первая диагональная вершина). После получения номера этой вершины будет switch-case для построения отрезков AB, BC и т.д. и далее проверки, озвученные выше.<br>
5. проверка 4гольника на квадрат bool Это_квадрат( A, B, C, D ). В этой функции зашиты проверки на равенство квадратов сторон и квадратов диагоналей.<br>
<br>
Вот минимальный набор функций.<br>
-----------------------------------------------<br>
Затем еще потребуется функция, которая будет проверять попадание точки в область квадрата, эх, был бы круг с известным центром, было бы изи  :yes: , а так вот сходу тоже непонятно  :wall: , что да как, но над этим еще подумаю<br>
<br>
всем спс. за участие, а особенно <strong class='tag-b'>Akina</strong> за точную формулировку алгоритма, основанного ТОЛЬКО на расстояниях, без этих ужасных проверок на выпуклость и поворотов на 90%))]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859172</guid>
        <pubDate>Tue, 15 Feb 2022 11:00:04 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859172</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=425660&view=findpost&p=3859145'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>AVA12 &#064; <time class="tag-quote__quoted-time" datetime="2022-02-15T07:34:41+00:00">15.02.22, 07:34</time></span><div class='quote '>Если на каком-то краю больше одной точки</div></div><br>
... а на другом нет - то это стопудово не квадрат.]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859164</guid>
        <pubDate>Tue, 15 Feb 2022 09:37:47 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859164</link>
        <description><![CDATA[OpenGL: Находишь центр тяжести этих точек, вычитаешь его координаты из координат точек. <br>Пусть одна из точек (любая) после такого вычитания имеет координаты (A, B). Тогда остальные должны иметь координаты (-B, A), (-A, -B), (B, -A).]]></description>
        <author>OpenGL</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859145</guid>
        <pubDate>Tue, 15 Feb 2022 07:34:41 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859145</link>
        <description><![CDATA[AVA12: Можно обойтись одними только сложениями и вычитаниями.<br><br>Сортируем точки по какой-нибудь координате (например, по x). Получаем две крайние точки (например, самая левая и самая правая) и две промежуточные. Если на каком-то краю больше одной точки, то дополнительно сортируем по другой координате (например, крайними будут самая верхняя из самых левых и самая нижняя из самых правых).<br><br>Возьмем одну из крайних точек, ее координаты (x; y). В любом квадрате координаты промежуточных точек будут (x+a; y+b) и (x+b; y-a), а координаты противоположной точки - (x+a+b; y-a+b)<br><br>Соответственно, берем крайнюю точку и одну из промежуточных, вычисляем коэффициенты a и b, проверяем, что оставшиеся точки имеют правильные координаты. Быстро, просто, без потери точности.]]></description>
        <author>AVA12</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859143</guid>
        <pubDate>Tue, 15 Feb 2022 06:36:56 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859143</link>
        <description><![CDATA[MIF: Измеряешь длины трех пар отрезков: АВ и СД, АС и ВД, АД и ВС. Каждая пара отрезков будет иметь одинаковые длины.]]></description>
        <author>MIF</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859141</guid>
        <pubDate>Tue, 15 Feb 2022 04:12:20 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859141</link>
        <description><![CDATA[Akina: Берёшь произвольную точку (обозначаем её A) и считаешь квадрат расстояния до каждой из трёх других (B,C,D). Проверяешь, что для двух из трёх он одинаков (обозначаем их B,D), а для третьей вдвое больше (соответственно C). Считаешь квадраты расстояний BC, BD и CD. Если итогово BC<sup class='tag-sup'>2</sup>=CD<sup class='tag-sup'>2</sup>=AB<sup class='tag-sup'>2</sup>=AD<sup class='tag-sup'>2</sup> и BD<sup class='tag-sup'>2</sup>=AC<sup class='tag-sup'>2</sup> - у нас квадрат.<br>
<br>
По мере движения по алгоритму любое неравенство - это &quot;не квадрат&quot;, и дальше можно не считать.]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859140</guid>
        <pubDate>Tue, 15 Feb 2022 02:18:53 +0000</pubDate>
        <title>Какой самый простой способ проверить на квадрат по 4рем заданным точкам?</title>
        <link>https://forum.sources.ru/index.php?showtopic=425660&amp;view=findpost&amp;p=3859140</link>
        <description><![CDATA[FasterHarder: Всем хай&#33; Сходу к делу&#33;<br>
<br>
<strong class='tag-b'><span class="tag-color tag-color-named" data-value="blue" style="color: blue">Условие такое: даны координаты 4рех точек на плоскости. Узнать, образуют ли они квадрат.</span></strong><br>
<br>
Вроде(&#33;) простая вещь, но тем не менее...<br>
Точки задаются произвольно, т е не в порядке обхода вершин квадрата + они вещественные + стороны квадрата могут быть не || осям координат - это я дополнил условие.<br>
<br>
В сети море обсуждений этой проверки + оч.много споров + казалось, бы на верный ответ (под 100 плюсов) находили опровержения и пр. пр.<br>
Решают и через расстояния, и через скалярные произведения, и через повороты, и через вписанные/описанные окружности, через перпендикулярность сторон/диагоналей и через предварительную сортировку координат и еще как-то мутят, кто как может). Многие в алгоритмах избегают взятия квадратного корня, а зря(&#33;) ), хотя это мат.операция являются тяжелой вроде как для вычислений ЦП<br>
<br>
Мне бы хотелось понять самый <strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">простой и ПОЛНЫЙ</span></strong> алгоритм такой проверки, и главное БЕЗ поворотов отрезков (сторон) и очень желательно без проверки на выпуклость (т к это сложно&#33;). В идеале хотелось бы обойтись лишь нахождением длин сторон...<br>
<br>
Допустим, есть такое определение сущности &quot;точка&quot; в терминах языка С (С89):<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">typedef struct TPoint</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// берем double, т к все мат.функции из С89 заточены на этот тип данных (в С99 добавили и для float)</div><div class="code_line">&nbsp;&nbsp; &nbsp;double x;</div><div class="code_line">&nbsp;&nbsp; &nbsp;double y;</div><div class="code_line">} Point;</div></ol></div></div></div></div><br>
<br>
Далее, ввели координаты 4рех точек: A, B, C, D.<br>
1 этап (обязательный): проверить, что их координаты различны. Сравниваем координаты A-B, A-C, A-D, B-C, B-D, C-D - 6 проверок. При любом совпадении - это не четырехугольник.<br>
При этом здесь не обращаем на выпуклость. Это не важно, просто проверка координат 4рех точек на не совпадение.<br>
2 этап: можно взять ЛЮБУЮ точку (пусть А) и найти расстояние до всех остальных (расстояния гарантированно будут не нулевыми). 2 из 3 этих расстояний ОБЯЗАНО быть одинаковым, а 3е больше в корень(2) раз. Но это ведь НЕДОСТАТОЧНОЕ условие. Можно попробовать найти диагональную вершину для точки А. Допустим. После этого найти расстояние между двумя остальными.<br>
<br>
Затем можно пробовать проверять перпендикулярность &quot;диагоналей&quot;, но не уверен, что все этого достаточно для однозначной идентификации квадрата.<br>
<br>
Вот каким образом ПРОЩЕ ВСЕГО сделать такую проверку? Подскажите как быть-то.<br>
Спс за внимание.<br>
<br>
p.s. оч.желательно БЕЗ поворотов и проверки на выпуклость - это сложнА)]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	