Как упорядочить координатные пары? - PullRequest
0 голосов
/ 23 сентября 2018

Кто-нибудь знает, как я могу заказать пару координат (x, y) в C ++?

Например, что сначала это координаты первого квадранта, затем координаты второго квадранта и т. Д.

Я уже пробовал библиотеку алгоритмов с помощью метода сортировки, но она не работает.

bool com(Coordenada a, Coordenada b){
    return a.getX() < b.getX() || a.getY() < b.getY();
}

void mapa::sortVertices(){
    std::sort (ver.begin(), ver.end(), com);
}

Например, до:

x=-1;y=-1
x=1;y=1
x=1;y=-1
x=-1;y=1

после:

x=1;y=1
x=1;y=-1
x=-1;y=-1
x=-1;y=1

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

У вас есть 2 варианта.Вы можете перегрузить оператор <для своей структуры Coordenada </strong>, или вы можете d определить пользовательскую функцию сравнения и передать ее в качестве параметра сортировки .Я сделал последнее.

Здесь вы можете увидеть код для него.

#include <vector>
#include <algorithm>
#include <iostream>

struct Coordenada {
    int x, y;
};

int findQuad(const Coordenada& a) {
    if(a.x >= 0 && a.y >= 0) return 1;
    if(a.x < 0 && a.y >= 0) return 2;
    if(a.x < 0 && a.y < 0) return 3;
    return 4;
}

bool cmp(const Coordenada& a, const Coordenada& b) {
    return findQuad(a) < findQuad(b);
}

int main() {

    std::vector<Coordenada> vetor(10);

    for(int i = 0; i < 10; ++i) {
        vetor[i].x = rand() - rand();
        vetor[i].y = rand() - rand();
    }

    std::sort(vetor.begin(), vetor.end(), cmp);

    for(int i = 0; i < 10; ++i) {
        std::cout << vetor[i].x << " " << vetor[i].y << " quad = " << findQuad(vetor[i]) << std::endl;
    }

    return 0;
}
0 голосов
/ 23 сентября 2018

Вы уверены, что ожидаемый результат правильный?Поскольку они не сортируются в квадрантах I, II, III, IV в порядке

x=1;y=1   → I
x=1;y=-1  → IV
x=-1;y=-1 → III
x=-1;y=1  → II

в соответствии с определением квадранта , результат должен быть

x=1;y=1   → I
x=-1;y=1  → II
x=-1;y=-1 → III
x=1;y=-1  → IV

quadrants

Существуют различные решения для сортировки:

Вот решение от Акшат

bool operator<(Point p1, Point p2) 
{
    if (p1.getY() == 0 && p1.getX() > 0) 
        return true;  // angle of p1 is 0, thus p2 > p1

    if (p2.getY() == 0 && p2.getX() > 0) 
        return false; // angle of p2 is 0 , thus p1 > p2

    if (p1.getY() > 0 && p2.getY() < 0) 
        return true; // p1 is between 0 and 180, p2 between 180 and 360

    if (p1.getY() < 0 && p2.getY() > 0) 
         return false;
    // return true if p1 is clockwise from p2
    return p1.getX() * p2.getY() - p1.getY() * p2.getX() > 0;
}

Если предложение Питера Рудермана - то, что вам нужнотогда вы можете использовать std::tie для функции сравнения

std::sort (ver.begin(), ver.end(), std::tie(a.getX(), a.getY()) < std::tie(b.getX(), b.getY()));
0 голосов
/ 23 сентября 2018

Проблема в том, что вы не определили действительный порядок в предикате.Если вы хотите определить общий порядок для координат, вы можете использовать что-то вроде этого:

bool CoordinateLess(Coordenada a, Coordenada b)
{
  return a.getX() < b.getX() || (a.getX() == b.getX() && a.getY() < b.getY());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...