Als Teil meiner Lernreise implementierte ich eine Technik zur Berechnung der Fläche eines Polygons, auf die ich in Futility Closet gestoßen bin . Ich habe eine Lösung gefunden, die aber ziemlich unelegant ist. Deshalb interessiere ich mich für bessere Methoden:
polyarea =: -:@((+/@((1&{&|:)*(0{&|:1&|.)))-(+/@((0&{&|:)*(1{&|:1&|.))))
y =: 2 7 9 5 6,.5 7 1 0 4
polyarea y
20
Diese Technik dreht eine Spalte und nimmt das Punktprodukt der Spalten und macht dasselbe nach dem Drehen der anderen Spalte. Die Fläche ist die Hälfte der Differenz dieser beiden Ergebnisse.
Interessiert an Vorschlägen!
Ich denke, dass ihre Technik darauf hinausläuft, die Determinante zu verwenden, um den Bereich des Polygons http://mathworld.wolfram.com/PolygonArea.html zu finden
Aber mit der Futility Closet-Technik würde ich zuerst das Polygon schließen, indem ich den ersten Punkt am Ende hinzufüge.
y =: 2 7 9 5 6,.5 7 1 0 4
close=: (, {.)
close
ist ein Haken, der das erste Paar nimmt und es an das Ende anfügt
Nehmen Sie dann die Determinanten zwei Punkte gleichzeitig, was im Wesentlichen das ist, was sie mit ihren Spalten und Rotationen tun
dets=: 2 (-/ . *)\ close
dets
nimmt die Determinante jedes Punktepaars - das Ergebnis ist negativ, wenn die Punkte im Uhrzeigersinn sind
Nehmen Sie dann diese Werte und verarbeiten Sie sie für die Antwort.
clean=: |@:-:@:(+/)
clean
fasst die Determinanten zusammen, dividiert durch 2 und gibt den absoluten Wert des Ergebnisses zurück.
clean @: dets y
20
Um das Ergebnis in vollständig stillschweigender Form zu sehen, können wir uns auf das f.
Adverb (Fix) stützen , um unsere Definitionen zu reduzieren.
clean @: dets f.
|@:-:@:(+/)@:(2 -/ .*\ (, {.))
Es ist nur eine andere Sichtweise auf das, was sie tun, aber es ermöglicht J, die .
Konjunktion (Dot Product) und das \
Adverb (Infix) zu verwenden, um all diese Rotationen mit Determinanten zu behandeln.
Hoffe das hilft.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen