¿Es este cuadrilátero cíclico?

18

En matemáticas, un cuadrilátero cíclico es aquel cuyos vértices se encuentran en el mismo círculo. En otras palabras, cada vértice está en la circunferencia de los otros tres. Para obtener más información, consulte el artículo de MathWorld .

Ejemplos

Estos cuadriláteros son cíclicos:

Cuadriláteros cíclicos

Este trapecio no es cíclico.

Trapecio

(Imágenes de Wikipedia)

Objetivo

Dadas las coordenadas de cuatro vértices en el sentido contrario a las agujas del reloj que forman un cuadrilátero convexo, determine si el cuadrilátero es cíclico.

Las coordenadas serán números enteros (tenga en cuenta, sin embargo, que las coordenadas del circuncentro y el circunradio no son necesariamente números enteros). Como se indica en el párrafo anterior, no habrá tres puntos co-lineales ni dos coincidentes.

I / O

Puede recibir información utilizando cualquier formato razonable. En particular, [[x1,x2,x3,x4],[y1,y2,y3,y4]], [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]y los números complejos son todos bien.

Salida utilizando cualquier valor consistente diferente para verdadero y falso.

Casos de prueba

Cierto:

[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
fuente

Respuestas:

11

Wolfram Language (Mathematica) , 23 bytes

#∈Circumsphere@{##2}&

Pruébalo en línea!

Toma cuatro entradas: las listas {x1,y1}, {x2,y2}, {x3,y3}, y {x4,y4}. Comprueba si el primer punto se encuentra en el círculo de los otros tres. También funciona para verificar si puntos en son concíclicos, siempre que los últimos sean afines independientes (porque es triste si le das una entrada degenerada).n+1RnnCircumsphere

Alternativamente, aquí hay un enfoque matemático:

Wolfram Language (Mathematica) , 29 28 25 24 bytes

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

Pruébalo en línea!

Toma dos listas como entrada: {x1,x2,x3,x4}y {y1,y2,y3,y4}. Devuelve Indeterminatecuando los cuatro puntos están en un círculo común, y de 1otra manera

A partir de los cuatro puntos , esta solución construye la matriz a continuación:(x1,y1),(x2,y2),(x3,y3),(x4,y4)

[x12+y12x22+y22x32+y32x42+y42x1x2x3x4y1y2y3y41111]

El determinante de esta matriz es 0 si y solo si las cuatro filas son linealmente dependientes, y una dependencia lineal entre las filas es lo mismo que la ecuación de un círculo que se satisface en los cuatro puntos.

La forma más corta en la que podría pensar para verificar si el determinante es 0 es elevarlo a la potencia 0: 0^0es Indeterminatemientras cualquier otra cosa da 1.

Misha Lavrov
fuente
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

Pruébalo en línea!

Yo uso el teorema de Ptolomeo .

En un cuadrilátero, si la suma de los productos de sus dos pares de lados opuestos es igual al producto de sus diagonales, entonces el cuadrilátero puede inscribirse en un círculo.

b, c, d, eSon números complejos.

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

Perl 6 , 44 bytes

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

Pruébalo en línea!

Toma los vértices como números complejos. Utiliza el hecho de que la suma de ángulos opuestos es 180 ° en un cuadrilátero cíclico. El orden de las operaciones debe garantizar que las operaciones de punto flotante produzcan un resultado exacto para enteros (lo suficientemente pequeños).

Solución TI-Basic del puerto de Misha Lavrov, 33 bytes

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

Pruébalo en línea!

nwellnhof
fuente
42? ¿Sigue siendo exacto?
Jo King
1
@JoKing No, no lo es .
nwellnhof
¿Qué hace el colon en este caso? Definitivamente no es una etiqueta, y tampoco una llamada a un método.
user202729
@ user202729 Es es una llamada al método con la sintaxis invocaciones indirecta .
nwellnhof
6

JavaScript (ES6)

Probar los á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

Pruébalo en línea!


Calculando un determinante, 130 bytes

Toma la entrada como e en la sintaxis de curry. Devuelve un valor booleano.[x1,x2,x3,x4][y1,y2,y3,y4]

Este es equivalente a la segunda respuesta de MishaLavrov , con una matriz rotada.

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]))

Pruébalo en línea!

Arnauld
fuente
6

TI-Basic (serie 83), 21 bytes

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

Toma información como una lista de cuatro números complejos Ans. Devuelve 1si el cuadrilátero es cíclico y de lo 0contrario.

z1,z2,z3,z4

  • ΔList(augment(Ans,Anscalcula las diferencias (y algunos términos más redundantes),z2z1,z3z2,z4z3,z1z4
  • e^(ΔList(ln(de eso calcula las relaciones .z3z2z2z1,z4z3z3z2,z1z4z4z3,
  • Verificamos si el producto del primer y tercer término, que es , no tiene una parte imaginaria. Tenga en cuenta que esto es lo mismo que la relación .z3z2z2z1z1z4z4z3 (z3,z1;z2,z4)=z2z3z2z1:z4z3z4z1

Hice todo lo posible para verificar si el error numérico es un problema, y ​​no parece serlo, pero si alguien tiene buenos casos de prueba para eso, hágamelo saber.

Misha Lavrov
fuente
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)

Toma la entrada como [x1,y1,x2,y2,x3,y3,x4,y4], emite un booleano.

ef=ac+bd
e,fa,b,c,d

Pruébalo en línea!

Alvin Li
fuente
2

Jalea , 11 bytes

²Sṭ;L€€ṖÆḊ¬

Pruébalo en línea!

Utiliza el enfoque determinante de la solución Mathematica de Misha Lavrov . Salidas 1 para verdadero, 0 para falso.

Cómo 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?

Jalea , 12 bytes

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

Pruébalo en línea!

Utiliza el enfoque de relación cruzada enrevesada de la solución TI-Basic de Misha Lavrov . Salidas 1 para verdadero, 0 para falso.

Cómo 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?

Creo que ambos son golfables ...

Bubbler
fuente