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.