Kreisschnittfläche

14

Beschreibung :

Gegeben xund yPositionen von zwei Kreisen zusammen mit deren radii, geben Sie den Schnittbereich der beiden Kreise aus.


Eingabe:

Sie erhalten folgende Eingabe:

array 1 = x and y positions of circle a
array 2 = x and y positions of circle b
radius  = radii of the two congruent circles

Eingabe Methode :

([12 , 20] , [20 , 18] , 12)     ---> two array and number
([12 , 20 , 20 , 18] , 12)       ---> array and a number
(12 , 20 , 20 , 18 , 12)         ---> all five numbers
('12 20' , '20 18' , 12)         ---> 2 strings and a number
('12 20 20 18' , 12)             ---> string and a number
('12 20 20 18 12')               ---> one string

Ausgabe :

  • Eine nicht negative ganze Zahl (keine Dezimalzahl), die der Schnittfläche zweier Kreise entspricht.

  • Eine Zeichenfolge, die der oben genannten Ganzzahl entspricht.

Hinweis :

  • Der Ausgang muss> = 0 sein, da der Bereich nicht negativ sein kann.
  • Bei Dezimalstellen auf nächste Ganzzahl abrunden

Beispiele:

([0, 0], [7, 0], 5)                   ---> 14

([0, 0], [0, 10], 10)                 ---> 122

([5, 6], [5, 6], 3)                   ---> 28

([-5, 0], [5, 0], 3)                  ---> 0

([10, 20], [-5, -15], 20)             ---> 15

([-7, 13], [-25, -5], 17)             ---> 132

([-12, 20], [43, -49], 23)            ---> 0

Gewinnkriterien:

Dies ist so dass der kürzeste Code in Bytes für jede Sprache gewinnt.


Vorschläge :

  • Stellen Sie eine TIO-Verbindung bereit, damit diese getestet werden kann.
  • Geben Sie eine Erklärung an, damit andere Ihren Code verstehen können

Dies sind nur Vorschläge und sind nicht obligatorisch.

Muhammad Salman
quelle
4
Ravioli, Ravioli ...
FrownyFrog
2
@FrownyFrog: Entschuldigung? Mir ist nicht bewusst, wovon Sie sprechen? NVM Check im Internet und es tut mir leid zu melden, dass dies Teil des Problems ist. Siehe das Tag mit der Aufschrift Mathe und Geometrie. Es ist eine gute Ausrede, um Ihre Mathematik aufzufrischen. Was denkst du. Aber wenn Sie nicht einverstanden sind, denke ich, dass ich die Frage aktualisieren und Formel hinzufügen werde.
Muhammad Salman
@MuhammadSalman Wechseln answer must be positivezu answer must be >= 0- Wenn sich die Kreise nicht schneiden (wie in den Beispielen 4, 7, 10), ist die richtige Antwort 0, was ich zuletzt überprüft habe, ist nicht positiv.
Manassehkatz-Reinstate Monica
@manassehkatz: Ok, sicher. Fertig
Muhammad Salman

Antworten:

3

Jelly ,  27 25 24  22 Bytes

×,²I½
÷ÆAײ}_çHḞ
ạ/çḤ}

Ein vollständiges Programm, das eine Liste der beiden Zentren als komplexe Koordinaten und den Radius, der das Ergebnis ausgibt, akzeptiert (als dyadische Verknüpfung gibt es eine Liste der Länge 1 zurück).

Probieren Sie es online!

Nehmen die beiden Koordinaten als Paare hinzufügen , Uḅıum die Hauptverbindung, wie diese .

Wie?

×,²I½ - Link 1, get [√(s²d² - s⁴)]: separation of centres, s; diameter, d
 ,    - pair = [s, d]
×     - multiply (vectorises) = [s², sd]
  ²   - square (vectorises) = [s⁴, s²d²]
   I  - incremental differences = [s²d² - s⁴]
    ½ - square root (vectorises) = [√(s²d² - s⁴)]

