2016-03-03 2 views
-4

У меня есть список точек, которые я хочу сортировать.C# сортировать список в зависимости от функции

Результирующий порядок сортировки должен соответствовать выходному сигналу функции, которая берет точку из списка вместе с двумя фиксированными точками в качестве входных данных.

Функция, которая решает сортировкой выглядит следующим образом:

public static double GetAngle(Point P1, Point P2, Point P3) 
    { 
     Point Vec1 = P1.Vector(P2); 
     Point Vec2 = P1.Vector(P3); 
     double angle = Math.Atan2(CrossProduct(Vec1, Vec2), Dot(Vec1, Vec2)) * 180/Math.PI; 
     if (angle < 0) 
      angle += 360; 
     return angle; 
    } 

Где P1 мой вход из списка и P2 и P3 являются неподвижными точками.

Как объединить эту функцию GetAngle() и две неподвижные точки, чтобы отсортировать список правильно?

+3

Удачи с этим! У вас есть вопрос? –

+0

Некоторая информация о списке и те «2 другие конкретные точки» потребуются. Они тоже в списке? –

+0

И что вы уже пробовали в стороне от этой функции, чтобы получить угол? – Blackunknown

ответ

1

Если я правильно понимаю ваш вопрос: у вас есть список пунктов, я буду называть их List<Point> myListOfPoints

то я полагаю, ваш вопрос в том, как получить эти пункты отсортированы по их выход от метода MyFunc. Если выход представляет собой относительный угол одной точки в списке и две фиксированные точки, которые я просто позвоню myFixedPoint1 и myFixedPoint2 для этого примера.

myListOfPoints.Sort((a,b) => MyFunc(a, myFixedPoint1, myFixedPoint2).CompareTo(MyFunc(b, myFixedPoint1, myFixedPoint2))); 

Или частично применяя неподвижную точку, чтобы создать функцию сортировки, которая принимает один параметр:

var sortFunc = new Func<Point, double>(x => MyFunc(x, myFixedPoint1, myFixedPoint2)); 
myListOfPoints.Sort((a,b) => sortFunc(a).CompareTo(sortFunc(b))); 
0

Прежде всего, вам необходимо создать класс Angle с вашими 3 очками в качестве членов. Затем сделать угол для достижения IComparable inrterface

Наконец, вы можете иметь List<Angle> и выполнять сортировку. Здесь у вас есть полный пример: http://www.dotnetperls.com/icomparable

Смежные вопросы