Esse quadrilátero é cíclico?

18

Em matemática, um quadrilátero cíclico é aquele cujos vértices estão todos no mesmo círculo. Em outras palavras, todo vértice está no circulo dos outros três. Para mais informações, consulte o artigo MathWorld .

Exemplos

Estes quadriláteros são cíclicos:

Quadriláteros cíclicos

Este trapézio não é cíclico.

Trapézio

(Imagens da Wikipedia)

Objetivo

Dadas as coordenadas de quatro vértices na ordem anti-horária que formam um quadrilátero convexo, determine se o quadrilátero é cíclico.

As coordenadas serão inteiras (observe, no entanto, que as coordenadas do circuncentro e o perímetro do raio não são necessariamente inteiros.) Como está implícito no parágrafo anterior, três pontos não serão co-lineares e dois coincidentes.

I / O

Você pode receber informações usando qualquer formato razoável. Em particular, [[x1,x2,x3,x4],[y1,y2,y3,y4]], [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]e números complexos são todos muito bem.

Saída usando valores consistentes diferentes para verdadeiro e falso.

Casos de teste

Verdade:

[0,0], [314,0], [314,1], [0,1]
[-5,5], [5,-5], [1337,42], [42,1337]
[104, -233], [109, -232], [112, -231], [123, -224]

Falso:

[0,0], [314,0], [314,100], [0,99]
[31,41],[59,26],[53,58],[0,314]
lirtosiast
fonte

Respostas:

11

Wolfram Language (Mathematica) , 23 bytes

#∈Circumsphere@{##2}&

Experimente online!

Toma quatro entradas: as listas {x1,y1}, {x2,y2}, {x3,y3}, e {x4,y4}. Verifica se o primeiro ponto está no circulo dos outros três. Também funciona para verificar se pontos em são concíclicos, desde que os últimos sejam afinamente independentes (porque é triste se você fornecer uma entrada degenerada).n+1RnnCircumsphere

Como alternativa, aqui está uma abordagem matemática:

Wolfram Language (Mathematica) , 29 28 25 24 bytes

