|
Полярные координаты. - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
07.05.2012, 19:28
|
#1
|
|
|
|
Старший сержант
|
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
|
Полярные координаты.
Надо отсортировать список точек по полярному углу.
Есть множество точек, внутри этого множества задается точка, которая будет началом координат.
Получаем полярный угол точки, вставляем в структуру...
Мой код получения угла:
Код:
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
|
|
|
|
Сержант
|
Регистрация: 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
|
|
|
|
Старший сержант
|
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
|
Re: Полярные координаты.
|
Цитата: |
|
|
|
|
|
|
|
|
|
[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.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 17:29.
|
|