Как отсортировать 2D точки в 2D-растре - PullRequest
0 голосов
/ 15 марта 2020

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

На следующем шаге я пытаюсь отсортировать / растеризовать их в 2D массиве, по точке с наименьшим x, значение y в

array[0][0] 

и точка с наибольшим значением x, y в

array[n][k]

с условием 1:

все остальные 2D должны находиться между этими границами и почти отсортировано.

условие 2:

все строки массива должны быть заполнены почти одинаковым количеством значений, одинаковыми для столбцов.

Есть идеи, как решить эту проблему?

Я вычислил триангуляцию Делоне и подумал о диаграмме Вороного, чтобы шаг за шагом бросать каждую клетку, но я не знаю, нахожусь ли я на правильном пути.

Мои случайные позиции созданы таким образом:

std::vector<Point_d> sample_rand_points(){
  std::cout<<"sampling random points\n";
  std::vector<Point_d> output_pattern;

  //PREPARE:
  std::vector<std::pair<int, int> > not_sampled_yet;
  for(int x=0; x<_X; x++)
  {
    for(int y=0; y<_Y; y++)
    {
      not_sampled_yet.push_back(std::pair<int,int>(x,y));
    }
  }
  //SAMPLING
  Point_d pix;
  for (int i=0; i<_Amount; i++)
  {
    //std::cout<<i<<"\n";
    int n= rand()% not_sampled_yet.size();
    pix.x= (double)not_sampled_yet[n].first;
    pix.y= (double)not_sampled_yet[n].second;
    not_sampled_yet[n]=not_sampled_yet.back();
    not_sampled_yet.pop_back();
    output_pattern.push_back(pix);
  }
  return output_pattern;

}

На выходе получается один вектор с точками {{x1, y1}, {x2, y2}, ......}

1 Ответ

0 голосов
/ 15 марта 2020

С помощью следующего кода вы можете создать «2d-массив» со случайным пикселем. На мой взгляд, нет необходимости использовать функцию генератора, такую ​​как sample_rand_points.

#include <iostream>
#include <vector>
#include <cstdlib>

int main()
{
    int NumX =10, NumY =20;
    std::vector<std::vector<bool>> data(NumX, std::vector<bool>(NumY));

    for(int i=0; i<NumX ; ++i)
    {
        for(int m=0; m<NumY ; ++m)
        {
            //Generation
            bool val = false;
            if(rand() % 2 == 0)
                val = true;

            //The Data
            data[i][m] = val;

            //Output
            if(val)
                std::cout << "*";
            else
                std::cout << "_";

        }
        std::cout << std::endl;
    }
}

Вы можете запустить приведенный выше код онлайн , чтобы увидеть следующий вывод:

_*____**__*_*__*****
_*__***____***___*_*
____*_**_*_*_**_***_
__*_*_*___*_*_*_**_*
_*****__*_****_****_
_***___*_***_**___*_
*__________*__*_*__*
*_*___***_*_*_*_*___
_***_*_*****_*_____*
*__*__*_*_____**__*_

Обратите внимание, что строка if(rand() % 2 == 0) контролирует плотность " выделенный пиксель.

...