÷ÆAײ}_çHḞ - Link 2, get intersection area: separation of centres, s; diameter, d
÷          - divide = s/d
 ÆA        - arccos = acos(s/d)
    ²}     - square right = d²
   ×       - multiply = acos(s/d)d²
       ç   - call last Link (1) as a dyad (f(s,d)) = [√(s²d² - s⁴)]
      _    - subtract (vectorises) = [acos(s/d)d² - √(s²d² - s⁴)]
        H  - halve (vectorises) = [(acos(s/d)d² - √(s²d² - s⁴))/2]
         Ḟ - floor = [⌊(acos(s/d)d² - √(s²d² - s⁴))/2⌋]
           -  ...Note: Jelly's Ḟ takes the real part of a complex input so when
           -           the circles are non-overlapping the result is 0 as required

ạ/çḤ} - Main link: centres, a pair of complex numbers, c; radius, r
 /    - reduce c by:
ạ     -   absolute difference = separation of centres, s
      -   ...Note: Jelly's ạ finds the Euclidean distance when inputs are complex
      -            i.e. the norm of the difference
   Ḥ} - double right = 2r = diameter, d
  ç   - call last Link (2) as a dyad (f(s,d))
      - implicit print
Jonathan Allan
quelle
nur Zahlen. Und was ist das [-7 + 13j, -25 + -5j]? Ich habe das Beispiel nicht. Sie müssen vielleicht erklären, was Sie getan haben?
Muhammad Salman
Ich habe es in der Antwort bereits erklärt ... sie sind Koordinaten auf der komplexen Ebene ... Ich kann es [[x1,y1],[x2,y2]]stattdessen tun, aber es kostet 3 Bytes. (Beachten Sie auch, dass -7+13j das eine Zahl ist :)) - das [-7+13j,-25+-5j]entspricht dem Beispiel, das zurückgibt 132,[-7, 13], [-25, -5], 17
Jonathan Allan
Ich kenne Jelly nicht, also bin ich verloren. Auch ich habe die Nachricht vor der Erklärung gesendet. Aber ja, sicher, dass das funktioniert (schätze ich?)
Muhammad Salman
Es hat nichts mit Jelly per se zu tun, es ist nur Mathematik. Ein Punkt im 2-Raum ist dasselbe wie eine komplexe Zahl .
Jonathan Allan
Nicht was ich meinte. Normale Sprachen Ich könnte lesen und erzählen, was los ist. Gelee und andere solche Sprachen sind ein Schmerz zu lesen.
Muhammad Salman
3

JavaScript (ES6), 72 Byte

Alternative Formel vorgeschlagen von @ceilingcat

Übernimmt die Eingabe als 5 verschiedene Parameter (x0, y0, x1, y1, r) .

with(Math)f=(x,y,X,Y,r)=>-(sin(d=2*acos(hypot(x-X,y-Y)/r/2))-d)*r*r*2>>1

Probieren Sie es online!


JavaScript (ES7), 81 80 77 Byte

3 Bytes dank @Neil gespart

Übernimmt die Eingabe als 5 verschiedene Parameter (x0, y0, x1, y1, r) .

(x,y,X,Y,r,d=Math.hypot(x-X,y-Y))=>(r*=2)*r*Math.acos(d/r)-d*(r*r-d*d)**.5>>1

Probieren Sie es online!

Wie?

Dies basiert auf einer generischen Formel von MathWorld für nicht kongruente Kreise:

A = r².arccos((d² + r² - R²) / 2dr) +
    R².arccos((d² + R² - r²) / 2dR) -
    sqrt((-d + r + R)(d + r - R)(d -r + R)(d + r + R)) / 2

wo d der Abstand zwischen den beiden Zentren ist und r und R die Radien sind.

Mit R = r vereinfacht sich dies zu:

A = 2r².arccos(d / 2r) + d.sqrt((2r - d) * (2r + d)) / 2

Und mit r '= 2r :

