Megazord32
Membro
Nota: enganei-me no titulo. Queria escrever Bubble Sort
Boa tarde.
Estou a tentar implementar em c++ o seguinte trabalho:
Dada uma lista de pontos(x,y) num ficheiro .txt, tenho que os ordenar pelo ângulo que formam com uma recta horizontal que passa pelo ponto de menor abcissa (ordenando os ângulos é possivel desenhar um poligono)
Já identifiquei o ponto com a menor abcissa (Ponto de referência). Para calcular os ângulos usei atan2. Até aqui funciona tudo bem.
Agora tenho que usar o Bubble Sort para ordenar os ângulos mas nao sei como o implementar, pois quando crio o array para pôr os ângulos o atan2 deixa de funcionar. Como faço?
A lista de pontos é apresentada da seguinte forma (.txt)
poligono.cpp
Boa tarde.
Estou a tentar implementar em c++ o seguinte trabalho:
Dada uma lista de pontos(x,y) num ficheiro .txt, tenho que os ordenar pelo ângulo que formam com uma recta horizontal que passa pelo ponto de menor abcissa (ordenando os ângulos é possivel desenhar um poligono)
Já identifiquei o ponto com a menor abcissa (Ponto de referência). Para calcular os ângulos usei atan2. Até aqui funciona tudo bem.
Agora tenho que usar o Bubble Sort para ordenar os ângulos mas nao sei como o implementar, pois quando crio o array para pôr os ângulos o atan2 deixa de funcionar. Como faço?
A lista de pontos é apresentada da seguinte forma (.txt)
169,133
550,220
169,306
474,63
305,414
305,25
474,376
Código:
//poligono.h
class Poligono
{
private:
Ponto p1, p2;
COLORREF cor;
struct No{ // estrutura do nó da lista ligada
No * proximo;
Ponto ponto;
};
No * primeiro; // apontador para o primeiro nó da lista
public:
//(etc..)
Poligono(Ponto p1, Ponto p2, HWND janId);
void ordenar();
};
poligono.cpp
Código:
void Poligono::ordenar(){
if (primeiro==NULL){return;}
No*aux=primeiro;
int px_ref,py_ref,x_menor; //px_ref,py_ref -> ponto de referência = ponto com menor x
p1 = aux->ponto;
px_ref = p1.obterX();
py_ref = p1.obterY();
aux=aux->proximo;
while(aux!=NULL)
{
p1=aux->ponto;
x_menor=p1.obterX();
if (px_ref<=x_menor)
aux=aux->proximo;
else
{
px_ref=p1.obterX();
py_ref=p1.obterY();
aux=aux->proximo;
}
}
Ponto p1(px_ref,py_ref);
printf("Ponto de referencia: %d,%d\n",p1.obterX(),p1.obterY()); //escreve o valor do menor x
Ponto p2(p2.obterX(),p2.obterY());
if(primeiro == NULL)
return;
No * aux2 = primeiro;
while(aux2->proximo != NULL)
{
p1=aux2 -> ponto;
aux2 = aux2 -> proximo;
p2 = aux2 -> ponto;
float yy= (p2.obterY()-py_ref);
float xx= (p2.obterX()-px_ref);
float angulo = atan2(yy,xx) * 180 / PI;
printf("angulo entre o ponto de referencia (%d,%d) e o ponto (%d,%d): %.f graus\n",px_ref,py_ref,p2.obterX(),p2.obterY(),angulo);
}
}
Última edição: