Ist das vierseitig zyklisch?

18

In der Mathematik ist ein zyklisches Viereck eines, dessen Eckpunkte alle auf demselben Kreis liegen. Mit anderen Worten, jeder Scheitelpunkt befindet sich auf dem Umkreis der anderen drei. Weitere Informationen finden Sie im MathWorld-Artikel .

Beispiele

Diese Vierecke sind zyklisch:

Zyklische Vierecke

Dieses Trapez ist nicht zyklisch.

Trapez

(Bilder aus Wikipedia)

Zielsetzung

Bestimmen Sie anhand der Koordinaten von vier Eckpunkten im Gegenuhrzeigersinn, die ein konvexes Viereck bilden, ob das Viereck zyklisch ist.

Koordinaten sind ganze Zahlen (beachten Sie jedoch, dass die Koordinaten des Umfangszentrums und der Umfangsradius nicht unbedingt ganze Zahlen sind.) Wie im vorherigen Absatz angedeutet, sind keine drei Punkte kolinear und keine zwei koinzident.

I / O

Sie können Eingaben in jedem vernünftigen Format vornehmen. Insbesondere [[x1,x2,x3,x4],[y1,y2,y3,y4]], [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]und komplexe Zahlen sind alle in Ordnung.

Ausgabe mit unterschiedlichen konsistenten Werten für true und false.

Testfälle

Wahr:

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

Falsch:

[0,0], [314,0], [314,100], [0,99]
[31,41],[59,26],[53,58],[0,314]
Lirtosiast
quelle

Antworten:

11

Wolfram Language (Mathematica) , 23 Byte

#∈Circumsphere@{##2}&

Probieren Sie es online!

Nimmt vier Eingänge: die Listen {x1,y1}, {x2,y2}, {x3,y3}, und {x4,y4}. Prüft, ob der erste Punkt auf dem Umkreis der anderen drei Punkte liegt. Funktioniert auch zum Überprüfen, ob n+1 Punkte in Rn konzyklisch sind, vorausgesetzt, die letzten n von ihnen sind affin unabhängig (weil Circumspherees traurig ist, wenn Sie eine entartete Eingabe machen).

Alternativ ist hier ein mathematischer Ansatz:

Wolfram Language (Mathematica) , 29 28 25 24 Bytes

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

Probieren Sie es online!

Nimmt zwei Listen als Eingabe: {x1,x2,x3,x4}und {y1,y2,y3,y4}. Gibt zurück, Indeterminatewenn sich die vier Punkte auf einem gemeinsamen Kreis befinden 1.

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

[x12+y12x22+y22x32+y32x42+y42x1x2x3x4y1y2y3y41111]

Die Determinante dieser Matrix ist 0, wenn und nur wenn die vier Zeilen linear abhängig sind und eine lineare Abhängigkeit zwischen den Zeilen dasselbe ist wie die Gleichung eines Kreises, der an allen vier Punkten erfüllt ist.

Der kürzeste Weg , ich zu Check denken könnte , wenn die Determinante 0 ist , ist es auf die 0-te Potenz zu erhöhen: 0^0ist , Indeterminatewährend alle andere gibt 1.

Mischa Lawrow
quelle
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

Probieren Sie es online!

Ich verwende den Satz des Ptolemäus .

Wenn in einem Viereck die Summe der Produkte seiner beiden Paare gegenüberliegender Seiten gleich dem Produkt seiner Diagonalen ist, kann das Viereck in einen Kreis eingeschrieben werden.

b, c, d, eKomplexe Zahlen.

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

Perl 6 , 44 Bytes

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

Probieren Sie es online!

Nimmt Eckpunkte als komplexe Zahlen. Verwendet die Tatsache, dass die Summe der entgegengesetzten Winkel in einem zyklischen Viereck 180 ° beträgt. Die Reihenfolge der Operationen sollte gewährleisten, dass Gleitkommaoperationen ein genaues Ergebnis für (ausreichend kleine) Ganzzahlen liefern.

Port von Mischa Lawrows TI-Basic-Lösung, 33 Byte

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

Probieren Sie es online!

nwellnhof
quelle
42? Ist es noch genau?
Jo King
1
@JoKing Nein, das ist es nicht .
Nwellnhof
Was macht der Doppelpunkt in diesem Fall? Es ist definitiv kein Label und auch kein Methodenaufruf.
User202729
@ user202729 Dies ist ein Methodenaufruf mit indirekter Aufrufsyntax .
Nwellnhof
6

JavaScript (ES6)

Testen der Winkel, 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

Probieren Sie es online!


Berechnung einer Determinante, 130 Bytes

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

Diese entspricht der zweiten Antwort von Mischa Lawrow mit einer gedrehten Matrix.

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

Probieren Sie es online!

Arnauld
quelle
6

TI-Basic (Serie 83), 21 Byte

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

Übernimmt die Eingabe als Liste von vier komplexen Zahlen in Ans. Gibt zurück, 1ob das Viereck zyklisch ist oder 0nicht.

z1,z2,z3,z4

  • ΔList(augment(Ans,Ansz2-z1,z3-z2,z4-z3,z1-z4
  • e^(ΔList(ln(davon werden die Verhältnisse berechnetz3-z2z2-z1,z4-z3z3-z2,z1-z4z4-z3,
  • z3-z2z2-z1z1-z4z4-z3 (z3,z1;z2,z4)=z2-z3z2-z1:z4-z3z4-z1

Ich habe mein Bestes getan, um zu überprüfen, ob ein numerischer Fehler ein Problem ist und dies anscheinend nicht der Fall ist. Wenn jemand gute Testfälle dafür hat, lassen Sie es mich bitte wissen.

Mischa Lawrow
quelle
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)

Nimmt die Eingabe als [x1,y1,x2,y2,x3,y3,x4,y4], gibt einen Booleschen Wert aus.

ef=einc+bd
e,fein,b,c,d

Probieren Sie es online!

Alvin Li
quelle
2

Jelly , 11 Bytes

²Sṭ;L€€ṖÆḊ¬

Probieren Sie es online!

Verwendet den Determinantenansatz von Mischa Lawrows Mathematica-Lösung . Ausgänge 1 für wahr, 0 für falsch.

Wie es funktioniert

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

Gelee , 12 Bytes

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

Probieren Sie es online!

Verwendet den verschachtelten Cross-Ratio-Ansatz der TI-Basic-Lösung von Misha Lavrov . Ausgänge 1 für wahr, 0 für falsch.

Wie es funktioniert

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?

Ich glaube, beide sind golfen ...

Bubbler
quelle