Questo quadrilatero è ciclico?


18

In matematica, un quadrilatero ciclico è uno i cui vertici si trovano tutti sullo stesso cerchio. In altre parole, ogni vertice si trova sul cerchio degli altri tre. Per ulteriori informazioni, consultare l' articolo di MathWorld .

Esempi

Questi quadrilateri sono ciclici:

Quadrilateri ciclici

Questo trapezio non è ciclico.

trapezio

(Immagini da Wikipedia)

Obbiettivo

Date le coordinate di quattro vertici in ordine antiorario che formano un quadrilatero convesso, determinare se il quadrilatero è ciclico.

Le coordinate saranno numeri interi (si noti, tuttavia, che le coordinate del circumcenter e il circumradius non sono necessariamente numeri interi). Come implicito nel paragrafo precedente, tre punti non saranno co-lineari e due non coincidenti.

I / O

È possibile accettare input utilizzando qualsiasi formato ragionevole. In particolare, [[x1,x2,x3,x4],[y1,y2,y3,y4]], [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]e numeri complessi sono tutte belle.

Output utilizzando qualsiasi diverso valore coerente per true e false.

Casi test

Vero:

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

Risposte:


11

Wolfram Language (Mathematica) , 23 byte

#∈Circumsphere@{##2}&

Provalo online!

Prende quattro ingressi: gli elenchi {x1,y1}, {x2,y2}, {x3,y3}, e {x4,y4}. Verifica se il primo punto si trova sul cerchio degli altri tre. Funziona anche per verificare se n+1 punti in Rn sono conciclici, a condizione che gli ultimi n siano strettamente indipendenti (perché Circumsphereè triste se gli dai un input degenerato).

In alternativa, ecco un approccio matematico:

Wolfram Language (Mathematica) , 29 28 25 24 byte

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

Provalo online!

Accetta due elenchi come input: {x1,x2,x3,x4}e {y1,y2,y3,y4}. Restituisce Indeterminatequando i quattro punti si trovano su un cerchio comune e in caso 1contrario.

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

[x12+y12x22+y22x32+y32x42+y42x1x2x3x4y1y2y3y41111]

Il determinante di questa matrice è 0 se e solo se le quattro righe sono linearmente dipendenti e una dipendenza lineare tra le righe è la stessa cosa dell'equazione di un cerchio che è soddisfatta in tutti e quattro i punti.

Il modo più breve che mi viene in mente di verificare se il determinante è 0 è di portarlo alla potenza 0: 0^0è Indeterminatementre qualsiasi altra cosa dà 1.


10

Python 3 , 70 byte

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

Provalo online!

Uso il teorema di Tolomeo .

In un quadrilatero, se la somma dei prodotti delle sue due coppie di lati opposti è uguale al prodotto delle sue diagonali, allora il quadrilatero può essere inscritto in un cerchio.

b, c, d, eSono numeri complessi.


8

Perl 6 , 44 byte

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

Provalo online!

Prende i vertici come numeri complessi. Usa il fatto che la somma degli angoli opposti è di 180 ° in un quadrilatero ciclico. L'ordine delle operazioni dovrebbe garantire che le operazioni in virgola mobile producano un risultato esatto per numeri interi (abbastanza piccoli).

Soluzione TI-Basic di Port of Misha Lavrov, 33 byte

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

Provalo online!


42? È ancora preciso?
Jo King,

1
@JoKing No, non lo è .
nwellnhof,

Cosa fanno i due punti in questo caso? Non è sicuramente un'etichetta, e nemmeno una chiamata di metodo.
user202729

@ user202729 Si tratta di una chiamata di metodo con la sintassi invocant indiretta .
nwellnhof,

6

JavaScript (ES6)

Test degli angoli, 114 byte

[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

Provalo online!


Calcolo di un determinante, 130 byte

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

Questo equivale alla seconda risposta di MishaLavrov , con una matrice ruotata.

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

Provalo online!


6

TI-Basic (serie 83), 21 byte

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

Accetta input come un elenco di quattro numeri complessi in Ans. Restituisce 1se il quadrilatero è ciclico e 0non.

z1,z2,z3,z4

  • ΔList(augment(Ans,Ansz2z1,z3z2,z4z3,z1z4
  • e^(ΔList(ln(z3z2z2z1,z4z3z3z2,z1z4z4z3,
  • z3z2z2z1z1z4z4z3 (z3,z1;z2,z4)=z2z3z2z1:z4z3z4z1

Ho fatto del mio meglio per verificare se l'errore numerico è un problema e non sembra esserlo, ma se qualcuno ha buoni casi di test per questo, per favore fatemelo sapere.


3

JavaScript (ES6) (101 byte)

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)

Accetta input come [x1,y1,x2,y2,x3,y3,x4,y4], genera un valore booleano.

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

Provalo online!


2

Gelatina , 11 byte

²Sṭ;L€€ṖÆḊ¬

Provalo online!

Utilizza l'approccio determinante della soluzione Mathematica di Misha Lavrov . Emette 1 per vero, 0 per falso.

Come funziona

²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 byte

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

Provalo online!

Utilizza l'approccio contorto tra i rapporti della soluzione TI-Basic di Misha Lavrov . Emette 1 per vero, 0 per falso.

Come funziona

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?

Credo che entrambi siano golfabili ...


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.