Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Полярные координаты.

-

Вопросы и ответы, обсуждения

- Ваши вопросы по C# только в данном разделе

Ответ
 
Опции темы
Старый 07.05.2012, 19:28   #1
 Старший сержант
Аватар для Sinyss
 
Sinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака Норриса
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
Отправить сообщение для Sinyss с помощью Skype™
 
По умолчанию Полярные координаты.

Надо отсортировать список точек по полярному углу.
Есть множество точек, внутри этого множества задается точка, которая будет началом координат.
Получаем полярный угол точки, вставляем в структуру...
Мой код получения угла:
Код:
        private Angle getAngle(PointF start, PointF ourPoint)
        {
            BasicFunctions a = new BasicFunctions();
            float x = ourPoint.X - start.X;
            float y = ourPoint.Y - start.Y;
            if (a.DistanceBetweenPoint(start, ourPoint) == 0)
            {
                return new Angle(ourPoint, 0);
            }
            else 
            {
                if( x>0 && y>=0)
                {
                    return new Angle(ourPoint, (float)Math.Atan2(y, x));
                }
                else if(x>0 && y<0 )
                {
                    return new Angle(ourPoint, (float)Math.Atan2(y, x)+ 2* (float)Math.PI);
                }
                else if (x < 0)
                {
                    return new Angle(ourPoint, (float)Math.Atan2(y, x)+ (float)Math.PI);
                }
                else if (x==0 && y>0)
                {
                    return new Angle(ourPoint, (float)Math.PI/2);
                }
                else if (x == 0 && y < 0)
                {
                    return new Angle(ourPoint, -(float)Math.PI/2);
                }
                else if (x == 0 && y == 0)
                {
                    return new Angle(ourPoint, 0);
                }
            }
            return new Angle(ourPoint, 0);
        }
Структура Angle содержит точку и угол....

Функция Сортировки:
Код:
        public List<PointF> SortByAngle(PointF start)
        {
            List<PointF> newList = new List<PointF>();
            List<Angle> angles = new List<Angle>();
            foreach (PointF item in ListOfPoints)
            {
                Angle angle = getAngle(start, item);
                if (angles.Count == 0)
                {
                    angles.Add(angle);
                    continue;
                }
                for (int i = 0; i < angles.Count; i++)
                {
                    if (angle.angle < angles[i].angle)
                    {
                        angles.Insert(i, angle);
                        break;
                    }
                    else if (angle.angle == angles[i].angle)
                    {
                        BasicFunctions a = new BasicFunctions();
                        float p = a.DistanceBetweenPoint(start, angles[i].point);
                        if (p < a.DistanceBetweenPoint(start, angle.point))
                        {
                            angles[i] = angle;
                        }
                        break;
                    }
                }
                if (angle.angle > angles[angles.Count-1].angle)
                {
                    angles.Add(angle);
                }
            }
            foreach (Angle item1 in angles)
            {
                newList.Add(item1.point);
            }
            return newList;
        }
Не знаю в чем трабла...
  Ответить с цитированием
Старый 07.05.2012, 20:46   #2
 Сержант
Аватар для Yukikaze
 
Yukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядом
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
 
По умолчанию Re: Полярные координаты.

Код:
            List<Angle> angles = new List<Angle>();
            angles.Add(new Angle() { angle = 30, point = new Point(0, 0) });
            angles.Add(new Angle() { angle = 3, point = new Point(0, 0) });
            angles.Add(new Angle() { angle = 16, point = new Point(0, 0) });
            angles.Add(new Angle() { angle = 2, point = new Point(0, 0) });
            angles.Add(new Angle() { angle = 180, point = new Point(0, 0) });


            angles = angles.OrderBy(obj => obj.angle).ToList(); // Собсно тут мы и сортируем

            angles.ForEach(a => MessageBox.Show(a.angle.ToString())); // А тут мы все выводим
Одновременно собирать лист и сортировать его - это плохая практика

ЗЫ Хотелось бы увидеть весь класс целиком, слишком у тебя все запутано, можно сделать проще.
Одна только эта public List<PointF> SortByAngle(PointF start) строка уже нарушает законы ООП. Мы хотим отсортировать список углов, а возвращаем и задаем точки, неправильно это
________________
Talk is cheap. Show me the code
— Linus Torvalds

Последний раз редактировалось Yukikaze; 07.05.2012 в 20:54.
  Ответить с цитированием
Старый 07.05.2012, 22:47   #3
 Старший сержант
Аватар для Sinyss
 
Sinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака Норриса
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
Отправить сообщение для Sinyss с помощью Skype™
 
По умолчанию Re: Полярные координаты.

Цитата:
Сообщение от YukikazeПосмотреть сообщение
[CODE]
Одна только эта public List<PointF> SortByAngle(PointF start) строка уже нарушает законы ООП. Мы хотим отсортировать список углов, а возвращаем и задаем точки, неправильно это

Все дело в том что углы мне дальше не важны, мне надо просто отсортированный по ним список точек... Данные для обработки идут в конструктор класса, далее в основной процедуре они частично обрабатываются (находится точка начала координат) и выполняется эти методы...
В общем проблема нашлась, я не правильно переходил к новым координатам надо было:
Код:
            float x = start.X - ourPoint.X;
            float y = start.Y - ourPoint.Y;
Upd появилась новая проблема, есть внешняя оболочка, как найти описывающий ее круг за O(n Log n)

Последний раз редактировалось Sinyss; 07.05.2012 в 23:05.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Информация] координаты боссов в цлк demon443 Читы, баги и статьи по WoW 0 08.11.2011 03:33
КООРДИНАТЫ WEH liovin Читы, баги и статьи по WoW 3 24.03.2011 21:58
[Файл] WEH 3.1.3.-3.2.2 +координаты ГМ мест ASPCaYmAn Читы, баги и статьи по WoW 4 22.03.2010 08:55
координаты земель? ex3me Архив 6 16.07.2009 14:35

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 17:29.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net