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]

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.



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!


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!


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.


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!


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 ...


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.