Помощь - Поиск - Пользователи - Календарь
Полная версия: Треугольник с заданными вершинами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
wilin
Здравствуйте, дорогие форумчане!

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

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

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

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

и осью ОХ

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

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

Антипример:


(для точек A и B твой алгоритм сбоит)
compiler
Цитата(volvo @ 14.10.2007 16:05) *
Антипример:
я уже нарисовал и хотел выкладывать такую картинку smile.gif , правда у меня точка С повыше smile.gif
wilin
и в этом случае вычислять расстояние? smile.gif
klem4
а если просто выводить точки по увеличению координаты Х, а если у 2-х точек они равны, первой выводить ту у которой координата Y -меньше ?
volvo
wilin, проще всего будет найти координаты центра тяжести треугольника (эта точка всегда должна находиться внутри треугольника, если я не ошибаюсь), а уж потом выводить вершины в порядке возрастания угла между осью OX и линией, соединяющей центр тяжести и вершину...
wilin
Ребята, я застопорилась sad.gif

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


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

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

Попробовала так... Ввела в массив значения от arctg(yi/xi). Сделала ее сортировку по возрастанию. Потом хотела сделать так, чтобы проверялось, нет ли одинаковых значений у соседних параметров. Но... Не знаю, как это реализовать - все перемешалось, так что определить, кому какие коорднаты принадлежат, я не могу.
compiler
Цитата(wilin @ 14.10.2007 16:09) *
и в этом случае вычислять расстояние? smile.gif

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

сколько тут уже написали...
wilin
А как найти координаты центра тяжести плоского треугольника, если мне не заданы веса точек?
volvo
Считай веса одинаковыми, например, единичными...
klem4
мой последний вариант крайне не верен smile.gif
wilin
klem4, почему? smile.gif

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


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

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

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

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
wilin, ты немного не то печатаешь... Надо распечатать координаты точек, а не углы:

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

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

Добавлено через 3 мин.
Репутацию повысить я пока, увы, не могу, посему придется выслушать только большое человеческое спасибо!
Valery
Наверное тема уже неактуальна.
Так, по следам решил добавить.
Может сделать так:
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
Цитата
будет ли точка с координатами <...> лежать внутри
А ты внимательно читал все, что было предложено до тебя, или у тебя Write-only? Или ты думаешь, что мы тут предлагаем заведомо нерабочие алгоритмы? На том, что так оно и будет (для треугольника - всегда) построен алгоритм, предложенный еще в 9-ом посте, и реализованный в 18-м. Проверено было для 20 произвольных треугольников, ни на одном сбоя не было (да и с какой стати ему быть, ты можешь объяснить? Что, бывают выпуклые и НЕвыпуклые треугольники? Вот для четырехугольника эта точка не всегда будет лежать внутри, а треугольника вогнутого я не видел... Покажешь?)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.