Zone d'intersection de cercle

14

La description :

Étant donné xet les ypositions de deux cercles avec leur radii, affichez la zone d'intersection des deux cercles.


Contribution :

Vous recevrez les informations suivantes:

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

Procédé d'entrée :

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

Production :

  • Un entier non négatif (sans décimale) égal à la zone d'intersection de deux cercles.

  • Une chaîne égale à l'entier mentionné ci-dessus.

Remarque :

  • La sortie doit être> = 0, car la zone ne peut pas être négative.
  • En cas d'arrondi décimal à l'entier le plus proche

Exemples :

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

Critères gagnants:

C'est le donc le code le plus court en octets pour chaque langue gagne.


Suggestions :

  • Fournissez un lien TIO afin qu'il puisse être testé.
  • Fournissez une explication pour que les autres puissent comprendre votre code

Ce ne sont que des suggestions et ne sont pas obligatoires.

Muhammad Salman
la source
4
Ravioli, ravioli ...
FrownyFrog
2
@FrownyFrog: Excusez-moi? Je ne sais pas de quoi vous parlez? vérification nvm sur Internet et je suis désolé de signaler que cela fait partie du problème. voir la balise qui dit mathématiques et géométrie. C'est une bonne excuse pour parfaire vos calculs. Qu'est-ce que tu penses. Mais si vous n'êtes pas d'accord, je pense que je mettrai à jour la question et ajouterai la formule.
Muhammad Salman
@MuhammadSalman Changement answer must be positiveà answer must be >= 0- Si les cercles ne pas recoupé (comme dans les exemples 4, 7, 10), la réponse est 0, ce qui est la dernière que j'ai vérifié pas positif.
manassehkatz-Moving 2 Codidact
@manassehkatz: Ok, bien sûr. Fait
Muhammad Salman

Réponses:

3

Gelée ,  27 25 24  22 octets

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

Un programme complet acceptant une liste des deux centres comme coordonnées complexes et le rayon qui imprime le résultat (sous forme de lien dyadique, il renvoie une liste de longueur 1).

Essayez-le en ligne!

Pour prendre les deux coordonnées en paires, ajoutez Uḅıau lien principal, comme ceci .

Comment?

×,²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
la source
chiffres uniquement. Et qu'est-ce que c'est [-7 + 13j, -25 + -5j]? Je n'ai pas cet exemple. Vous devrez peut-être expliquer ce que vous avez fait?
Muhammad Salman
Je l'ai déjà expliqué dans la réponse ... ce sont des coordonnées sur le plan complexe ... Je peux le faire à la [[x1,y1],[x2,y2]]place mais cela coûte 3 octets. (Notez également que -7+13j c'est un nombre :)) - le [-7+13j,-25+-5j]correspond à l'exemple qui revient 132,[-7, 13], [-25, -5], 17
Jonathan Allan
Je ne connais pas Jelly, donc je suis perdu là-dessus. J'ai également envoyé le message avant l'explication. Mais oui, bien sûr que cela fonctionne (je suppose?)
Muhammad Salman
Cela n'a rien à voir avec Jelly en soi, c'est juste des mathématiques. Un point dans 2 espaces est identique à un nombre complexe .
Jonathan Allan
Pas ce que je voulais dire. Langues normales, je serais capable de lire et de dire ce qui se passe. La gelée et d'autres langues similaires sont difficiles à lire.
Muhammad Salman le
3

JavaScript (ES6), 72 octets

Formule alternative suggérée par @ceilingcat

Prend l'entrée comme 5 paramètres distincts (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

Essayez-le en ligne!


JavaScript (ES7), 81 80 77 octets

Sauvegardé 3 octets grâce à @Neil

Prend l'entrée comme 5 paramètres distincts (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

Essayez-le en ligne!

Comment?

Ceci est basé sur une formule générique de MathWorld pour les cercles non congruents:

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

d est la distance entre les deux centres et r et R sont les rayons.

Avec R = r , cela se simplifie pour:

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

Et avec r '= 2r :

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

Remarque : Si d est supérieur à 2r , Math.acos()sera renvoyé NaN, qui est contraint à 0 lorsque le décalage à droite est appliqué. C'est le résultat attendu, car d> 2r signifie qu'il n'y a pas du tout d'intersection.

Arnauld
la source
d*(r*r-d*d)**.5enregistre 3 octets.
Neil
@ceilingcat Merci! L'utilisation with(Math)et le déplacement de la définition de dpermet d' économiser 2 octets supplémentaires.
Arnauld
3

Mathematica 66 57 51 octets

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

A Disk[{x,y},r]désigne la région circonscrite par le cercle centré à {x,y}avec un rayon de r.

RegionIntersection[a,b]renvoie l'intersection des régions a, b. Areaprend la région. IntegerPartarrondit à l'entier le plus proche.

DavidC
la source
Pour mémoire, je n'ai pas vu la soumission d'alephalpha comme je faisais la mienne. C'est une entrée plus courte (donc plus réussie), mais j'ai quand même laissé la mienne.
DavidC
Vous pouvez remplacer IntegerPartpar Floor.
matrix89
@mathe, merci. Si j'utilise les supports de sol dédiés, savez-vous comment je compte les octets?
DavidC
@DavidC chacun a 3 octets, donc la substitution est neutre dans ce cas pour le nombre d'octets. Cependant, ils sont utiles si l'expression aurait besoin d'une parenthèse (-1 octet par rapport à Floor[ ]).
attinat
1

Haskell , 83 octets

(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

Juste la formule, vraiment. Le type doit être déclaré comme Intpour NaN à mapper à 0 avecfloor .

Essayez-le en ligne!

Angs
la source
formule alternative
plafondcat
0

Perl 6 , 56 octets

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

Essayez-le en ligne!

Prend les coordonnées du cercle comme des nombres complexes.

nwellnhof
la source
0

Excel, 119 octets

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

Entrée prise comme 5 variables distinctes:

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

Python 2 , 109 octets

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)

Essayez-le en ligne!

Assez simple. Obtenez la distance entre les cercles et utilisez-le R=2rcomme substituant dans l'équation. d<R andcourt-circuiter si les cercles ne se chevauchent pas.

Sunny Patel
la source
0

Pyth , 63 octets

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

Suite de tests

Prend l'entrée comme un triple composé de deux doubles et d'un nombre.

hakr14
la source
0

T-SQL, 122 octets

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

(saut de ligne pour la lisibilité uniquement).

Utilise la prise en charge de la géométrie spatiale par MS SQL .

Conformément à nos normes d'E / S , SQL peut recevoir des données d'une table préexistante t avec le intchamp r et les varcharchamps a et b contenant des coordonnées au format(x y) .

Mon instruction analyse les coordonnées comme des POINTobjets géométriques développés par le rayon à l'aide de la fonction STBuffer(), puis en prenant laSTIntersection() suivi du STArea().

Si je suis autorisé à saisir les objets géométriques réels dans le tableau à la place, mon code devient presque trivial (48 octets):

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