Traslape de figuras geométricas simples

Este programa analiza la posibilidad de traslape de un rectángulo con otro y de un círculo con un rectángulo. Este análisis se basa en las coordenadas y las dimensiones de las figuras, cuyas definiciones se incluyen en el código. Si quisiera extenderse este concepto a polígonos de más lados, deben utilizarse conceptos de álgebra lineal (específicamente, ortogonalización de Gram-Schmidt).

Los resultados pueden verse arriba.

================================== Código ================================

#include <iostream>
#include <cmath>

using namespace std;

struct Rectangle{
float x1,y1,x3,y3;

int Overlap(Rectangle r){

if (((r.x1<x1 && x1<r.x3) || (r.x1>x1 && x1>r.x3)) && ((r.y1<y1 && y1<r.y3) || (r.y1>y1 && y1>r.y3) || (r.y1>y1 && r.y3<y3))){
return 1;
}
else if (((x1<r.x1 && r.x1<x3) || (x1>r.x1 && r.x1>x3)) && ((y1<r.y1 && r.y1<y3) || (y1>r.y1 && r.y1>y3) || (y1>r.y1 && y3<r.y3))){
return 1;
}
else if (((r.x3>x1 && r.x3<x3)|| (r.x3<x1 && r.x3>x3)) && ((r.y3>y1 && r.y3<y3) || (r.y3<y1 && r.y3>y3))){
return 1;
}
else if (((r.x3>x1 && r.x3<x3) || (r.x3<x1 && r.x3>x3)) && ((r.y1>y1 && r.y1<y3) || (r.y1<y1 && r.y1>y3))){
return 1;
}
else if (((r.x1>x1 && r.x1<x3) || (r.x1<x1 && r.x1>x3)) && ((r.y3>y1 && r.y3<y3) || (r.y3<y1 && r.y3>y3))){
return 1;
}
else if (((r.x1<x1 && r.x3>x3) || (r.x1>x1 && r.x3<x3)) && ((r.y1>y1 && r.y1<y3)||(r.y3>y1 && r.y3<y3))){
return 1;
}
else{
return 0;
}
}

friend istream& operator >> (istream& is, Rectangle &r){             //Formato de entrada
char coma;
cout <<“Introducir valores en formato x1,y1,x3,y3 (vertices opuestos): “;
is >>r.x1>>coma>>r.y1>>coma>>r.x3>>coma>>r.y3;
return is;
}
};

struct Circle{
float x,y,rad;

int Overlap(Circle c){
if (sqrt(pow(x-c.x,2)+pow(y-c.y,2))<(rad+c.rad)){
return 1;                                      //Si hay traslape, regresa 1
}
else{
return 0;                                      //si no, regresa 1
}
}

int Overlapr(Rectangle r){
if (((x > r.x1 && x < r.x3) || (x < r.x1 && x > r.x3)) && ((y > r.y1 && y < r.y3) || (y < r.y1 && y > r.y3))){ //Si el centro esta en el rectangulo
cout <<“El circulo dice: ‘estoy dentro del rectangulo'”<<endl;
return 1;
}
else if ((x > r.x1 && x < r.x3) || (x < r.x1 && x > r.x3)){
cout <<“El circulo dice: ‘estoy en el rango de las x””<<endl;
if (abs(y-r.y1) < rad || abs(y-r.y3) < rad){                     // para 1-2, 3-4
return 1;
}
else{
return 0;
}
}
else if ((y > r.y1 && y < r.y3) || (y <  r.y1 && y > r.y3)){
cout <<“El circulo dice: ‘estoy en el rango de las y'”<<endl;
if (abs(x-r.x3) < rad || abs(x-r.x1) < rad){                      // para 2-3, 1-4
return 1;
}
else{
return 0;
}
}
else if ((sqrt(pow(x-r.x1,2)+pow(y-r.y1,2)) < rad) || (sqrt(pow(x-r.x3,2)+pow(y-r.y1,2)) < rad) || sqrt(pow(x-r.x3,2)+pow(y-r.y3,2)) < rad || sqrt(pow(x-r.x1,2)+pow(y-r.y3,2)) < rad){
cout <<“El circulo dice: ‘mi centro esta cerca de una esquina'”<<endl;
return 1;
}
else{
return 0;
}
}

friend istream& operator >> (istream& is, Circle &c){             //Formato de entrada
char coma;
cout <<“Introducir valores en formato x,y,r: “;
is >>c.x>>coma>>c.y>>coma>>c.rad;
return is;
}
};

int main(){
Rectangle r1, r2;
Circle c1 , c2;

cin >> r1;
cin >> r2;
cin >> c1;

int result = c1.Overlapr(r1);
int result2 = r1.Overlap(r2);

cout <<“Traslape entre rectangulo y circulo: “<< result <<endl;
cout <<“Traslape entre rectangulos: “<< result2;

return 0;
system (“pause”);
}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s