Solución a la Tarea 2: Intersección de segmentos
Una de las formas más sencillas de resolver esta tarea es la
siguiente: consideren que cada una de las dos parejas de puntos
determina una recta (y no un segmento) y calculen el punto de
intersección. Eso lo hacemos abajo calculando primero las
pendientes de estas rectas y luego calculando las coordenadas del punto
de intersección. Ahora sólo falta averiguar si este punto
está dentro de los segmentos o no. Para ello basta averiguar si
está dentro de los correspondientes intervalos horizontales.
¿Porqué?
#include
<stdio.h>
int main(void)
{
double x, x1, x2, x3, x4,
m1, m3;
double y, y1, y2, y3, y4,
b1, b3;
scanf("%lf%lf%lf%lf",
&x1, &y1, &x2, &y2);
scanf("%lf%lf%lf%lf",
&x3, &y3, &x4, &y4);
m1 = (y1 - y2)/(x1 - x2);
m3 = (y3 - y4)/(x3 - x4);
b1 = y1 - m1*x1;
b3 = y3 - m3*x3;
x = (b3 - b1)/(m1 - m3);
y = m1*x + b1;
if ((((x1 <= x)
&& (x <= x2)) || ((x1 >= x) && (x >= x2)))
&&
(((x3
<= x) && (x <= x4)) || ((x3 >= x) && (x >=
x4))))
printf("%f
%f\n", x, y);
else printf("-1 -1\n");
return 0;
}
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada
Salida
2 1 3 2 1 3 3
4 -1 -1
2 1 3 2 4 1 1 4 3.000000 2.000000
4 1 1 4 1 3 3 4 1.666667 3.333333
3 8 6 4 9 3 3 9 -1 -1
2 8 9 1 6 1 7 3 7.000000 3.000000
5 1 4 3 3 2 2 4 -1 -1
7 7 9 6 8 7 1 4 7.461538 6.769231
9 3 6 2 6 6 9 8 -1 -1
3 9 9 3 6 9 2 7 4.000000 8.000000
9 2 6 5 8 6 5 3 6.500000 4.500000
Para probar su tarea en UNIX, escriban la instrucción gcc intsegNN.c -o intseg para
compilar su programa, y la instrucción ./intseg para correrlo.
Algunos errores comúnes fueron: (a) Leer double como float o
viceversa. (b) Imprimir letreros de cualquier tipo e incluso usar
conio.h, lo cual estaba explícitamente prohibido. (c) Suponer
que los datos y las respuestas siempre serían enteros. (d) No
detectar cuando la intersección se daba fuera de los segmentos.
Además, les recuerdo que
sólo deben enviar el archivo .c y que éste debe tener el
nombre correcto.