Dados 4 puntos en los planos 2D A, B, C, D
, calcule el área de la región de intersección de los triángulos OAB
y OCD
, donde O
está el centro del plano, teniendo coordenadas (0, 0)
.
Los algoritmos que se ejecutan en una complejidad de tiempo constante (en términos de operaciones aritméticas) son alentados, pero no forzados.
Reglas
- Cada punto se representa como dos números reales, denota sus coordenadas X e Y.
- Opcionalmente, si su lenguaje de programación (o alguna biblioteca de su lenguaje de programación) tiene un
Point
tipo incorporado o equivalente, se le permite tomar elPoint
objeto como entrada.
- Opcionalmente, si su lenguaje de programación (o alguna biblioteca de su lenguaje de programación) tiene un
- La entrada se da como 4 puntos, en los formatos, que incluyen pero no se limitan a:
- Una lista de 8 coordenadas.
- Una lista de 4 puntos, cada punto se puede representar en cualquier formato conveniente.
- Dos listas de 2 puntos.
- etc.
- No puede asumir un orden particular de los puntos (orden en sentido antihorario o en sentido horario)
- No puede suponer que el punto
O
se pasa como entrada. En otras palabras, el programa no debe tomar y usar entradas extrañas. - No puedes asumir que todos los puntos son diferentes. En otras palabras, los triángulos pueden estar degenerados. También debe manejar ese caso (ver casos de prueba a continuación)
- La diferencia absoluta o relativa debe ser menor que para los casos de prueba de muestra a continuación.
10-3
Criterios ganadores
Este es el código de golf , ¡la respuesta más corta en bytes gana!
Muestra de casos de prueba
Ax Ay Bx By Cx Cy Dx Dy area
5 1 1 3 -1 0 0 -1 0
5 1 1 3 -1 0 0 0 0
5 1 1 3 0 0 0 0 0
5 1 1 3 3 4 4 -3 4.50418
5 1 1 3 1 2 2 1 1.5
5 1 1 3 -2 5 4 -2 1.74829
5 1 1 3 -2 5 5 4 2.96154
5 1 1 3 3 5 5 4 1.88462
5 1 1 3 3 5 3 1 3.92308
5 1 1 3 3 5 4 -1 5.26619
5 1 1 3 5 1 4 -1 0
5 1 1 3 5 1 1 3 7
1 3 1 3 5 1 1 3 0
1 3 1 3 1 3 1 3 0
4 8 4 -1 -2 6 -2 -3 0
1.2 3.4 -0.3 4.2 5 7.6 -1.1 2.4 2.6210759326188535
3.1 0.6 0.1 7.2 5.2 0.7 0.9 8 9.018496993987977
Si alguien quiere, aquí están las salidas para el primer grupo de casos de prueba en forma exacta:
0
0
0
46375/10296
3/2
1792/1025
77/26
49/26
51/13
23345/4433
0
7
0
0
0
Imagen de ilustración para el caso de prueba 5 1 1 3 3 4 4 -3
(el área del cuadrilátero verde es el resultado esperado):
[ ]
Respuestas:
Wolfram Language (Mathematica) , 55 bytes
Pruébalo en línea!
Afeitó unos pocos bytes de la respuesta trivial.
Reemplazar
Area
conDiscretizeRegion
mostrará la intersección.Por cierto, esto funcionará con cualquier simplex, no solo con triángulos.
-1 Byte gracias a JungHwan Min
La sugerencia de @ user202729 agregó 4 bytes pero hace que produzca 0 para triángulos degenerados
fuente
{{0,0}}
to{0{,}}
(esto funciona porque la expresión se evalúa como{Times[0, {Null, Null}]}
)Python 2 + PIL,
341318313284270 bytesUn agradecimiento especial a Dennis que rápidamente agregó PIL en TIO
-23 bytes gracias al Sr. Xcoder
Pruébalo en línea!o Pruebe todos los casos de prueba
Para calcular la diferencia, esto literalmente dibuja los triángulos y verifica la cantidad de píxeles pintados en ambas imágenes.
Este método insertó un error de redondeo, que se suaviza al aumentar el tamaño de la imagen.
Explicación
fuente