A = (r'².arccos(d / r') + d.sqrt(r'² - d²)) / 2

Hinweis : Wenn d größer als 2r ist , Math.acos()wird zurückgegeben NaN, was auf 0 erzwungen wird, wenn die Rechtsverschiebung angewendet wird. Dies ist das erwartete Ergebnis, da d> 2r bedeutet, dass es überhaupt keine Kreuzung gibt.

Arnauld
quelle
d*(r*r-d*d)**.5Spart 3 Bytes.
Neil
@ceilingcat Danke! Durch Verwenden with(Math)und Verschieben der Definition von werden d2 weitere Bytes gespeichert.
Arnauld
3

Mathematica 66 57 51 Bytes

Floor@Area@RegionIntersection[#~Disk~#3,#2~Disk~#3]&

A Disk[{x,y},r]bezieht sich auf die Region, die von dem Kreis umschrieben wird, der um zentriert ist{x,y} mit einem Radius vonr .

RegionIntersection[a,b]gibt den Schnittpunkt der Regionen a, b. Areanimmt den Bereich. IntegerPartRundet auf die nächste Ganzzahl ab.

DavidC
quelle
Fürs Protokoll, ich habe Alephalphas Einreichung nicht gesehen, da ich meine eigene gemacht habe. Sein Eintrag ist kürzer (daher erfolgreicher), aber ich habe meinen trotzdem gelassen.
DavidC
Sie könnten ersetzen IntegerPartmit Floor.
Matrix89
@ Mathe, danke. Wissen Sie, wie ich die Bytes zählen soll, wenn ich die dafür vorgesehenen Bodenklammern verwende?
DavidC
@DavidC hat jeweils 3 Bytes, daher ist die Ersetzung für die Byteanzahl in diesem Fall neutral. Sie sind nützlich, wenn der Ausdruck ansonsten in Klammern gesetzt werden müsste (-1 Byte im Vergleich zu Floor[ ]).
24.
1

Haskell , 83 Bytes

(k!l)m n r|d<-sqrt$(k-m)^2+(l-n)^2=floor$2*r^2*acos(d/2/r)-d/2*sqrt(4*r*r-d*d)::Int

Wirklich nur die Formel. Typ muss als deklariert werdenInt für NaN , um mit 0 zuzuordnen floor.

Probieren Sie es online!

Angs
quelle
Alternative Formel
Ceilingcat
0

Perl 6 , 56 Bytes

{{1>$_&&{$_-.sin}(2*.acos)}(abs($^p-$^q)/2/$^r)*$r²+|0}

Probieren Sie es online!

Nimmt Kreiskoordinaten als komplexe Zahlen.

nwellnhof
quelle
0

Excel, 119 Bytes

=INT(IFERROR(2*E1^2*ACOS(((C1-A1)^2+(D1-B1)^2)^.5/2/E1)-((4*E1^2-((C1-A1)^2+(D1-B1)^2))*((C1-A1)^2+(D1-B1)^2))^.5/2,0))

Eingabe als 5 separate Variablen:

x-coordinate    y-coordinate    x-coordinate    y-coordinate    radius
     A1              B1             C1                D1          E1
Wernisch
quelle
0

Python 2 , 109 Bytes

from math import*
a,b,x,y,r=input()
d,R=hypot(x-a,y-b),2*r
print int(d<R and R*r*acos(d/R)-d*sqrt(R*R-d*d)/2)

Probieren Sie es online!

Ziemlich einfach. Ermitteln Sie den Abstand zwischen den Kreisen und verwenden Sie ihn R=2rals Substituenten in der Gleichung. d<R andkurzschließen, wenn sich Kreise nicht überlappen.

Sonniges Patel
quelle
0

Pyth , 63 Bytes

J@+^-hhQh@Q1 2^-ehQe@Q1 2 2K*2eQs&<JK-**KeQ.tcJK4c*J@-*KK*JJ2 2

Testsuite

Nimmt die Eingabe als Triple, bestehend aus zwei Doppel- und einer Zahl.

hakr14
quelle
0

T-SQL, 122 Bytes

SELECT FLOOR(Geometry::Parse('POINT'+a).STBuffer(r).STIntersection(
             Geometry::Parse('POINT'+b).STBuffer(r)).STArea())FROM t

(Zeilenumbruch nur zur besseren Lesbarkeit).

Verwendet die Unterstützung der räumlichen Geometrie von MS SQL .

Gemäß unseren E / A-Standards kann SQL Eingaben aus einer bereits vorhandenen Tabelle t mit intFeld r und varcharFeldern a und b übernehmen, die Koordinaten im Format enthalten (x y).

Meine Anweisung analysiert die Koordinaten als POINTGeometrieobjekte, die mit der Funktion um den Radius erweitert wurden STBuffer(), und verwendet dann STIntersection()das STArea().

Wenn ich stattdessen die tatsächlichen Geometrieobjekte in die Tabelle eingeben darf , wird mein Code fast trivial (48 Byte):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
BradC
quelle