Ce quadrilatère est-il cyclique?

18

En mathématiques, un quadrilatère cyclique est un quadrilatère dont tous les sommets se trouvent sur le même cercle. En d'autres termes, chaque sommet se trouve sur le cercle circonscrit des trois autres. Pour plus d'informations, consultez l' article MathWorld .

Exemples

Ces quadrilatères sont cycliques:

Quadrilatères cycliques

Ce trapèze n'est pas cyclique.

Trapèze

(Images de Wikipedia)

Objectif

Étant donné les coordonnées de quatre sommets dans le sens antihoraire qui forment un quadrilatère convexe, déterminez si le quadrilatère est cyclique.

Les coordonnées seront des entiers (notez cependant que les coordonnées du circoncenter et le circumradius ne sont pas nécessairement des entiers.) Comme l'indique le paragraphe précédent, aucun point ne sera colinéaire et aucun coïncident.

E / S

Vous pouvez prendre des entrées en utilisant n'importe quel format raisonnable. En particulier, [[x1,x2,x3,x4],[y1,y2,y3,y4]], [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]et nombres complexes sont tous très bien.

Sortie utilisant des valeurs cohérentes différentes pour vrai et faux.

Cas de test

Vrai:

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

Faux:

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

Réponses:

11

Wolfram Language (Mathematica) , 23 octets

#∈Circumsphere@{##2}&

Essayez-le en ligne!

Prend quatre entrées: les listes {x1,y1}, {x2,y2}, {x3,y3}et {x4,y4}. Vérifie si le premier point se trouve sur le cercle circonscrit des trois autres. Fonctionne également pour vérifier si n+1 points dans Rn sont concycliques, à condition que les n derniers d'entre eux soient affinement indépendants (car Circumspherec'est triste si vous lui donnez une entrée dégénérée).

Alternativement, voici une approche mathématique:

Wolfram Language (Mathematica) , 29 28 25 24 octets

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

Essayez-le en ligne!

Prend deux listes en entrée: {x1,x2,x3,x4}et {y1,y2,y3,y4}. Renvoie Indeterminatelorsque les quatre points sont sur un cercle commun et 1autrement.

À partir des quatre points (x1,y1),(x2,y2),(x3,y3),(x4,y4) , cette solution construit la matrice ci-dessous:

[x12+y12x22+y22x32+y32x42+y42x1x2x3x4y1y2y3y41111]

Le déterminant de cette matrice est 0 si et seulement si les quatre lignes sont linéairement dépendantes, et une dépendance linéaire entre les lignes est la même chose que l'équation d'un cercle qui est satisfait aux quatre points.

La façon la plus courte à laquelle je pourrais penser pour vérifier si le déterminant est 0 est de le porter à la puissance 0: 0^0c'est Indeterminatependant que tout le reste donne 1.

Misha Lavrov
la source
10

Python 3 , 70 octets

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

Essayez-le en ligne!

J'utilise le théorème de Ptolémée .

Dans un quadrilatère, si la somme des produits de ses deux paires de côtés opposés est égale au produit de ses diagonales, alors le quadrilatère peut être inscrit dans un cercle.

b, c, d, eSont des nombres complexes.

Кирилл Малышев
la source
8

Perl 6 , 44 octets

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

Essayez-le en ligne!

Prend les sommets comme des nombres complexes. Utilise le fait que la somme des angles opposés est de 180 ° dans un quadrilatère cyclique. L'ordre des opérations doit garantir que les opérations en virgule flottante donnent un résultat exact pour les entiers (suffisamment petits).

Solution TI-Basic du port de Misha Lavrov, 33 octets

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

Essayez-le en ligne!

nwellnhof
la source
42? Est-ce toujours exact?
Jo King
1
@JoKing Non, ce n'est pas le cas .
nwellnhof
Que fait le colon dans ce cas? Ce n'est certainement pas une étiquette, ni un appel de méthode.
user202729
@ user202729 Il s'agit d' un appel de méthode avec une syntaxe invocante indirecte .
nwellnhof
6

JavaScript (ES6)

Test des angles, 114 octets

[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

Essayez-le en ligne!


Calcul d'un déterminant, 130 octets

[X1,X2,X3,X4][y1,y2,y3,y4]

Celui-ci est équivalent à la 2e réponse de MishaLavrov , avec une matrice tournée.

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

Essayez-le en ligne!

Arnauld
la source
6

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

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

Prend l'entrée sous la forme d'une liste de quatre nombres complexes dans Ans. Renvoie 1si le quadrilatère est cyclique et 0sinon.

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

J'ai fait de mon mieux pour vérifier si l'erreur numérique est un problème, et cela ne semble pas l'être, mais si quelqu'un a de bons cas de test pour cela, veuillez me le faire savoir.

Misha Lavrov
la source
3

JavaScript (ES6) (101 octets)

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)

Prend l'entrée en tant que [x1,y1,x2,y2,x3,y3,x4,y4], génère un booléen.

eF=unec+b
e,Fune,b,c,

Essayez-le en ligne!

Alvin Li
la source
2

Gelée , 11 octets

²Sṭ;L€€ṖÆḊ¬

Essayez-le en ligne!

Utilise l'approche déterminante de la solution Mathematica de Misha Lavrov . Sorties 1 pour vrai, 0 pour faux.

Comment ça fonctionne

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

Gelée , 12 octets

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

Essayez-le en ligne!

Utilise l'approche de rapport croisé alambiqué de la solution TI-Basic de Misha Lavrov . Sorties 1 pour vrai, 0 pour faux.

Comment ça fonctionne

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?

Je crois que les deux sont jouables au golf ...

Bubbler
la source