Popular channels

Poligono en C++ (con linea de Bresenham)

Mi post pasado fue de la linea de Bresenham aqui veremos como utilizar el algoritmo de la linea de Bresenham para hacer poligonos regulares con sus respectivas trasformaciones, escalamiento, rotacion y traslacion todo esto en C++


El poligono es presentado en una matriz de char sencilla, no requiere ninguna libreria externa para poder ser ejecutado. Espero les sirva de algo 


Aqui les dejo el codigo 


#include "Trasformaciones.h"
#include
#include
#include
#define M_PI 3.14159265358979323846




using namespace std;




int puntosx[100];
int puntosy[100];
int puntosXNuevo[100];
int puntosYNuevo[100];
int guardaDiametro;
int guardaLados;
int lados;
char pantalla[75][75];
int tamanio = 75;
int origenX = 35;
int origenY = 35;




void LineaBresenham(int x0, int y0, int x1, int y1);
void dibujarPoligono(int origenX, int origenY, int distanciaR, int numLados);
void Dibuja();
void Imprime();
void Traslacion(int nuevoX, int nuevoY);
void Escalando(int escala);
void Traslacion2(int nuevoX, int nuevoY);
void Rotacion(int grados);














int main(){
bool sigue = true;
bool trasladar = false;
bool rotar = false;
bool escalar = false;


char decide;
char decidetraslada;
char deciderotar;
char decideescalar;


while (sigue){


for (int i = 0; i <= tamanio; i++){


for (int j = 0; j <= tamanio; j++){




pantalla[j] = '.';


}
cout << endl;






}
// Termina LLenado




int numLados;
int diametroR;


cout << "Numero de Lados" << endl;
cin >> numLados;
guardaLados = numLados;


cout << "Diametro R" << endl;
cin >> diametroR;
guardaDiametro = diametroR;
if (diametroR > 36){
cout << "Pueden Presentarse Problemas al Graficar" << endl;




}


dibujarPoligono(origenX, origenY, diametroR, numLados);
Imprime();


cout << "¿Desea Trasladar?" << ": Oprima T " <<"n En caso Contrario oprima N"<< endl;
cin >> decidetraslada;
if (decidetraslada == 't' || decidetraslada == 'T'){
// Traslacion
int desplazaX;
int desplazaY;
cout << "Cuantas unidades desea desplazar en X" << endl;
cin >> desplazaX;


cout << "Cuantas unidades desea desplazar en Y" << endl;
cin >> desplazaY;




Traslacion(desplazaX, desplazaY);
//Traslacion2(desplazaX, desplazaY);


cout << "Oprima una tecla para regresar al menu superior" << endl;
}
else


cout << "Desea Rotar?" << ": Oprima R" << "n En caso Contrario oprima N" << endl;
cin >> deciderotar;
if (deciderotar == 'r' || deciderotar == 'R'){
int grados;
cout << "Ingrese grados a rotar" << endl;
cin >> grados;


Rotacion(grados);


cout << "Oprima una tecla para regresar al menu superior" << endl;
}
else
cout << "Desea Escalar?" << ": Oprima E" << "n En caso Contrario oprima N" << endl;
cin >> decideescalar;
if (decideescalar == 'E' || decideescalar == 'e'){
int escala;
cout << "Ingrese Escala" << endl;
cin >> escala;
Escalando(escala);


cout << "Oprima una tecla para regresar al menu superior" << endl;
}






//Imprime





cout << "Si desea seguir trazando poligonos oprima (Y)" << "n en caso contrario oprima cualquier letra" << endl;
cin >> decide;
if (decide == 'y' || decide == 'Y'){
sigue = true;
}
else {
sigue = false;
cout << "Adios" << endl;
}




}
return 0;


}
void Escalando(int escala){




for (int i = 0; i <= tamanio; i++){


for (int j = 0; j <= tamanio; j++){




pantalla[j] = '.';


}
cout << endl;






}


if (escala<0){
escala =  guardaDiametro/(escala*-1);
}
else
{
escala = escala*guardaDiametro;
}
dibujarPoligono(origenX, origenY, escala, guardaLados);


Imprime();


}


