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 \ p>
x[0], y[0], x[1], y[1], x[3], y[3], x[2], y[2], S ); p>
}
Á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]
} p>
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>
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); p>
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;
}