Cerchia area di intersezione


14

Descrizione:

Dati xe yposizioni di due cerchi insieme al loro radii, generano l'area di intersezione dei due cerchi.


Input:

Ti verrà dato il seguente input:

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

Metodo di input :

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

Produzione :

  • Un numero intero non negativo (senza decimali) uguale all'area di intersezione di due cerchi.

  • Una stringa uguale all'intero sopra menzionato.

Nota :

  • L'output deve essere> = 0, poiché l'area non può essere negativa.
  • In caso di decimale, arrotondare per difetto all'intero più vicino

Esempi:

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

Criteri vincenti:

Questo è quindi il codice più breve in byte per ogni lingua vince.


Suggerimenti:

  • Fornire un collegamento TIO in modo che possa essere testato.
  • Fornisci una spiegazione in modo che altri possano capire il tuo codice

Questi sono solo suggerimenti e non sono obbligatori.


4
Ravioli, ravioli ...
FrownyFrog

2
@FrownyFrog: mi scusi? Non sono a conoscenza di cosa stai parlando? nvm controlla su internet e mi dispiace segnalare che fa parte del problema. vedere il tag che dice matematica e geometria. È una buona scusa per rispolverare la tua matematica. Cosa ne pensi. Ma se non sei d'accordo, penso che aggiornerò la domanda e aggiungerò la formula.
Muhammad Salman,

@MuhammadSalman Cambia answer must be positivein answer must be >= 0- Se i cerchi non si intersecano (come negli esempi 4, 7, 10), la risposta corretta è 0, l'ultima volta che ho controllato non è positivo.
manassehkatz-Moving 2 Codidact

@manassehkatz: Ok, certo. Fatto
Muhammad Salman, il

Risposte:


3

Gelatina ,  27 25 24  22 byte

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

Un programma completo che accetta un elenco dei due centri come coordinate complesse e il raggio che stampa il risultato (come collegamento diadico restituisce un elenco di lunghezza 1).

Provalo online!

Per prendere le due coordinate come coppie aggiungere Uḅıal collegamento principale, in questo modo .

Come?

×,²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

solo numeri. E che cos'è [-7 + 13j, -25 + -5j]? Non ho questo esempio. Potresti dover spiegare cosa hai fatto?
Muhammad Salman,

L'ho già spiegato nella risposta ... sono coordinate sul piano complesso ... Posso [[x1,y1],[x2,y2]]invece farlo ma costa 3 byte. (Nota anche che -7+13j è un numero :)) - [-7+13j,-25+-5j]corrisponde all'esempio che ritorna 132,[-7, 13], [-25, -5], 17
Jonathan Allan

Non conosco Jelly, quindi me ne sono perso. Inoltre ho inviato il messaggio prima della spiegazione. Ma sì, certo che funziona (immagino?)
Muhammad Salman,

Non ha nulla a che fare con Jelly di per sé, è solo matematica. Un punto nello spazio 2 è uguale a un numero complesso .
Jonathan Allan,

Non quello che intendevo dire. Lingue normali sarei in grado di leggere e dire cosa sta succedendo. Jelly e altre lingue simili sono un dolore da leggere.
Muhammad Salman,

3

JavaScript (ES6), 72 byte

Formula alternativa suggerita da @ceilingcat

Accetta input come 5 parametri distinti (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

Provalo online!


JavaScript (ES7), 81 80 77 byte

3 byte salvati grazie a @Neil

Accetta input come 5 parametri distinti (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

Provalo online!

Come?

Questo si basa su una formula generica di MathWorld per i circoli non congruenti:

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

dove d è la distanza tra i due centri e R e R sono i raggi.

Con R = r , questo è semplificato per:

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

E con r '= 2r :

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

Nota : se d è maggiore di 2r , Math.acos()verrà restituito NaN, che viene forzato a 0 quando viene applicato lo spostamento a destra. Questo è il risultato atteso, perché d> 2r significa che non c'è alcuna intersezione.


d*(r*r-d*d)**.5salva 3 byte.
Neil,

@ceilingcat Grazie! L'uso with(Math)e lo spostamento della definizione di dconsente di salvare altri 2 byte.
Arnauld,

3

Mathematica 66 57 51 byte

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

A si Disk[{x,y},r]riferisce alla regione circoscritta dal cerchio centrato {x,y}con un raggio di r.

RegionIntersection[a,b]restituisce l'intersezione delle regioni a, b. Areaprende l'area. IntegerPartarrotonda per difetto all'intero più vicino.


Per la cronaca, non ho visto la presentazione di alephalpha mentre stavo facendo la mia. La sua è una voce più breve (quindi una più riuscita), ma ho lasciato la mia in ogni caso.
DavidC,

È possibile sostituire IntegerPartcon Floor.
matrix89,

@mathe, grazie. Se utilizzo le parentesi Floor dedicate, sai come devo contare i byte?
DavidC,

@DavidC ognuno ha 3 byte, quindi la sostituzione è neutra in questo caso per il conteggio dei byte. Sono utili se l'espressione avrebbe bisogno di parentesi, comunque (-1 byte rispetto a Floor[ ]).
attinat




1

JavaScript (Node.js) , 69 byte

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

Provalo online!

Insomma non sono sicuro se può essere ulteriormente giocato a golf. Eventuali suggerimenti sono ben accetti



0

Excel, 119 byte

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

Input preso come 5 variabili separate:

x-coordinate    y-coordinate    x-coordinate    y-coordinate    radius
     A1              B1             C1                D1          E1

0

Python 2 , 109 byte

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)

Provalo online!

Abbastanza diretto. Prendi la distanza tra i cerchi e usa R=2rcome sostituente nell'equazione. d<R andin corto circuito se i cerchi non si sovrappongono.


0

Pyth , 63 byte

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

Suite di test

Accetta input come una tripla composta da due doppie e un numero.


0

T-SQL, 122 byte

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

(interruzione di riga solo per leggibilità).

Utilizza il supporto di MS SQL per la geometria spaziale .

Per i nostri standard IO , SQL può prendere input da una tabella pre-esistente t con intcampo r e varcharcampi a e b contenente le coordinate nel formato(x y) .

La mia affermazione analizza le coordinate come POINToggetti geometrici espansi dal raggio usando la funzione STBuffer(), quindi prendendo il STIntersection()seguito daSTArea() .

Se invece mi è permesso inserire gli oggetti geometrici effettivi nella tabella, allora il mio codice diventa quasi banale (48 byte):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.