void Rotacion(int thetha){
for (int i = 0; i <= tamanio; i++){


for (int j = 0; j <= tamanio; j++){




pantalla[j] = '.';


}
cout << endl;






}
// Termina llenado de matrix resultado


// Calcula nuevos puntos
for (int i = 0; i < lados;i++){
int puntoX; 
int puntoY;


//puntoX = desicion(((puntosx)*cos(thetha))-((puntosy)*sin(thetha)));
//puntoY = desicion(((puntosx)*sin(thetha))+((puntosy)*cos(thetha)));
puntoX = (int)round(origenX + ((puntosx) - origenX)*cos(thetha) - ((puntosy) - origenY)*sin(thetha));
puntoY = (int)round(origenY + ((puntosx) - origenX)*sin(thetha) + ((puntosy) - origenY)*cos(thetha));




cout << "Px= " << puntoX << " Py=" << puntoY << " PAR DE COORDENADAS ROTADAS: " << i << endl;
puntosXNuevo = puntoX;
puntosYNuevo = puntoY;


}
// Dibuja nuevo


for (int r = 0; r
{
LineaBresenham(puntosXNuevo[r], puntosYNuevo[r], puntosXNuevo[r + 1], puntosYNuevo[r + 1]);
cout << "Uniendo" << " x0= " << puntosXNuevo[r] << " y0=" << puntosYNuevo[r] << " CON " << "x1= " << puntosXNuevo[r + 1] << " y1=" << puntosYNuevo[r + 1] << endl;




}
LineaBresenham(puntosXNuevo[lados - 1], puntosYNuevo[lados - 1], puntosXNuevo[0], puntosYNuevo[0]);
cout << "Cerrando Figura " << "x0= " << puntosXNuevo[lados - 1] << " y0=" << puntosYNuevo[lados - 1] << " CON " << " x1=" << puntosXNuevo[0] << " y1=" << puntosYNuevo[0] << endl;


// Termina Nuevo Dibujo


Imprime();


}


void Traslacion2(int nuevoX,int nuevoY){


dibujarPoligono(origenX + nuevoX, origenY + nuevoY, guardaDiametro, guardaLados);


Imprime();
}


void Traslacion(int nuevoX,int nuevoY){


for (int i = 0; i <= tamanio; i++){


for (int j = 0; j <= tamanio; j++){




pantalla[j] = '.';


}
cout << endl;






}


dibujarPoligono(origenX+nuevoX,origenY+nuevoY,guardaDiametro,guardaLados);


Imprime();


}




void Dibuja(){


if (lados>0)
{


for (int i = 0; i
{
LineaBresenham(puntosx, puntosy, puntosx[i + 1], puntosy[i + 1]);


cout << "Uniendo" << " x0= " << puntosx << " y0=" << puntosy << " CON " << "x1= " << puntosx[i + 1] << " y1=" << puntosy[i + 1] << endl;
}
LineaBresenham(puntosx[lados - 1], puntosy[lados - 1], puntosx[0], puntosy[0]);


cout << "Cerrando Figura " << "x0= " << puntosx[lados - 1] << " y0=" << puntosy[lados - 1] << " CON " << " x1=" << puntosx[0] << " y1=" << puntosy[0] << endl;
}
}
void dibujarPoligono(int origenX, int origenY, int distanciaR, int numLados){
cout << "Dibujando Poligono en:  x= " << origenX << " y= " << origenY << " R= " << distanciaR << " numLados=" << numLados << endl;


lados = numLados;
int grados = (int) (round(360 / lados));
int aux = grados;






int diametro = distanciaR;
int desplazamientoX = origenX;
int desplazamientoY = origenY;


pantalla[origenX][origenY] = 'C';






for (int i = 0; i
{


int px = (int)(round(diametro*(cos((M_PI*grados) / 180))) + desplazamientoX);
int py = (int)(round(diametro*(sin((M_PI*grados) / 180))) + desplazamientoY);


cout << "Px= " << px << " Py=" << py << " PAR DE COORDENADAS: " << i << endl;


puntosx = px;
puntosy = py;
//puntosXNuevo = px;
//puntosYNuevo = py;


grados = grados + aux;




}


Dibuja();




}










void LineaBresenham(int x1, int y1, int x2, int y2){
int pasoy;
int pasox;
int dx = (x2 - x1);
int dy = (y2 - y1);




if (dy < 0) {
dy = -dy;
pasoy = -1;


}
else {
pasoy = 1;
}


if (dx < 0) {
dx = -dx;
pasox = -1;
}
else {
pasox = 1;
}


int x = x1;
int y = y1;
pantalla[x1][y1] = '+';


if (dx>dy){
int p = 2 * dy - dx;
int incE = 2 * dy;
int incNE = 2 * (dy - dx);
while (x != x2){
x = x + pasox;
if (p < 0){
p = p + incE;
}
else {
y = y + pasoy;
p = p + incNE;
}
pantalla[x][y] = '*';




}
}
else{
int p = 2 * dx - dy;
int incE = 2 * dx;
int incNE = 2 * (dx - dy);
while (y != y2){
y = y + pasoy;
if (p < 0){
p = p + incE;
}
else {
x = x + pasox;
p = p + incNE;
}
pantalla[x][y] = '*';




}
}


}






void Imprime(){
for (int i = 0; i <= tamanio; i++){


for (int j = 0; j <= tamanio; j++){




cout << pantalla[j];


}
cout << endl;






}
cin.get();
}








Aqui las muestras del funcionamiento del programa






El archivo cpp
"Cambiaria todo lo que se, por la mitad de lo que ignoro"
https://drive.google.com/file/d/0B6H2cOm_wRaDbG9fZHlUZ2lsWXM/view?usp=sharing



 
0
1
0
1Comment
Tungrum

Estos posts son oro puro.

0