|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
|
Нахождение равносторонних треугольников26.10.2009, 13:10. Показов 11584. Ответов 29
Метки нет (Все метки)
Приветствую всех!
Есть задача: Подсчитать количество равносторонних треугольников с различными длинами оснований и вершинами в заданном множестве точек на плоскости и определить пересекаются ли они. Вобщем даже не знаю с чего начать...
0
|
|
| 26.10.2009, 13:10 | |
|
Ответы с готовыми решениями:
29
|
|
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||||
| 26.10.2009, 21:21 | |||||||||||
|
Сначала надо решить первую часть задачи: "Подсчитать количество равносторонних треугольников с различными длинами оснований и вершинами". План решения может быть примерно такой:
Построение циклов надо поменять на такое:
1
|
|||||||||||
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
|
| 27.10.2009, 06:55 [ТС] | |
|
Очень интересная задача.
Просмотрел код, первая часть впринципе понятна, сейчас попробую написать код, удовлетворяющий условию задачи, а именно "в заданном множестве точек". т.е. изначально размеры сетки не заданы и если я правильно понял условие задачи, то эти размеры должен задавать сам пользователь...
0
|
|
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
||||||
| 27.10.2009, 16:05 [ТС] | ||||||
|
Думаю что стоит ввести ограничение, минимальный размер сетки, например 3x3 или 2x3 или 3x2... Иначе треугольников то вообще не получиться или получиться один...
Добавлено через 30 минут Вот начал код писать, возникла проблема с массивами, не знаю как сделать динамический массив ![]()
0
|
||||||
|
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||
| 27.10.2009, 23:37 | |||||||
В общем, можно доказать, что у равностороннего треугольника хотябы одна вершина обязательно будет иметь вещественные координаты (не целые). И здесь не поможет конфигурация сетки: 3x3 или 2x3 или ещё как-то. Первый вывод:1. ТОЧНОЕ построение равносторонних треугольников возможно только при использовании точек с вещественными координатами. --- Следующая проблема. Предположим, мы решили использовать точки с вещественными координатами. Если мы сформируем массив таких точек через генератор случайных чисел, то вероятность, что мы сможем на этом массиве построить хотябы один равносторонний треугольник близка к нулю! (Как это ни странно звучит). Отсюда следует, что для демонстрации задачи, мы можем пойти по какому-то из двух путей: - Вычислить координаты вершин нескольких равносторонних треугольников и поместить их в исходный массив. Здесь, продумывая план, мы увидим, что придётся использовать приближения. Когда имеешь дело с вещественными числами - без приближений не обойтись. - Либо можно изначально не предпринимать попыток заранее расчитать координаты вершин равносторонних треугольников. В этом варианте будем опираться на охват окрестностей точек с целыми координатами. Т. е. идея здесь вот в чём: если мы имеем 3 точки и построенный по ним треугольник "немного" не дотягивает до равностороннего - это признак того, что в окрестности выбранных точек (вершин) лежат истинные точки (вершины) равностороннего треугольника. Значит, нам достаточно задать радиус окрестностей и мы сможем достаточно точно строить равносторонние треугольники имя точки с целочисленными координатами. Именно на этом варианте и надо остановиться. Это самое естественное решение, я считаю. Итак, второй вывод: 2. Мы будем использовать исходный массив точек с целочисленными координатами. Но при расчётах зададим радиус "охвата" - точность вычисления. В этот радиус охвата с весьма большой вероятностью попадут истинные точки, образующие вершины равносторонних треугольников. На основе этих соображений я написал код. Программа содержит: 1. Статический массив, содержащий исходное множество точек с целочисленными координатами. 2. Динамический массив, в который по ходу вычислений записываются найденные "почти" равносторонние треугольники (записываются те, которые удовлетворяют исходному условию задачи). 3. Применён механизм указателей, который позволил избежать большого числа стековых операций (при вызове процедур). (Этот же механизм позволяет избежать переполнения стека). 4. После окончания вычислений на форме рисуются все треугольники из сформированного массива.
И ещё использована техника работы с указателями, про которую я тебе еще не рассказывал. - Но это позже, по ходу обсуждения расскажу.
1
|
|||||||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||
| 28.10.2009, 00:12 | ||
1) Есть известный алгоритм который определяет лежит ли точка внутри треугольника. 2) Пусть есть два треугольника: A0,A1,A2 и B0,B1,B2. Нужно проверить что хотя бы одна из точек B0,B1,B2 лежит в треугольнике A0,A1,A2 или наоборот что одна из точек A0,A1,A2 лежит в треугольнике B0,B1,B2. Если лежит - то пересекаются, иначе нет. 3) Проверить пункт 2 по всем парам треугольников.
1
|
||
|
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 28.10.2009, 00:27 | |
|
Оdip, тут видимо не совсем так. Вот представь - имеем "высокий" треугольник с горизонтальным основанием. И имеем "вытянутый" треугольник с вертикальным основанием. - Вполне может быть, что стороны одного из них пересекают стороны другого. Но ни одна из их вершин не лежит внутри другого.
Хотя... весь вопрос в том, какое дать определение пресечению треугольников. Если пересечение - это обязательно нахождение одной из вершин одного треугольника внутри другого - это одно. А если пересечением считать факт персечения сторон - это другое. Надо у Piratcom уточнить - что в его задании под пересечением понимается?
1
|
|
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
|||
| 28.10.2009, 05:20 [ТС] | |||
|
2odip: Это типа как в дискретной математике, определить является ли множество подмножеством данного множества... Кругами Эйлера изображается...
Я кстати кроме этого варианта больше ничего не предполагал... ![]() На сколько я понял, то Epsilon это и есть радиус окружности, проведённой около целочисленной вершины, и реальная нецелочисленная вершина берётся в её пределах => чем больше радиус, тем больше возможных вершин, при котором получатся равносторонние треугольники =Ю их будет больше... Как я понимаю радиус Epsilon не может быть меньше 0.1, точнее может, только смысла в этом не будет, потому что если есть вероятность, что не построится ни оддин такой треугольник... На счёт координатной сетки, как я понял, лучше сделать её постоянных размеров, и начее я пока что-то не понял как сделать, ну листинг почитаю. может что в голову придёт ![]() Поэтому остаётся надеятся на лучшее Хотя если бдут оба варианта, это ещё лучше, ведь чем задача сложнее, тем она интересней...
0
|
|||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||
| 28.10.2009, 13:23 | ||
Тогда определим что треугольники пересекаются, если пересекаются их стороны. Значит берем три стороны A0-A1, A0-A2, A1-A2. И проверяем пересекаются ли они со сторонами B0-B1, B0-B2, B1-B2. Если хотя бы одно перечение есть - то треугольники пересекаются, иначе нет. Пересечение проверять с точностью EPSILON, например EPLISON = 0.00001
0
|
||
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
||
| 28.10.2009, 14:04 [ТС] | ||
|
Сказали что до того как подсчитывать, нужно определить при каком условии они пересекутся, а потом уже сравнивать с этим условием...
0
|
||
|
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 29.10.2009, 08:27 | |
|
Сегодня вечером попытаюсь написать процедуру для определения пересекаются ли 2 отрезка или нет. Я тут, вроде, придумал метод такого вычисления. По ходу реализации сравню его с классическим.
Классический - это через определение уравнения прямых и вычисления координат точки их пересечения. Затем, сравнение - покрываются ли координаты (проекции на координатные оси) найденной точки на проекции прямых. Мой способ вполне вероятно сможет по скорости выигрывать. - Там сразу определяется накладываются ли проекции прямых по обеим осям - если да, то пересечение возмжно, нет - пересечения нет. Далее - нужно последовательно вычислять пары углов. Здесь максимально 4 шага - 2, 4, 6 или 8 значений уголов надо вычислить. Как только встретится пара уголов, которые в сумме дают больше 180 градусов - значит пересечения нет. Если такой пары не нашлось - пересечение есть. Я на картинке потом это всё поясню. ![]() --- Про Epsilon в первой части задачи. Epsilon обозначает часть расстояния между ближайшими соседними точками (расстояние по оси Х или по оси У). Пэтому для Epsilon максимальное значение должно быть 0.5. Потому что при Epxilon > 0.5 в охватываемую зону вокруг заданной точки могут начать попадать искомые вещественные вершнины из окрестностей соседних точек. Т. е. поиск начнёт выдавать неверные результаты. Минимальное Epsilon может быть разным - чем больше исходных точек, тем меньше можно выставлять Epsilon.
1
|
|
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
||
| 29.10.2009, 14:14 [ТС] | ||
|
Я вот так что-то подумал, а можно ли сделать так: например построили треуголькик, и одну вершину взять за центр окружности, так чтобы она полностью пересекала треугольник, и если в её радиусе есть вершина другого треугольника, то они пересекаются... А может и бред...
0
|
||
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
|
| 31.10.2009, 05:10 [ТС] | |
|
Наткнуля в интернете, на такую вот статейку
Как определить пересекаются ли два прямых отрезка на плоскости ? Есть задача: требуется определить пересекаются ли два прямых отрезка на плоскости(есть PointStart и PointEnd для обоих отрезков).Пробовал математически решить,но привидение пикселей к int все проваливает. Кто поможет? Если надо условие пересечения отрезков, то как вариант: - Прямая A*x+B*y+C=0 по двум точкам P1(x1,y1), P2(x2,y2): A = y2-y2 B = x1-x2 C = -A*x1-B*y1 = y1*x2 - x1*y2 - Расстояние от точки S(x0,y0) до прямой: r = A*x0 + B*y0 + C /sqrt(A*A + B*B) обозначим как Q(P1(x1,y1),P2(x2,y2),S(x0,y0)) = r*sqrt(A*A+B*B) = x0*(y2-y1)+y0*(x1-x2) + y1*x2 - x1*y2 - Тогда условие пересечения двуч отрезков(a,b) и (A,B): Q(a,b;A)*Q(a,b;B)<0 && Q(A,B;a)*Q(A,B;b)<0 пример ф-и на паскале: function Q(ax,ay,bx,by,tx,ty:longint):real; begin Q:=tx*(by-ay)+ty*(ax-bx)+ay*bx-ax*by; end; Сейчас думаю как приминить это... Добавлено через 2 минуты Эта задача подтверждение то, что целочисленными координатами тут не обойдёшся...
0
|
|
|
Почетный модератор
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
|
||||||
| 31.10.2009, 13:57 | ||||||
|
Условие "равеснтва" двух вещественных чисел, например совпадения двух точек, полученных в результате вычисления.
2
|
||||||
|
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 31.10.2009, 16:31 | |
|
Piratcom, в четверг и пятницу не ответил я - у меня времени не было.
В общем, я написал все нужные процедуры: 1. Проверка пересечения линий. 2. Проверка вхождения точки внутрь треугольника. 3. Проверка пересечения треугольников - проверяет пресекаются ли стороны треугольника и еще проверяет на вхождение вершин одного треугольника внутрь другого - это на случай, когда один треугольник полностью лежит внутри другого. Сегодня вчером выложу. Piratcom, ещё надо такой момент уточнить - в условии задачи: "найти персекающиеся треугольники". Т. е. какой здесь отчёт должен быть? Например так можно: Треугольник 1 (координаты) пересекается с: ... Треугольник 2 (координаты) пересекается с: ... ... Так?
1
|
|
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
|||
| 31.10.2009, 19:49 [ТС] | |||
Но впринципе думаю не сложно координаты треугольников вывести, алгоритм примерно такой: Если одна из сторон треугольника пересекается с какой либо стороной другого треугольника => Вывести координаты вершин и инкриментировать счётчик пересекающихся треугольников. И зациклить эту проверку, т.е. пройтись по всем существующим треугольникам...
0
|
|||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||
| 31.10.2009, 22:31 | ||
Вообще в условии задачи сказано: проверить пересекаются ли треугольники. Если считать что треугольники пересекаются, когда у них есть хотя бы одна общая точка, тогда надо проверять еще и этот вариант что один лежит внутри другого.
0
|
||
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
|
| 01.11.2009, 05:17 [ТС] | |
|
http://window.edu.ru/window_ca... ktikum.pdf
Страница №66, задача №39, случайно нашёл задачник... =))) Но в нём тоже ничего не уточняется...
0
|
|
|
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||
| 01.11.2009, 17:09 | ||||||
|
Piratcom, вот рабочий вариант. Я погонял - вроде, всё работает правильно. Но! Я перечитал задание и теперь понимаю его немного подругому.
В варианте, который выложен в этом посте, алгоритм построен так: ищутся равносторонние треугольники. У них замеряются длины оснований и если далее в процессе поиска встречаются другие треугольники с такими же длинами оснований - то они игнорируются и не попадают в результирующий массив. Именно по этому на рисунке, который генерирует программа, все обнаруженные треугольники прижаты к левому верхнему углу. - Потому что поиск начинается с точки (1;1). И другие встретившиеся треугольники с такими же основаниями - отсеяны. В результате мы получаем массив равносторонних треугольников, у которых основания уникальны в пределах сформированного массива...Но в задании сказано: "Подсчитать количество равносторонних треугольников с различными длинами оснований и вершинами ...". Т. е., видимо, надо найти такие равносторонние треугольники, которые имеют уникальное основание на всём множестве равносторонних треугольников, которые могут быть построены на массиве исходных точек. Т. е. если мы нашли какой-то равносторонний треугольник, а потом по ходу поиска нашли другой равносторонний треугольник, то мы должны из результирующего массива исключить и первый и второй найденные треугольники. А не только второй (и последующие). --- Если мы нашли какой-то равносторонний треугольник с основанием, которое раньше ещё не встречалось. И в процессе дальнейшего поиска больше треугольников с таким основанием не нашли, то вот такой треугольник мы и должны включить в результирующий массив. ---
Этот вариант я попозже сделаю. (Может быть сегодня).
1
|
||||||
|
21 / 21 / 3
Регистрация: 05.08.2009
Сообщений: 243
|
|
| 01.11.2009, 18:22 [ТС] | |
|
0
|
|
| 01.11.2009, 18:22 | |
|
Помогаю со студенческими работами здесь
20
Составить программу моделирования паркетов из равносторонних треугольников
Геометрия. Процедура поиска всех равносторонних треугольников Найти периметры и площади трех равносторонних треугольников Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Контроль корректности заполнения дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|