Programación cuadrilátera

//

//Descripción del algoritmo:

//Dos vértices a cada lado de un cuadrilátero convexo están en el mismo lado de la línea recta donde se encuentran los otros dos vértices.

//Los dos vértices de un cuadrilátero cóncavo de dos lados están a ambos lados de la recta donde están los otros dos vértices.

//Existen tres posibles secuencias de cuatro puntos (0, 1, 2, 3) formando un cuadrilátero: 0123 0213 0132.

//

#incluye

#incluye

#definir ESP (1e-6)

doble x[4]={0.0}, y[4]= { 0.0};

Doble A[6], B[6], C[6] // Ecuación lineal Ax By C=0;

Double D[6], E[6]; //D y E almacenan los valores de los otros dos puntos introducidos en la ecuación lineal, donde cero significa que el punto está en la recta. , y el mismo signo significa que está del mismo lado de la recta.

int pos[6][4]={{0, 1, 2, 3}, {0, 2, 1, 3}, {0, 3, 1, 2}, {1, 2, 0, 3}, {1, 3, 0, 2}, {2, 3, 0, 1}; // usado para la matriz ABCDEF

char str[6][8]={ "0,1,2,3", "0,2,1,3", "1,2,0,3", "1,2,0,3", "1,3,0,2", "2, 3, 0, 1 " }; //Se utiliza para la salida de impresión.

void TriangleArea(int a, int b, int c, int d)

{

Doble S;

if(( ( (x[a]-x[b])*(x[a]-x[c]) lt; 0)|((y[a]-y[b])*(y[a]-y [ c]) lt; 0))

{

s = fabs(x[b]* y[c]-y[b]* x[c] x[c ] * y[d]-x[d]* y[c] x[d]* y[b]-x[b]* y[d]);

Printf("Tres puntos ( 5.2 lf, 5.2lf) (5.2lf, 5.2lf) * *Recta, triángulo (5.2lf, 5.2lf) ()

x[a], y[a], x[b], y [ b], x[c], y[c], x[b], y[b], x[c], y[c], x[d], y[d], S);

}

si no(((x[b]-x[a])*(x[b]-x[c]) lt; 0)| |((y[b ] -y[a])*(y[b]-y[c]) lt;0))

{

s = fabs(x[a]* y[ c ]-y[a]* x[c] x[c]* y[d]-x[d]* y[c] x[d]* y[a]-x[a]* y[d] ) ;

Printf("Tres puntos (5.2lf, 5.2lf) (5.2lf, 5.2lf) * * Recta, triángulo (5.2lf, 5.2lf) ()

x [ a],y[a],x[b],y[b],x[c],y[c],x[a],y[a],x[c],y[c],x [ d], y[d], S);

}

si no(((x[c]-x[a])*(x[c]-x [ b]) lt; 0)| |((y[c]-y[a])*(y[c]-y[b]) lt; 0))

{

s = fabs(x[a]* y[c]-y[a]* x[c] x[c]* y[d]-x[d]* y[c] x[d] * y[a]-x[a]* y[d]);

Printf("Tres puntos (5.2lf, 5.2lf) (5.2lf, 5.2lf) * *Recta, triángulo (5.2 lf , 5.2lf) ()

x[a], y[a], x[b], y[b], x[c], y[c], x[a], y [ a], x[b], y[b], x[d], y[d], S);

}

}

/ /cuadrilátero cóncavo

void AoArea01122330()

{

doble S = fabs(x[0]* y[1]-x[1]* y [0] x[1]* y[2]-x[2]* y[3]-x[3]* y[2] x[3]* y[0]-x[0]* y[ 3 ])/2;

Printf("Cuadrilátero cóncavo\ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2 lf)\ nÁrea s = lf \

x[0], y[0], x[1], y[1], x[2], y[2], x[3], y[3], S) ;

}

void AoArea01133220()

{

doble S = fabs(x[0]*

y[1]-x[1]* y[0] x[1]* y[3]-x[3]* y[2]-x[2]* y[3] x[2]* y[ 0]-x[0]* y[2])/2;

Printf("Cuadrilátero cóncavo\ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2lf) \ t (5.2 lf, 5.2 lf)\nÁrea s = lf \

x[0], y[0], x[1], y[1], x[3], y[3], x [ 2], y[2], S);

}

void AoArea02211330()

{

doble S = fabs ( x[0]* y[2]-x[2]* y[0] x[2]* y[1]-x[1]* y[2] x[1]* y[3]-x [ 3]* y[1] x[3]* y[0]-x[0]* y[3])/2;

Printf("Cuadrilátero cóncavo\ t (5.2lf, 5.2 lf ) \t (5.2lf, 5.2lf) \t (5.2lf, 5.2 lf)\narea s = lf \

x[0], y[0], x[2], y [2 ], x[1], y[1], x[3], y[3], S);

}

//cuadrilátero convexo

Área vacía 01122330()

{

doble S = fabs(x[0]* y[1]-x[1]* y[0] x[1 ]* y[2]-x[2]* y[3]-x[3]* y[2] x[3]* y[0]-x[0]* y[3])/2;

Printf("Cuadrilátero convexo\ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2lf) \ nÁrea s = lf \

x [0], y[0], x[1], y[1], x[2], y[2], x[3], y[3], S);

}

Área vacía 01133220()

{

doble S = fabs(x[0]* y[1]-x[1]* y [0 ] x[1]* y[3]-x[3]* y[2]-x[2]* y[3] x[2]* y[0]-x[0]* y[2 ]) /2;

Printf("Cuadrilátero convexo\ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2lf) \ nÁrea s = lf \

x[0], y[0], x[1], y[1], x[3], y[3], x[2], y[2], S

}

Área vacía 02211330()

{

doble S = fabs(x[0]* y[2]- x[ 2]* y[0] x[2]* y[1]-x[1]* y[2] x[1]* y[3]-x[3]* y[1] x[3 ]* y[0]-x[0]* y[3])/2;

Printf("cuadrilátero convexo\ t (5.2lf, 5.2lf) \ t (5.2lf, 5.2lf) \t (5.2lf, 5.2lf) \nÁrea s = lf \

x[0], y[0], x[2], y[2], x[1], y[1 ], x[3], y[3], S);

}

int Comprobar

kInput()

{

//Juzga si los cuatro puntos de entrada son diferentes.

if((fabs(x[0]-x[1]) lt;ESP amp ampfabs(y[0]-y[1]) lt;ESP) ||

(fabs(x[0]-x[2]) lt;ESP amp ampfabs(y[0]-y[2]) lt;ESP) ||

(fabs(x[0] -x[3]) lt;ESP amp ampfabs(y[0]-y[3]) lt;ESP) ||

(fabs(x[1]-x[2]) lt; ESP amp ampfabs(y[1]-y[2]) lt;ESP) ||

(fabs(x[1]-x[3]) lt;ESP amp ampfabs(y[1] -y[3]) lt;ESP) ||

(fabs(x[2]-x[3]) lt;ESP amp ampfabs(y[2]-y[3]) lt; ESP))

Return 0;

Return 1;

}

//Determina si es un cuadrilátero convexo0123.

int Check01122330 (doble *D, doble *E)

{

if(D[0]* E[0] gt; 0 amp ampD[ 2]*E[2]>0 amperios ampD[3]*E[3]>0 amperios ampD[5]*E[5]>0)

Devuelve 1;

Otros

Devuelve 0;

}

//Determina si es un cuadrilátero convexo0132.

int Check01133220 (doble *D, doble *E)

{

if(D[0]* E[0] gt; 0 amp ampD[ 1]*E[1]>0 amperios ampD[4]*E[4]>0 amperios ampD[5]*E[5]>0)

Devuelve 1;

Otros

Devuelve 0;

}

//Determina si es un cuadrilátero convexo 0213.

int Check02211330(doble*D,doble*E)

{

if(D[1]*E[1]>0 amp ampD[2 ]*E[2]>0 amperios ampD[3]*E[3]>0 amperios ampD[4]*E[4]>0)

Devuelve 1;

Otros

Devuelve 0;

}

void Calcular(int p, doble *A, doble *B, doble *C, doble *D, doble * E)

{

int p 1 = pos[p][0];

int p2 = pos[p][1];

int P3 = pos[p][2];

int P4 = pos[p][3];

if(fabs(y[p2]-y [p 1]) lt; ESP)

{

* A = 0.0

* B = 1.0;

* C = -y[p 1];

}

else if(fabs(x[p2]-x[p 1]) lt;ESP)

{

* A = 1,0;

* B = 0,0

* C =-x[p 1]

}

Otro

{

doble t =(x[p2]-x[p 1])/(y[p2]-y[p 1]);

* A = 1.0;

* B =-t

* C = t * y[p 1]-x[p 1];

}

* D = * A * x[P3] * B * y[P3] * C;

* E = *A * x[P4 ] * B * y[P4] * C;

}

int main()

{

Doble t;

p>

int i, ii;

hacer

{

for(I = 0; i lt4; i)

{

printf("Ingrese el punto d(x, y): ", I 1

scanf("lf, lf ", ampx[); i], ampy[ I]);

}

} while(check input()= = 0);//Compruebe si se ingresaron cuatro puntos diferentes.

for(I = 0;ilt6;i)

{

Calcular(i, ampA[i], ampB[i], ampC[i ] , ampD[i], ampe[I]);

printf("( s)\ tA = 5.2 lf \ tB = 5.2 lf \ tC = 5.2 lf \ tD = 5.2 lf \ tE = 5.2 lf \ n ",cadena[i],A[i],B[i],C[i],D[i],E[I]);

}

//Juzga la línea * * * de 4 puntos

if(fabs(D[0]) lt;ESP amp ampfabs(E[0]) lt;ESP)

{

Printf("Cuatro puntos * * *Línea de área cero\ n ");

Devuelve 0

}

//Sentencia Línea de tres puntos * * * línea

if(fabs(D[0]) lt; ESP)

{

//0, 1, 2 tipo de tres puntos * * *Line

TriangleArea(0, 1, 2, 3

Devuelve 0

}

else if( fabs(E[0]) lt;ESP)

{

//0, 1, 3 línea * * * de tres puntos

TriangleArea(0, 1 , 3, 2);

Return 0;

}

else if(fabs(E[1]) lt; ESP )

{

//0, 2, 3 línea * * * de tres puntos

TriangleArea(0, 2, 3, 1);

Devuelve 0;

}

si(fabs(E[3]) lt;ESP)

{

//1, 2, 3 Tres puntos * * Línea

Área del triángulo (1, 2, 3, 0

Devuelve 0

}

//Cuadrilátero

if(Check01122330(D, E)== 0 amp; ampCheck01133220(D, E)==0. ampCheck02211330(D, E)== 0)

{

//Cuadrilátero cóncavo

aoarea 01122330();

aoarea 01133220();

aoarea 02211330();

aoarea 01133220();

aoarea 02211330(); p>

}

si no(marque 01122330( D, E)==1)

{

//cuadrilátero convexo

área 01122330();

}

else if(check 01133220(D, E)==1)

{

//Cuadrilátero convexo

área 01133220();

}

else if(check 02211330(D, E)==1)

{

//Cuadrilátero convexo

área 02211330();

}

Devuelve 0;

}