Det@{#^2+#2^2,##,1^#}^0&

Experimente online!

Leva duas listas como entrada: {x1,x2,x3,x4}e {y1,y2,y3,y4}. Retorna Indeterminatequando os quatro pontos estão em um círculo comum e 1caso contrário.

(x1,y1),(x2,y2),(x3,y3),(x4,y4)

[x12+y12x22+y22x32+y32x42+y42x1x2x3x4y1y2y3y41111]

O determinante dessa matriz é 0 se e somente se as quatro linhas forem linearmente dependentes, e uma dependência linear entre as linhas é a mesma coisa que a equação de um círculo que é satisfeita em todos os quatro pontos.

A maneira mais curta em que pude verificar se o determinante é 0 é aumentá-lo para o 0-ésimo poder: 0^0é Indeterminateenquanto qualquer outra coisa dá 1.

Misha Lavrov
fonte
10

Python 3 , 70 bytes

lambda b,c,d,e,a=abs:a(a(b-d)*a(c-e)-a(b-c)*a(d-e)-a(c-d)*a(b-e))<1e-8

Experimente online!

Eu uso o teorema de Ptolomeu .

Em um quadrilátero, se a soma dos produtos de seus dois pares de lados opostos for igual ao produto de suas diagonais, o quadrilátero poderá ser inscrito em um círculo.

b, c, d, eSão números complexos.

Кирилл Малышев
fonte
8

Perl 6 , 44 bytes

{!im ($^b-$^a)*($^d-$^c)/(($d-$a)*($b-$c)):}

Experimente online!

Toma vértices como números complexos. Usa o fato de que a soma de ângulos opostos é de 180 ° em um quadrilátero cíclico. A ordem das operações deve garantir que as operações de ponto flutuante produzam um resultado exato para números inteiros (suficientemente pequenos).

Solução TI-Basic do porto da Misha Lavrov, 33 bytes

{![*](map */*,($_ Z-.rotate)).im}

Experimente online!

Nwellnhof
fonte
42? Ainda é preciso?
Jo rei
1
@ JoKing Não, não é .
Nwellnhof 18/11/19
O que o cólon faz neste caso? Definitivamente, não é um rótulo e também não é uma chamada de método.
user202729
@ user202729 Ele é uma chamada de método com sintaxe invocant indireta .
Nwellnhof
6

JavaScript (ES6)

Testando os ângulos, 114 bytes

[x1,y1,x2,y2,x3,y3,x4,y4]

a=>(F=i=>(A=Math.atan2)(a[i+3&7]-(y=a[i+1]),a[i+2&7]-a[i])-A(a[i+5&7]-y,a[i+4&7]-a[i]))(0)+F(2)+F(4)+F(6)==Math.PI

Experimente online!


Computando um determinante, 130 bytes

[x1,x2,x3,x4][y1,y2,y3,y4]

Essa é equivalente à 2ª resposta de MishaLavrov , com uma matriz rotacionada.

x=>y=>!(g=a=>a+a?a.reduce((v,[r],i)=>v+(i&1?-r:r)*g(a.map(r=>r.slice(1)).filter(_=>i--)),0):1)(x.map((X,i)=>[1,Y=y[i],X,X*X+Y*Y]))

Experimente online!

Arnauld
fonte
6

TI-Basic (série 83), 21 bytes

e^(ΔList(ln(ΔList(augment(Ans,Ans
not(imag(Ans(1)Ans(3

Recebe a entrada como uma lista de quatro números complexos em Ans. Retorna 1se o quadrilátero for cíclico ou 0não.

z1,z2,z3,z4

  • ΔList(augment(Ans,Ansz2-z1,z3-z2,z4-z3,z1-z4
  • e^(ΔList(ln(z3-z2z2-z1,z4-z3z3-z2,z1-z4z4-z3,...
  • z3-z2z2-z1z1-z4z4-z3 (z3,z1;z2,z4)=z2-z3z2-z1:z4-z3z4-z1

Fiz o meu melhor para verificar se o erro numérico é um problema e não parece ser, mas se alguém tiver bons casos de teste para isso, informe-me.

Misha Lavrov
fonte
3

JavaScript (ES6) (101 bytes)

p=>(h=(a,b)=>Math.hypot(p[a]-p[b],p[a+1]-p[b+1]))&&((h(2,4)*h(0,6)+h(0,2)*h(4,6)-h(0,4)*h(2,6))<1e-8)

Pega entrada como [x1,y1,x2,y2,x3,y3,x4,y4], gera um booleano.

ef=umac+bd
e,fuma,b,c,d

Experimente online!

Alvin Li
fonte
2

Gelatina , 11 bytes

²Sṭ;L€€ṖÆḊ¬

Experimente online!

Usa a abordagem determinante da solução Mathematica de Misha Lavrov . Saídas 1 para verdadeiro, 0 para falso.

Como funciona

²Sṭ;L€€ṖÆḊ¬  Main link (monad). Input: [[x1,x2,x3,x4], [y1,y2,y3,y4]]
²S           Square each scalar and add row-wise; [x1*x1+y1*y1, ...]
  ṭ          Append to the input
   ;L€€      Add two rows of [1,1,1,1]'s
       Ṗ     Remove an extra row
        ÆḊ¬  Is the determinant zero?

Gelatina , 12 bytes

Iµ÷×ƭ/÷SµḞ=A

Experimente online!

Utiliza a abordagem de razão cruzada complicada da solução TI-Basic da Misha Lavrov . Saídas 1 para verdadeiro, 0 para falso.

Como funciona

Iµ÷×ƭ/÷SµḞ=A  Main link (monad). Input: list of four complex numbers [z1,z2,z3,z4]
I             Increments; [z2-z1, z3-z2, z4-z3]
 µ            Refocus on above for sum function
  ÷×ƭ/÷S      (z2-z1)÷(z3-z2)×(z4-z3)÷(z4-z1)
        µ     Refocus again
         Ḟ=A  (real part) == (norm) within error margin
              i.e. imag part is negligible?

Eu acredito que ambos são jogáveis ​​...

Bubbler
fonte