IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Треугольник с заданными вершинами, обход по часовой стрелке
wilin
сообщение 14.10.2007 15:42
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Здравствуйте, дорогие форумчане!

Очень надеюсь на вашу помощь, поскольку сама измучалась предположениями. Условие задачи таковое:

Заданы координаты треугольника. Вывести их в порядке обхода по часовой стрелке blink.gif

Как-то после прочтения условия мне показалось, что можно вычислить расстояние от точки до начала координат, потом найти угол поворота между тем отрезкой с расстоянием. А потом сортировать по принципу - у кого больше угол, да еще и больше длина отрезка, тот первый, у кого поменьше - второй и т.д. Правильно ли я мыслю, или в этом алгоритме есть подводные камни?
Поделить, пожалуйста, своими мыслями. Буду рада и решению smile.gif Но пуще - наводке.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
compiler
сообщение 14.10.2007 15:54
Сообщение #2


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


я думаю, что вместо начала координат, надо взять центр триугольника....



--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 14.10.2007 15:55
Сообщение #3


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Ход мыслей верный, только мне кажется длина отрезка будет не причем. Надо мерить угол между прямой
проходящей через точки
(0.0) - (вершина.х, вершина.у)

и осью ОХ

вот и все.

Сообщение отредактировано: klem4 - 14.10.2007 15:56


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
wilin
сообщение 14.10.2007 15:59
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Спасибо за ответы smile.gif Как поможет в этом деле центр треугольника, я не поняла sad.gif

Угол найти через теорему косинусов и прочее? smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.10.2007 16:05
Сообщение #5


Гость






Цитата
вот и все.

Антипример:


(для точек A и B твой алгоритм сбоит)


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 
compiler
сообщение 14.10.2007 16:06
Сообщение #6


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 14.10.2007 16:05) *
Антипример:
я уже нарисовал и хотел выкладывать такую картинку smile.gif , правда у меня точка С повыше smile.gif

Сообщение отредактировано: compiler - 14.10.2007 16:07


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
wilin
сообщение 14.10.2007 16:09
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


и в этом случае вычислять расстояние? smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 14.10.2007 16:25
Сообщение #8


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


а если просто выводить точки по увеличению координаты Х, а если у 2-х точек они равны, первой выводить ту у которой координата Y -меньше ?


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.10.2007 16:31
Сообщение #9


Гость






wilin, проще всего будет найти координаты центра тяжести треугольника (эта точка всегда должна находиться внутри треугольника, если я не ошибаюсь), а уж потом выводить вершины в порядке возрастания угла между осью OX и линией, соединяющей центр тяжести и вершину...
 К началу страницы 
+ Ответить 
wilin
сообщение 14.10.2007 16:31
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Ребята, я застопорилась sad.gif

Цитата
а если просто выводить точки по увеличению координаты Х, а если у 2-х точек они равны, первой выводить ту у которой координата Y -меньше ?


так не смогла... С сортировкой у меня проблемы smile.gif

Не может ли кто-нибудь привести точный алгоритм?

Попробовала так... Ввела в массив значения от arctg(yi/xi). Сделала ее сортировку по возрастанию. Потом хотела сделать так, чтобы проверялось, нет ли одинаковых значений у соседних параметров. Но... Не знаю, как это реализовать - все перемешалось, так что определить, кому какие коорднаты принадлежат, я не могу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
compiler
сообщение 14.10.2007 16:33
Сообщение #11


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(wilin @ 14.10.2007 16:09) *
и в этом случае вычислять расстояние? smile.gif

ну, коль хочешь через теорему косинусов, то...
1) ищешь координаты центра(тяжести?) трИугольника (О).
2) Рассматриваешь треугольник ОВD(ВD перпендикуляр)
2.1) Находишь катеты DО и ВD(по координатам)
2.2)По теореме косинусов находишь угол ВОD...
3)Сравниваешь углы...

сколько тут уже написали...

Сообщение отредактировано: compiler - 14.10.2007 16:34


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
wilin
сообщение 14.10.2007 16:36
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


А как найти координаты центра тяжести плоского треугольника, если мне не заданы веса точек?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.10.2007 16:41
Сообщение #13


Гость






Считай веса одинаковыми, например, единичными...
 К началу страницы 
+ Ответить 
klem4
сообщение 14.10.2007 16:47
Сообщение #14


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


мой последний вариант крайне не верен smile.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
wilin
сообщение 14.10.2007 16:51
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


klem4, почему? smile.gif

извините за тупой вопрос, но как проще вывести числа в порядке возрастания?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 14.10.2007 16:59
Сообщение #16


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +




потому что возможен вариант, при котором более "правая" точка должна выводиться раньше более "левой"

например
(5, 4)
(2, 4)
(3, 1)

Сейчас есть одна мысль, если сделаю - выложу ..

Сообщение отредактировано: klem4 - 14.10.2007 17:00


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
wilin
сообщение 14.10.2007 17:09
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


пока сделала так...

cx:=(x1+x2+x3)/3;
cy:=(y1+y2+y3)/3;
a[1]:=arctg((x1-cx)/y1-cy));
a[2]:=arctg((x2-cx)/y2-cy));
a[3]:=arctg((x3-cx)/y3-cy));

for i:=1 to 3 do
begin
for j:=1 to 2 do
begin
k:=a[i];
if j<a[j+1] then begin
a[i]:=a[j+1];
a[j+1]:=k;
end;
end;
write(a[i],' ');
end;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.10.2007 17:31
Сообщение #18


Гость






wilin, ты немного не то печатаешь... Надо распечатать координаты точек, а не углы:

Прикрепленный файл  triang.pas ( 752 байт ) Кол-во скачиваний: 337
 К началу страницы 
+ Ответить 
Lapp
сообщение 14.10.2007 23:17
Сообщение #19


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Насколько я понимаю, нужно использовать вектора сторон. Ход рассуждения примерно такой..

1. Находим координаты векторов АВ и ВС.
2. Вычисляем их векторное произведение (точнее, одну его компоненту, которая перпендикулярна плоскости - остальные все равно нулевые).
3. Если оно положительно, то обход А-В-С по часовой стрелке, если отрицательное - то против.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
wilin
сообщение 14.10.2007 23:32
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Ребята, спасибо всем большое за помощь! smile.gif Увидела множество идей, отзывчивость и готовность помочь человеку give_rose.gif

Добавлено через 3 мин.
Репутацию повысить я пока, увы, не могу, посему придется выслушать только большое человеческое спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 14:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"