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 OABy OCD, donde Oestá 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
Pointtipo incorporado o equivalente, se le permite tomar elPointobjeto 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
Ose 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
AreaconDiscretizeRegionmostrará 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