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

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

  1. Matrix001

    Matrix001 Member

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

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    498
    Likes Received:
    703
    Reputations:
    10
    Насколько я понимаю, вам нужно отсортировать координаты в списке по убыванию расстояния от центра координатной плоскости (точка с координатами (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
    nynenado and Matrix001 like this.
  3. Matrix001

    Matrix001 Member

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

    4Fun Well-Known Member

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

    Matrix001 Member

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

    4Fun Well-Known Member

    Joined:
    25 Jul 2018
    Messages:
    498
    Likes Received:
    703
    Reputations:
    10
    @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
    Svan, fandor9 and Matrix001 like this.
  7. Matrix001

    Matrix001 Member

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

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    196
    Likes Received:
    97
    Reputations:
    3
    Может уже как-то получиться показать код на 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:
    196
    Likes Received:
    97
    Reputations:
    3
    Как я могу в OpenCV сделать свой собственный фильтр на два изображения ? Например у меня есть первое изображение и второе изображение. Я хочу что бы в результате сравнения этих двух изображений получилось изображение из максимального значения, как это сделать в OpenCV ?
     
  10. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    196
    Likes Received:
    97
    Reputations:
    3
    Я немного разобрался, хотелось бы посмотреть на код, потому что я не совсем понимаю как будет делаться такое прохождение для каждой точки если учесть что расположение точек может быть рандомным и не все "круги" должны быть замкнуты
     
  11. Hohol99

    Hohol99 Member

    Joined:
    7 Apr 2020
    Messages:
    61
    Likes Received:
    18
    Reputations:
    0
    Есть такая формула x^2 + y^2 = R^2 - если у вас в задаче координаты вида (x,y) можно использовать ее, а точнее - вывести R (радиус) и найти минимальный.
     
  12. zak_guen

    zak_guen New Member

    Joined:
    9 Aug 2021
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    #1152 zak_guen, 27 Aug 2021
    Last edited: 27 Aug 2021
  13. big-boss777

    big-boss777 New Member

    Joined:
    26 Sep 2022
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте.
    Пытаюсь реализовать алгоритм решения системы линейных уравнений согласно методу Крамера.
    Возможно, кто-то встречался с такой проблемой. Пршу помочь.
     
  14. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    629
    Likes Received:
    248
    Reputations:
    42
    big-boss777 likes this.
  15. big-boss777

    big-boss777 New Member

    Joined:
    26 Sep 2022
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
  16. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    196
    Likes Received:
    97
    Reputations:
    3
    В photoshop есть режим цвета как "Индексированные цвета".

    [​IMG]
    В этом режиме подбирается оптимально ограниченное количество цветов (например 256). Можно выбирать разную палитру.
    [​IMG]
    Как это реализовать в python 3.x с использованием numpy+opencv где палитра будет выстраиваться по индексам цветов этого изображения в градациях серого ?

    P.S: То есть где каждое значение пикслея изображения в градациях серого от 0 до 255 будет присвоен свой цвет.
    Реально ли такое ? Я пробовал лишь усреднение цветов, что дает плохой результат.
    Также не помогает HSV и HLS !
    Заранее спасибо за любую помощь !!! Могу заплатить 300 р за ответ.
     
    #1156 Matrix001, 22 Oct 2022
    Last edited: 22 Oct 2022
  17. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    629
    Likes Received:
    248
    Reputations:
    42
  18. Matrix001

    Matrix001 Member

    Joined:
    18 Aug 2016
    Messages:
    196
    Likes Received:
    97
    Reputations:
    3
    Ха, это вообще не то (хотя проблема в иной сфере таже и не решена как видно)...
    Причем здесь цвета и индексы (мне не нужно переводить цвета в индексы для превращения изображения в градации сеорого).
    Мне нужно что бы цвета (ограниченного количества) подбирались к значениям (изображения оригинального с полной RGB переведенного из цветного в градации серого ПРОСТЫМ УСРЕДНЕНИЕМ ВСЕХ КАНАЛОВ как обычно) так что бы это было понятное изображение а не бредятина (пробовал больше 4 способов присвоить цвета после индекса к значениям усредненного оригинального изображения (градации сеорго) получалось сплошное г***) ...
    Photoshop со своими индексами цветами просто подбирает цвета по ограниченному количеству так что бы было приблизно соответствие к оригинальному цвету пикселя, но не учитывает индекс по изображению в градациях серого.
    Понятное, что невозможно использовать все 0...255 значений в градациях сеорого изображения если в изображении всего 3 цвета допустим (там будет простая нормализация по индексам градаций серого изображения я так себе это представляю), но я думаю это реально если в изображении их >= 256.
    Наверное я пытаюсь решить то что стоилобы милиарды, и то что способно сократить размер любого изображения в 100 раз без потери качества вообще.
    Но мне это нужно для других целей.
     
    #1158 Matrix001, 27 Oct 2022
    Last edited: 27 Oct 2022