Здравствуйте, дорогие форумчане!
Очень надеюсь на вашу помощь, поскольку сама измучалась предположениями. Условие задачи таковое:
Заданы координаты треугольника. Вывести их в порядке обхода по часовой стрелке
Как-то после прочтения условия мне показалось, что можно вычислить расстояние от точки до начала координат, потом найти угол поворота между тем отрезкой с расстоянием. А потом сортировать по принципу - у кого больше угол, да еще и больше длина отрезка, тот первый, у кого поменьше - второй и т.д. Правильно ли я мыслю, или в этом алгоритме есть подводные камни?
Поделить, пожалуйста, своими мыслями. Буду рада и решению Но пуще - наводке.
я думаю, что вместо начала координат, надо взять центр триугольника....
Ход мыслей верный, только мне кажется длина отрезка будет не причем. Надо мерить угол между прямой
проходящей через точки
(0.0) - (вершина.х, вершина.у)
и осью ОХ
вот и все.
Спасибо за ответы Как поможет в этом деле центр треугольника, я не поняла
Угол найти через теорему косинусов и прочее?
и в этом случае вычислять расстояние?
а если просто выводить точки по увеличению координаты Х, а если у 2-х точек они равны, первой выводить ту у которой координата Y -меньше ?
wilin, проще всего будет http://forum.pascal.net.ru/index.php?s=&showtopic=2759&view=findpost&p=25102 треугольника (эта точка всегда должна находиться внутри треугольника, если я не ошибаюсь), а уж потом выводить вершины в порядке возрастания угла между осью OX и линией, соединяющей центр тяжести и вершину...
Ребята, я застопорилась
А как найти координаты центра тяжести плоского треугольника, если мне не заданы веса точек?
Считай веса одинаковыми, например, единичными...
мой последний вариант крайне не верен
klem4, почему?
извините за тупой вопрос, но как проще вывести числа в порядке возрастания?
потому что возможен вариант, при котором более "правая" точка должна выводиться раньше более "левой"
например
(5, 4)
(2, 4)
(3, 1)
Сейчас есть одна мысль, если сделаю - выложу ..
пока сделала так...
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;
wilin, ты немного не то печатаешь... Надо распечатать координаты точек, а не углы:
triang.pas ( 752 байт )
Кол-во скачиваний: 505
Насколько я понимаю, нужно использовать вектора сторон. Ход рассуждения примерно такой..
1. Находим координаты векторов АВ и ВС.
2. Вычисляем их векторное произведение (точнее, одну его компоненту, которая перпендикулярна плоскости - остальные все равно нулевые).
3. Если оно положительно, то обход А-В-С по часовой стрелке, если отрицательное - то против.
Ребята, спасибо всем большое за помощь! Увидела множество идей, отзывчивость и готовность помочь человеку
Добавлено через 3 мин.
Репутацию повысить я пока, увы, не могу, посему придется выслушать только большое человеческое спасибо!
Наверное тема уже неактуальна.
Так, по следам решил добавить.
Может сделать так:
1. в заданном треугольнике выбрать произвольную внутреннюю точку
2. принять ее за начало координат
3. перейти в полярную систему координат
4. сортировать вершины по углу поворота в порядке, какой вам требуется, хоть по возрастанию, хоть по убыванию.
Думаю, самым сложным действом всего этого для произвольного треуольника будет шаг первый.
Хочу услышать ваше мнение по данному способу.
P.S. Уже после наприсания пришла в голову мысль по шагу первому:
Для произвольного треугольника, ну или выпуклого многоугольника (X1,Y1,X2,Y2,..., Xn,Yn), будет ли точка с координатами
X=(X1+X2+...+Xn)/n
Y=(Y1+Y2+...+Yn)/n
лежать внутри, т.е. удовлетворять п.1 для последующего обхода по часовой или против часовой стрелки?
Ваши мнения?