Obszar przecięcia okręgu

14

Opis:

Dane xi ypozycje dwóch okręgów wraz z nimi radii, przedstawiają obszar przecięcia się dwóch okręgów.


Wejście :

Otrzymasz następujące dane wejściowe:

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

Metoda wprowadzania :

([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

Wynik :

  • Nieujemna liczba całkowita (bez miejsc dziesiętnych) równa powierzchni przecięcia dwóch kół.

  • Ciąg równy wyżej wymienionej liczbie całkowitej.

Uwaga :

  • Wyjście musi wynosić> = 0, ponieważ obszar nie może być ujemny.
  • W przypadku liczby dziesiętnej zaokrąglić w dół do najbliższej liczby całkowitej

Przykłady:

([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

Kryteria wygranej:

To jest więc wygrywa najkrótszy kod w bajtach dla każdego języka.


Propozycje :

  • Podaj link TIO, aby można go było przetestować.
  • Podaj wyjaśnienie, aby inni mogli zrozumieć Twój kod

Są to tylko sugestie i nie są obowiązkowe.

Muhammad Salman
źródło
4
Ravioli, ravioli ...
FrownyFrog
2
@FrownyFrog: Przepraszam? Nie wiem o czym mówisz? Sprawdź NVM w Internecie i przykro mi, że to część problemu. zobacz znacznik z matematyką i geometrią. To dobra wymówka, aby odświeżyć matematykę. Co myślisz. Ale jeśli się nie zgadzasz, myślę, że zaktualizuję pytanie i dodam formułę.
Muhammad Salman,
@MuhammadSalman Zmień answer must be positivena answer must be >= 0- Jeśli koła nie przecinają się (jak w przykładach 4, 7, 10), poprawna odpowiedź to 0, która ostatnio sprawdzona nie jest pozytywna.
manassehkatz-Moving 2 Codidact
@manassehkatz: Ok, jasne. Sporządzono
Muhammad Salman,

Odpowiedzi:

3

Galaretka ,  27 25 24  22 bajtów

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

Pełny program akceptujący listę dwóch centrów jako złożone współrzędne i promień, w którym wypisywany jest wynik (jako diademowe łącze zwraca listę o długości 1).

Wypróbuj online!

Aby wziąć dwie współrzędne jako pary, dodaj Uḅıdo głównego łącza, tak jak to .

W jaki sposób?

×,²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
źródło
tylko liczby. A co to jest [-7 + 13j, -25 + -5j]? Nie mam tego przykładu. Być może będziesz musiał wyjaśnić, co zrobiłeś?
Muhammad Salman,
Wyjaśniłem to już w odpowiedzi ... są współrzędnymi na płaszczyźnie złożonej ... Mogę to zrobić, [[x1,y1],[x2,y2]]ale kosztuje 3 bajty. (Zauważ też, że -7+13j jest to liczba :)) - [-7+13j,-25+-5j]odpowiada przykładowi, który powraca 132,[-7, 13], [-25, -5], 17
Jonathan Allan
Nie znam Galaretki, więc się tym zagubiłem. Wysłałem też wiadomość przed wyjaśnieniem. Ale tak, na pewno to działa (tak sądzę?)
Muhammad Salman
To nie ma nic wspólnego z samą galaretką, to tylko matematyka. Punkt w 2-spacji jest taki sam jak liczba zespolona .
Jonathan Allan
Nie to miałem na myśli. Normalne języki Byłbym w stanie przeczytać i powiedzieć, co się dzieje. Galaretka i inne tego rodzaju języki to problem w czytaniu.
Muhammad Salman,
3

JavaScript (ES6), 72 bajty

Alternatywna formuła sugerowana przez @ceilingcat

Pobiera dane wejściowe jako 5 różnych parametrów (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

Wypróbuj online!


JavaScript (ES7), 81 80 77 bajtów

Zaoszczędź 3 bajty dzięki @Neil

Pobiera dane wejściowe jako 5 różnych parametrów (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

Wypróbuj online!

W jaki sposób?

Opiera się to na ogólnej formule MathWorld dla kręgów niezgodnych:

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

gdzie d jest odległością między dwoma środkami ir oraz R oznaczają promienie.

O R = R , to uprościć:

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

A dla r '= 2r :

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

Uwaga : Jeśli d jest większe niż 2r , Math.acos()powróci NaN, co jest wymuszone na 0, gdy zastosowano przesunięcie w prawo. Jest to oczekiwany wynik, ponieważ d> 2r oznacza, że ​​w ogóle nie ma przecięcia.

Arnauld
źródło
d*(r*r-d*d)**.5oszczędza 3 bajty.
Neil,
@ceilingcat Thanks! Używanie with(Math)i przenoszenie definicji dzapisuje 2 kolejne bajty.
Arnauld
3

Mathematica 66 57 51 bajtów

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

A Disk[{x,y},r]odnosi się do regionu ograniczonego okręgiem, którego środek znajduje się w {x,y}promieniu r.

RegionIntersection[a,b]Zwraca przecięcie obszarów a, b. Areazajmuje obszar. IntegerPartzaokrągla w dół do najbliższej liczby całkowitej.

DavidC
źródło
Dla przypomnienia, nie widziałem uległości Alephalpha, ponieważ robiłem własne. Jego jest krótszy (stąd bardziej udany) wpis, ale i tak opuściłem mój.
DavidC
Można wymienić IntegerPartz Floor.
matrix89
@mathe, Dzięki. Jeśli używam dedykowanych wsporników podłogowych, czy wiesz, jak mam liczyć bajty?
DavidC
@DavidC każdy z nich ma 3 bajty, więc podstawienie w tym przypadku jest neutralne dla liczby bajtów. Są one użyteczne, jeśli w innym przypadku wyrażenie wymagałoby nawiasowania (-1 bajt w porównaniu do Floor[ ]).
attinat
1

Haskell , 83 bajty

(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

Tylko formuła, naprawdę. Typ musi być zadeklarowany jak Intdla NaN, aby zamapować na 0 za pomocą floor.

Wypróbuj online!

Angs
źródło
1

JavaScript (Node.js) , 69 bajtów

with(Math)f=(a,b,c,d,r)=>(-sin(x=2*acos(hypot(a-c,b-d)/2/r))+x)*r*r|0

Wypróbuj online!

Krótko nie jestem pewien, czy można dalej grać w golfa. Wszelkie sugestie są mile widziane


źródło
0

Perl 6 , 56 bajtów

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

Wypróbuj online!

Przyjmuje współrzędne okręgu jako liczby zespolone.

nwellnhof
źródło
0

Excel, 119 bajtów

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

Dane wejściowe przyjęte jako 5 oddzielnych zmiennych:

x-coordinate    y-coordinate    x-coordinate    y-coordinate    radius
     A1              B1             C1                D1          E1
Wernisch
źródło
0

Python 2 , 109 bajtów

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)

Wypróbuj online!

Całkiem proste. Uzyskaj odległość między okręgami i użyj R=2rjako podstawnika w równaniu. d<R anddo zwarcia, jeśli koła się nie nakładają.

Sunny Patel
źródło
0

Pyth , 63 bajty

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

Zestaw testowy

Pobiera dane wejściowe jako potrójny składający się z dwóch podwójnych i jednej liczby.

hakr14
źródło
0

T-SQL, 122 bajty

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

(podział linii tylko dla czytelności).

Wykorzystuje obsługę MS SQL w geometrii przestrzennej .

Zgodnie z naszymi standardami IO , SQL może pobierać dane z uprzednio istniejącej tabeli T z intpola R i varcharpól i b zawierających współrzędne w formacie(x y) .

Moje oświadczenie analizuje współrzędne jako POINTobiekty geometryczne rozszerzone o promień za pomocą funkcji STBuffer(), a następnie przyjmuje STIntersection()znakSTArea() .

Jeśli zamiast tego mogę wprowadzić rzeczywiste obiekty geometrii do tabeli, mój kod stanie się prawie trywialny (48 bajtów):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
BradC
źródło