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.


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

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.


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.


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

JavaScript (Node.js) , 69 octets

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

Essayez-le en ligne!

Bref, je ne sais pas s'il peut être joué plus loin. Toutes les suggestions sont les bienvenues



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

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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.