Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Треугольник с заданными вершинами

Автор: wilin 14.10.2007 19:42

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

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

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

Как-то после прочтения условия мне показалось, что можно вычислить расстояние от точки до начала координат, потом найти угол поворота между тем отрезкой с расстоянием. А потом сортировать по принципу - у кого больше угол, да еще и больше длина отрезка, тот первый, у кого поменьше - второй и т.д. Правильно ли я мыслю, или в этом алгоритме есть подводные камни?
Поделить, пожалуйста, своими мыслями. Буду рада и решению smile.gif Но пуще - наводке.

Автор: compiler 14.10.2007 19:54

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


Автор: klem4 14.10.2007 19:55

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

и осью ОХ

вот и все.

Автор: wilin 14.10.2007 19:59

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

Угол найти через теорему косинусов и прочее? smile.gif

Автор: volvo 14.10.2007 20:05

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

Антипример:


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


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

Автор: compiler 14.10.2007 20:06

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

Автор: wilin 14.10.2007 20:09

и в этом случае вычислять расстояние? smile.gif

Автор: klem4 14.10.2007 20:25

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

Автор: volvo 14.10.2007 20:31

wilin, проще всего будет http://forum.pascal.net.ru/index.php?s=&showtopic=2759&view=findpost&p=25102 треугольника (эта точка всегда должна находиться внутри треугольника, если я не ошибаюсь), а уж потом выводить вершины в порядке возрастания угла между осью OX и линией, соединяющей центр тяжести и вершину...

Автор: wilin 14.10.2007 20:31

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

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


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

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

Попробовала так... Ввела в массив значения от arctg(yi/xi). Сделала ее сортировку по возрастанию. Потом хотела сделать так, чтобы проверялось, нет ли одинаковых значений у соседних параметров. Но... Не знаю, как это реализовать - все перемешалось, так что определить, кому какие коорднаты принадлежат, я не могу.

Автор: compiler 14.10.2007 20:33

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

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

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


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

Автор: wilin 14.10.2007 20:36

А как найти координаты центра тяжести плоского треугольника, если мне не заданы веса точек?

Автор: volvo 14.10.2007 20:41

Считай веса одинаковыми, например, единичными...

Автор: klem4 14.10.2007 20:47

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

Автор: wilin 14.10.2007 20:51

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

извините за тупой вопрос, но как проще вывести числа в порядке возрастания?

Автор: klem4 14.10.2007 20:59



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

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

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

Автор: wilin 14.10.2007 21:09

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


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;


Автор: volvo 14.10.2007 21:31

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

Прикрепленный файл  triang.pas ( 752 байт ) Кол-во скачиваний: 505

Автор: Lapp 15.10.2007 3:17

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

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

Автор: wilin 15.10.2007 3:32

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

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

Автор: Valery 19.10.2007 12:28

Наверное тема уже неактуальна.
Так, по следам решил добавить.
Может сделать так:
1. в заданном треугольнике выбрать произвольную внутреннюю точку
2. принять ее за начало координат
3. перейти в полярную систему координат
4. сортировать вершины по углу поворота в порядке, какой вам требуется, хоть по возрастанию, хоть по убыванию.

Думаю, самым сложным действом всего этого для произвольного треуольника будет шаг первый.

Хочу услышать ваше мнение по данному способу.
smile.gif

P.S. Уже после наприсания пришла в голову мысль по шагу первому:
Для произвольного треугольника, ну или выпуклого многоугольника (X1,Y1,X2,Y2,..., Xn,Yn), будет ли точка с координатами
X=(X1+X2+...+Xn)/n
Y=(Y1+Y2+...+Yn)/n
лежать внутри, т.е. удовлетворять п.1 для последующего обхода по часовой или против часовой стрелки?
Ваши мнения?

Автор: volvo 19.10.2007 13:24

Цитата
будет ли точка с координатами <...> лежать внутри
А ты внимательно читал все, что было предложено до тебя, или у тебя Write-only? Или ты думаешь, что мы тут предлагаем заведомо нерабочие алгоритмы? На том, что так оно и будет (для треугольника - всегда) построен алгоритм, предложенный еще в 9-ом посте, и реализованный в 18-м. Проверено было для 20 произвольных треугольников, ни на одном сбоя не было (да и с какой стати ему быть, ты можешь объяснить? Что, бывают выпуклые и НЕвыпуклые треугольники? Вот для четырехугольника эта точка не всегда будет лежать внутри, а треугольника вогнутого я не видел... Покажешь?)