Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2015, 23:18   #1
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию Сортировать точки по часовой стрелке

Здравствуйте. Есть массив точек

Код:
0 = 228/35
1 = 505/35
2 = 72/91
3 = 661/91
4 = 29/204
5 = 704/204
6 = 613/320
7 = 347/362
Задача: "От произвольно взятой точки отсортировать по эллипсу точки в направлении часовой стрелки". Помогите алгоритмом или готовым кодом)
DarkHacker вне форума Ответить с цитированием
Старый 24.01.2015, 15:30   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Эта произвольная точка будет центром эллипса ? В направлении часовой стрелки - это по сути замкнутая кривая , а чтобы сортировать надо начинать с чего-либо. Допустим начинаем с 90 градусов в стандартной декартовой системе координат.
Сделать в целом несложно, создаём для каждой точки ещё одно поле в записи (т.е. помимо координат ещё нужно для каждой точки хранить значение), его лучше взять вещественное. В цикле для всех точек, пропуская ессно центровую, вычислить угол (опять же в декартовой системе) луча проходящего из центральной точки в текущую на шаге цикла. Угол можно вычислить даже обычной разностью координат ( а вообще этих алгоритмов немало), угол и записать в то поле. Далее просто сортируем как числа эти углы, с поправкой, что критерий сортировки это от 90 (включительно) до 0 градусов - наиболее приоритетная часть, и от 359,(9) до 90 (не включительно) - следующая после предыдущей части по приоритету.
phomm вне форума Ответить с цитированием
Старый 24.01.2015, 15:35   #3
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Спасибо что откликнулись, но я задачу уже решил.

Код:
type
 TPoint2 = packed record
   X: Longint;
   Y: Longint;
   Angle: Longint;
   end;
  TPointsArray2 = array of TPoint2;
Код:
function GetAngle(const Center, P: TPoint): Double;
begin
  Result := ArcTan2(Center.y - P.y, P.x - Center.x) * (180 / Pi);
  {Чтобы возвращала результат в радианах, нужно <* (180 / Pi)> убрать}
  if Result < 0 then
    Result := Result + 360; {Эта строка необязательна}
end;


procedure qSort(var a: TPointsArray2);
var
i,j,n: Integer;
x: TPoint2;
begin
n:=length(a)-1;

  for I := 1 to n - 1 do
    for j := 1 to n - 1 do
      if a[j].Angle < a[j+1].Angle then
        begin
          x := a[j+1];
          a[j+1] := a[j];
          a[j] := x;
        end;
end;
Присваиваем угол к элементу массива, сортируем и применяем любой доступный алгоритм (Грэхема и т.д)
DarkHacker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот матрицы по/против часовой стрелке Murashov Общие вопросы C/C++ 2 05.12.2012 19:57
Программа "Выести значения координат треугольника в порядке обхода по часовой стрелке" Dan.D Общие вопросы C/C++ 2 28.09.2011 01:01
повернуть квадратную матрицу на 90 градусов по часовой стрелке brans Общие вопросы по Java, Java SE, Kotlin 1 18.02.2011 19:42
Как перевернуть изображение по часовой стрелке John_chek Мультимедиа в Delphi 7 09.07.2007 00:24