![]() |
|
|
![]()
|
|
| 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 класса. Там сказано так:
-Строим отрезок длинной одной из сторон. -Проведем окружности радиусами двух других сторон с центрами в концах отрезка. -Соединим точку пересечения окружностей с концами отрезка(точку будем искать из уравнений окружностей) Вот и треугольник. -------------------- Всем добра |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |