Dados 4 pontos nos planos 2D A, B, C, D
, calcule a área da região de interseção dos triângulos OAB
e OCD
, onde O
é o centro do plano, tendo coordenadas (0, 0)
.
Algoritmos que são executados em complexidade de tempo constante (em termos de operações aritméticas) são incentivados, mas não forçados.
Regras
- Cada ponto é representado como dois números reais, denota suas coordenadas X e Y.
- Opcionalmente, se a sua linguagem de programação (ou alguma biblioteca da sua linguagem de programação) tiver um
Point
tipo interno ou equivalente, é permitido que oPoint
objeto seja considerado como entrada.
- Opcionalmente, se a sua linguagem de programação (ou alguma biblioteca da sua linguagem de programação) tiver um
- A entrada é dada como 4 pontos, nos formatos, incluindo, entre outros:
- Uma lista de 8 coordenadas.
- Uma lista de 4 pontos, cada ponto pode ser representado em qualquer formato conveniente.
- Duas listas de 2 pontos.
- etc.
- Você não pode assumir uma ordem específica dos pontos (ordem no sentido anti-horário ou ordem no sentido horário)
- Você não pode assumir que o ponto
O
é passado como entrada. Em outras palavras, o programa não deve receber e usar entradas estranhas. - Você não pode assumir que todos os pontos são diferentes. Em outras palavras, os triângulos podem estar degenerados. Você também precisa lidar com esse caso (veja os casos de teste abaixo)
- A diferença absoluta ou relativa deve ser menor que nos casos de teste de amostra abaixo.
10-3
Critérios de vitória
Isso é código-golfe , a resposta mais curta em bytes ganha!
Casos de teste de amostra
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
Se alguém quiser, aqui estão as saídas para o primeiro grupo de casos de teste na forma exata:
0
0
0
46375/10296
3/2
1792/1025
77/26
49/26
51/13
23345/4433
0
7
0
0
0
Imagem ilustrativa para o caso de teste 5 1 1 3 3 4 4 -3
(a área do quadrilátero verde é a saída esperada):
[ ]
Respostas:
Wolfram Language (Mathematica) , 55 bytes
Experimente online!
Raspou alguns bytes da resposta trivial.
Substituir
Area
porDiscretizeRegion
mostrará a interseção.A propósito, isso funcionará com qualquer simplex, não apenas triângulos.
-1 Byte graças a JungHwan Min
A sugestão de @ user202729 adicionou 4 bytes, mas produz 0 para triângulos degenerados
fonte
{{0,0}}
a{0{,}}
(Isso funciona porque a avalia expressão de{Times[0, {Null, Null}]}
)Python 2 + PIL,
341318313284270 bytesAgradecimentos especiais a Dennis que prontamente adicionou PIL em TIO
-23 bytes, graças ao Sr. Xcoder
Experimente online! ou Experimente todos os casos de teste
Para calcular a diferença, desenhe literalmente os triângulos e verifique a quantidade de pixels pintados nas duas imagens.
Este método inseriu um erro de arredondamento, que é suavizado aumentando o tamanho da imagem.
Explicação
fonte