Contar intersecciones rectangulares

8

El reto

Dada una cantidad arbitraria de rectángulos, genera el recuento total de intersecciones de aquellos cuando se dibuja en un plano 2D.

Una intersección aquí se define como un punto Pque está cruzado por dos líneas que son ortogonales entre sí y ambas no terminan en P.

Ejemplo

Cada rectángulo aquí se denota por una tupla de 2 con las coordenadas de la esquina superior izquierda primero y las coordenadas de la esquina inferior derecha segundo.

[(-8,6), (- 4, -2)]
[(-4,9), (4,3)]
[(2,10), (14,4)]
[(1,7), (10, -6)]
[(7,4), (10,2)]
[(5,2), (9, -4)]
[(-6, -4), (- 2, -6)]

ingrese la descripción de la imagen aquí

Esos rectángulos crean 6 intersecciones, que tiene que ser su salida.

  • Como puede ver en la imagen de arriba, tocar rectángulos no creará intersecciones aquí y no se cuentan.
  • Puede codificar los rectángulos en el formato que desee. Deje en claro qué formato usa.
  • Si varios rectángulos se cruzan en el mismo punto, solo cuenta como una intersección.
  • Las coordenadas siempre serán enteros.
  • No habrá ningún rectángulo duplicado en la entrada.
  • Siempre obtendrá al menos un rectángulo como entrada.
  • No puede usar ningún componente incorporado que resuelva este problema directamente. Además, no puede usar los componentes integrados que resuelven ecuaciones. Todas las demás construcciones están permitidas.
  • La salida debe ser un número entero único que indique el recuento de intersección.

Reglas

Casos de prueba

Mismo formato que en el ejemplo anterior. Los rectángulos están envueltos en una lista.

[[(-8,6), (- 4, -2)], [(- 4,9), (4,3)], [(2,10), (14,4)], [(1 , 7), (10, -6)], [(7,4), (10,2)], [(5,2), (9, -4)], [(- 6, -4), (-2, -6)]] -> 6
[[(-2,2), (6, -4)]] -> 0
[[(-12,10), (- 8,6)], [(- 14,6), (- 10,2)], [(- 10,6), (- 6,2)]] - > 0
[[(-4,10), (6,2)], [(- 2,8), (4,3)], [(1,6), (8,4)], [(2,11 ), (5,5)]] -> 10
[[(8,2), (12, -2)], [(10,0), (14, -4)]] -> 2
[[(0,2), (2,0)], [(0,1), (3,0)]] -> 1
[[(-10, -2), (- 6, -6)], [(- 6, -2), (- 2, -6)], [(- 8, -4), (- 4, -8)]] -> 3

¡Feliz codificación!

Denker
fuente
Debe definir qué es lo que desea que cuenten las respuestas, ya que muchos puntos en la intersección de dos o más rectángulos aparentemente se ignoran, según el diagrama.
feersum
1
Entonces, [[(0,0),(1,2)],[(0,0),(2,1)]]¿tendría 1 intersección?
Neil
@Neil exactamente. Agregaré este caso de prueba, ¡gracias!
Denker
@feersum Creo que el diagrama deja bastante claro qué contar y qué no. Pero una definición formal no estaría de más, supongo, agregaré una.
Denker
1
Si hay N pares de rectángulos que se cruzan en (x, y), ¿se cuenta el punto (x, y) una vez o N veces?
feersum

Respuestas:

2

JavaScript (ES6), 186 bytes

a=>a.map(([a,b,c,d])=>h.push([b,a,c],[d,a,c])&v.push([a,b,d],[c,b,d]),h=[],v=[])|h.map(([d,a,e])=>v.map(([c,f,b])=>a<c&c<e&b<d&d<f&t.every(([a,b])=>a-c|b-d)&&t.push([c,d])),t=[])|t.length

Divide cada rectángulo en sus líneas componentes, luego intersecta las líneas horizontales y verticales, formando una lista de intersecciones para evitar duplicados.

Neil
fuente
¿Qué formato de entrada usas? Cuando llamo a esto con los estuches, siempre obtengo cero.
Denker
@DenkerAffe Lo siento, debería haber dicho que espero un conjunto de conjuntos de 4 elementos, por ejemplo [[-4,10,6,2],[-2,8,4,3],[1,6,8,4],[2,11,5,5]]. Como JavaScript no tiene tuplas, si hubiera intentado usar sus ejemplos literalmente, habría activado el operador de coma, invalidando la entrada.
Neil
OK gracias. Sin embargo, esto da 4 en lugar de 3 para el último caso de prueba, ya que las intersecciones de varios rectángulos solo cuentan como una intersección. Aclaré esto después de que publicaste tu respuesta, creo, así que esta sigue conmigo. Espero que no sea demasiado difícil arreglar esto, disculpe las molestias.
Denker
@DenkerAffe Lo actualicé para que funcione con su nueva especificación.
Neil
0

Mathematica 138 bytes

¡Sin terminar! Esto funciona para todos los casos excepto[[(0,0),(1,2)],[(0,0),(2,1)]]


Length@Union[Join@@(Cases[RegionIntersection@@# &/@Subsets[Line[{{#,#2},{#3,#2},{#3,#4},{#,#4},{#,#2}}]&@@@Flatten/@#,{2}],Point@a__:> a])]

Ejemplo

Length@Union[
Join @@ (Cases[RegionIntersection @@ # & /@ Subsets[
Line[{{#, #2}, {#3, #2}, {#3, #4}, {#, #4}, {#, #2}}] & @@@ Flatten /@ #, {2}], 
Point@a__ :> a])] &@{{{-8, 6}, {-4, -2}}, {{-4, 9}, {4, 3}}, {{2, 10}, {14, 4}}, 
{{1, 7}, {10, -6}}, {{7, 4}, {10, 2}}, {{5, 2}, {9, -4}}, {{-6, -4}, {-2, -6}}}

6 6

DavidC
fuente