[Python] вопрос/ответ.

Discussion in 'Python' started by De-visible, 21 Jan 2009.

  1. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    147
    Likes Received:
    40
    Reputations:
    0
    ПОмогите срочно !!! Есть массив координат например [(0, 1), (20, 25), (52, 56), (21, 9), (35, 513)] , мне надо его отсортировать по самой близкой координате. Приму любые варианты, ЛЮБЫЕ. Заранее спасибо за внимание !!!!
     
  2. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    236
    Likes Received:
    305
    Reputations:
    4
    Насколько я понимаю, вам нужно отсортировать координаты в списке по убыванию расстояния от центра координатной плоскости (точка с координатами (0; 0)). В таком случае нужно воспользоваться формулой расстояния между двумя точками на плоскости (также известна как формула длины двухмерного вектора):
    [​IMG]
    Поскольку, центр — точка (x0; y0) с координатами (0; 0), формула упрощается:
    sqrt((x-x0)**2 + (y-y0)**2) -> sqrt(x**2 + y**2)
    Метод list.sort() имеет параметр key, который принимает функцию сортировки.
    Пишем функцию сортировки:
    Code:
    import math
    
    def sortKey(value):
        x, y = value
        d = math.sqrt(x**2 + y**2)
        return d
    Сортируем:
    Code:
    coords = [(0, 1), (20, 25), (52, 56), (21, 9), (35, 513)]
    coords.sort(key=sortKey)
    print(coords)
    Более простой вариант с использованием анонимной функции:
    Code:
    import math
    coords = [(0, 1), (20, 25), (52, 56), (21, 9), (35, 513)]
    coords.sort(key=lambda c: math.sqrt(c[0]**2 + c[1]**2))
    print(coords)
    Результат:
    [(0, 1), (21, 9), (20, 25), (52, 56), (35, 513)]
     
    #1142 4Fun, 3 Sep 2020
    Last edited: 3 Sep 2020
    Matrix001 likes this.
  3. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    147
    Likes Received:
    40
    Reputations:
    0
    Я сегодня поэксперементировал, это не совсем то что мне подходит
     
  4. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    236
    Likes Received:
    305
    Reputations:
    4
    Прошу тогда нормально изложить вопрос. Можно описать задачу полностью.
     
  5. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    147
    Likes Received:
    40
    Reputations:
    0
    Есть допустим эти точки. [​IMG]
    Эта сортировка будет соединять их где-то так
    [​IMG]
    А мне нужно что бы после сортировки точки были отсортированы таким образом, что бы я мог соединять их так
    [​IMG]
     
  6. 4Fun

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    236
    Likes Received:
    305
    Reputations:
    4
    @Matrix001
    Вы говорите не о сортировке, о задаче на построение выпуклой оболочки. Решается она через подзадачу: определение положения точки относительно вектора: https://acmp.ru/article.asp?id_text=172
    Алгоритм вкратце: выбираем любую точку A из множества точек, затем выбираем любую точку B, строим вектор AB, затем в цикле проверяем положение всех оставшихся точек относительно вектора AB. Допустиим, будем строить оболочку по часовой стрелке, тогда все остальные точки должны быть по правую сторону вектора. Если какая-либо точка оказывается по левую сторону — прерываем цикл и выбираем другую точку B, затем снова проверяем положение остальных точек относительно вектора AB. И так до тех пор, пока не будет выбрана верная точка B. После этого выбираем точку C и повторяем действия с вектором BC. Повторяем алгоритм до тех пор, пока не задействуем все точки. После этого соединяем две оставшиеся, замыкая оболочку.
    Возможно, набросаю код, но чуть позже.
     
    #1146 4Fun, 5 Sep 2020
    Last edited: 5 Sep 2020
    fandor9 and Matrix001 like this.
  7. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    147
    Likes Received:
    40
    Reputations:
    0
    Спасибо, очень помогаете !
     
  8. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    147
    Likes Received:
    40
    Reputations:
    0
    Может уже как-то получиться показать код на python-е ? Я у себя использовал эту функцию
    Code:
    def cc(crd, crds, index, r=1):
        size = 300, 401
        tarr = []
    
        res = False
    
        for x in range(crd[0]+r, crd[0]+r+1):
            for y in range(crd[1] - r, crd[1] + r + 1):
                if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                    tarr.append((x, y))
    
        for x in range(crd[0]-r, (crd[0]-r)+1):
            for y in range(crd[1] - r, crd[1] + r + 1):
                if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                    tarr.append((x, y))
    
        for y in range(crd[1]-r, (crd[1]-r)+1):
            for x in range(crd[0] - r, crd[0] + r + 1):
                if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                    tarr.append((x, y))
    
        for y in range(crd[1]+r, (crd[1]+r)+1):
            for x in range(crd[0] - r, crd[0] + r + 1):
                if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                    tarr.append((x, y))
    
        for i in range(0, len(tarr)):
            if tarr[i] in crds:
                res = True
                draw.line((crd[0], crd[1], tarr[i][0], tarr[i][1]), fill=index) #грубо
                break
    
        return res
    Она просто берет от координаты допусти (1,1) соседнии пиксели по радиусу (включая по диагонали) и если есть такая координата в массиве с уже существующими координтами, то рисует (грубо) линию. Но это конечно происходит сначало с радиусом 1-н, потом радиус увеличивается пока не будет найдена та точка. Это мне намного лучше конечно помогает, получается довольно та ки прикольно. Но наверное то что ты писал, будет намного лучше ??? И да, мой алгоритм таков, что я не могу использовать многопоточность, потому что у меня все должно выполнятся линейно, то есть, бесмысленно мне делать даже так что создавать массив из 256-х, а потом уже из него все заменять. Это будет даже дольше.

    [​IMG]
    [​IMG]
     
  9. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    147
    Likes Received:
    40
    Reputations:
    0
    Как я могу в OpenCV сделать свой собственный фильтр на два изображения ? Например у меня есть первое изображение и второе изображение. Я хочу что бы в результате сравнения этих двух изображений получилось изображение из максимального значения, как это сделать в OpenCV ?
     
Loading...
Similar Threads - Python вопрос ответ
  1. hell11
    Replies:
    0
    Views:
    870
  2. che4ry
    Replies:
    1
    Views:
    2,655
  3. jintian
    Replies:
    1
    Views:
    2,808
  4. K800
    Replies:
    0
    Views:
    2,070