![]() |
|
|
![]()
|
|
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Вобщем, вопрос простейший
Но я чего-то не могу: как зная длины сторон треугольника его построить ? Т.е. либо углы узнать, либо координаты вершин (для любого положения)... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 1 Всего: 172 |
Теорема косинусов
c²=a² + b² - 2ab cos C где С - угол, противолежащий стороне с. Отсюда находишь косинусы всех трех углов. -------------------- |
|||
|
||||
| poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
А по моему будет попроще с координатами.
Пусть треугольник со строонами a, b, c. Возьмем первую вершину A с координатами (0, 0). Вторая вершина пусть будет будет иметь координаты (b, 0). А с третей стороной будет посложнее. Во первых вычисли такие формулы. p=(a+b+c)/2 S=sqrt(p*(p-a)*(p-b)*(p-c)) h=2*S/h x=sqrt(a*a-h*h) Ну тогда координаты третей будут (x,h). --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Domestic Cat, poor_yorik, спасибо! Не ожидал, что так быстро среагируют
Попробовал оба варианта, через теорему косинусов расчет в принципе оказался не сложнее, если даже не проще... А вариант poor_yorik чего-то не заработал, разбираться чего и как нет времени, но тут h делится на неопределенное само себя: h=2*S/h, не знаю, что тут должно быть на самом деле -------------------- С уважением, г-н Посол. |
|||
|
||||
| III.nfo |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 18.10.2004 Репутация: 2 Всего: 2 |
poor_yorik
Хорошее решение! Только p=(a+b+c)/2; S=sqrt(p*(p-a)*(p-b)*(p-c)); h=2*S/a; x=sqrt(c*c-h*h); Если треугольник такой (по таким точкам и такими названиями сторон, извиняюсь за плохое качество): /C\ c/ \b A/__a__\B A(0;0); B(b;0); C(x;x); p0s0l Этот вариант менее русурсоёмкий. Кстати, взять бумажку и подправить код тоже можно. Это сообщение отредактировал(а) III.nfo - 2.6.2005, 11:01 |
|||
|
||||
| p0s0l |
|
||||||||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Этот как ? Если посчитать количество операций, то через теорему косинусов даже меньше выходит
PS:
-------------------- С уважением, г-н Посол. |
||||||||||||||
|
|||||||||||||||
| III.nfo |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 18.10.2004 Репутация: 2 Всего: 2 |
p0s0l
Насчёт code - спасибо. Также, скорость выполнения - одинакова, сейчас проверил на .NET:
Это сообщение отредактировал(а) III.nfo - 3.6.2005, 17:42 |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Тут же такие микроскопические вычисления, что DateTime не должен их отловить... Или же .NET на столько медленный, что эти вычисления занимают милисекунды ? (в этом сомневаюсь, хотя с .Net не работал...) Надо бы сделать большой цикл повторяющихся вычислений... В общем, эти два способа отличаются тем, что в первом нужна только 1 операция корня, а во втором - две... Вычисление корня - дело очень медленное, все эти умножения/деления - лишь капля по сравнению с вычислением корня. Так что можно отбросить всю мелюзгу, типа умножения, сложения и деления, оставив на сравнение только корень. Поэтому способ через теорему косинусов должен быть в 2 раза быстрее! Сделай цикл от 1 до миллиона (или больше) - и вот тогда уже меряй (понятно, не внутри цикла, а до и после цикла), сразу будет видна разница Это сообщение отредактировал(а) p0s0l - 3.6.2005, 12:28 -------------------- С уважением, г-н Посол. |
|||
|
||||
| III.nfo |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 18.10.2004 Репутация: 2 Всего: 2 |
Первый метод оказался реально быстрее, но до меня что-то не доходит, что он выдаёт!
А именно, какой треугольник. Кое-что в уме прикинул, но тогда метод получается ошибочный. Это сообщение отредактировал(а) III.nfo - 3.6.2005, 17:54 |
|||
|
||||
| poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
Первый метод порсто дает возможность найти все углы.
Но чтобы построить треугольник нужно еще провести пару дополнительных операций. Второй же метод выдает сразу координаты треугольника, так что его можно построить. То есть если надо именно построить треугольник, то мой метод быстрее. --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
| p0s0l |
|
||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Отнюдь не так... В обоих способах, можно принять, что координаты вершины А = (0, 0), координаты вершины B = (a, 0). Координаты третьей вершины вычисляются по формулам... В общем, сравни:
Только еще обнаружился 1 баг во втором способе при тестировании... Дело в том, что все координаты (x и y) треугольника всех трех вершин данным способом получаются положительными... Хотя бывают ситуации, когда знак xx[3] должен быть отрицательным... Пример - на рисунке... Для тестирования я генерил случайным образом координаты трех вершин треугольника, вычислял длины сторон, и по ним обоими способами строил новые треугольники. Через теорему косинусов всегда треугольник получался на ура, а вторым способом - иногда даже очень сильно отличался (в одной координате). Т.е. надо еще дорабатывать второй способ для таких ситуаций, чтобы получался отрицательный знак X (возможно даже что-то простейшее)... Присоединённый файл ( Кол-во скачиваний: 14 )
tr.gif 5,57 Kb-------------------- С уважением, г-н Посол. |
||||||||
|
|||||||||
| poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
p0s0l, таки да на одну строчку у меня код больше, но зато и без тригонометрии.
А насчет отрицательных координат, я так понял когда тупоугольный треуголник. Так если посмотришь, треугольник то все равно будет правильный, просто в нем стороны c и b местами поменялись. --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Вот другой пример, тут яснее видно, что одна сторона получалась в 2 раза короче, чем нужно бы...
Присоединённый файл ( Кол-во скачиваний: 10 )
tr2.gif 5,92 Kb-------------------- С уважением, г-н Посол. |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Я вспомнил Геометрию 7-8 класса. Там сказано так:
-Строим отрезок длинной одной из сторон. -Проведем окружности радиусами двух других сторон с центрами в концах отрезка. -Соединим точку пересечения окружностей с концами отрезка(точку будем искать из уравнений окружностей) Вот и треугольник. -------------------- Всем добра |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
-------------------- С уважением, г-н Посол. |
|||
|
||||
| poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: 3 Всего: 8 |
p0s0l, прошу прощения. Решил исправить свою ошибку.
Что поделать, если я такой дурак. Вот чтобы решение было правильное нужно изменить эту строчку. x=sqrt(sqr(max(a,c))-sqr(h)) --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Вот, теперь работает
Но мне все равно через т. косинусов нравится больше Спасибо за участие! -------------------- С уважением, г-н Посол. |
|||
|
||||
| BOB4uK |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 28.2.2004 Репутация: нет Всего: нет |
Конечно тема старая, но может ее авторы отслеживают (надеюсь на это)!
У меня вопрос! Как построить многоугольник спомощью треугольников? Извесны только стороны и диагонали (многоугольник состоит из треугольников). Я начал писать и зашел в тупик... первый треугольник построил беспроблем а вотт как быть дальше? вроди пишу но както мне не нравится... |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Уф, археологи, блин
Если известны диагонали и вершины. Если вершины для полного счастья пронумерованы, то элементарно. Допустим имеем. Вершина 1. Вершина 2. Вершина 3. Вершины 1 и 3- диагональ. Строим треугольник по очевидным данным из трех вершин. Сложнее если диагональ Вершина 1 - Вершина 5 например. Но решается так же. На бумажке посиди, порисуй. -------------------- Всем добра |
|||
|
||||
| BOB4uK |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 28.2.2004 Репутация: нет Всего: нет |
Вот пример:
Стороны: АБ 300 БС 500 СД 300 ДА 500 БД 583 - диагональ Это прямоугольник, но прога этого не знает! строим первый треугольник как выше описывалось, а вот второй? Я вот запутался со сторонами треугольников! Че да как? В геометрии не селен! Нужна помощь! |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Ну. Естессно прогу по этому ты не заставишь выдать тебе вразумительнйы ответ. Ибо длина может начинаться с (0,0), а может из другой точки. И может быть повернута как угодно.
Задавай координатами и используй уравнения прямых. По ним определяй, с какой стороны точка находится по отношению к прямой. Темы про геометрию и уравнения прямых обсуждались сотни раз, юзай поиск. -------------------- Всем добра |
|||
|
||||
| xDragon |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 8.10.2007 Репутация: нет Всего: нет |
Вопрос: а можно ли вместо корня, для синусов, использовать какуюнито аналогичную формулу, как и для косинусов?
|
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
?
Формулу в студию. Не совсем понимаю, о чем ты. Если о теоремах- то вспомни геометрию. Есть еще теорема синусов. -------------------- Всем добра |
|||
|
||||
| maxdiver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
Наверно имеется в виду формула для косинуса через скалярное произведение.
|
|||
|
||||
| BOB4uK |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 28.2.2004 Репутация: нет Всего: нет |
Задачу решил через пересечение двух окружностей... зная что даны изначально две точки с координатами (0;0) и (0;длина одно стороны)...
Но вот тут подумал и пришел к выводу что можно еще по другому сделать: учитывая что известны первые две точки находим третью как описано выше... затем зная две другие точки нужно сделать тоже самое, приравнять одну точку к (0;0) вторую к (0;длина стороны) находим точку и нужно ее перевести в обратную систему координат... Вот только я не могу собраться с мыслями... Прошу помощи! Или я что то не так понимаю? |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |