Площа перетину кола


14

Опис:

Дано xта yположення двох кіл разом із їхніми radii, виведіть площу перетину двох кіл.


Вхід:

Вам буде надано наступне введення:

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

Метод введення :

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

Вихід:

  • Невід’ємне ціле число (без десятків), рівне площі перетину двох кіл.

  • Рядок, рівний вищезгаданому цілому числу.

Примітка :

  • Вихід повинен бути> = 0, оскільки площа не може бути негативною.
  • У випадку десяткового округлення до найближчого цілого числа

Приклади:

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

Критерії виграшу:

Це тому найкоротший код у байтах для кожної мови виграє.


Пропозиції:

  • Надайте посилання TIO, щоб його можна було протестувати.
  • Надайте пояснення, щоб інші могли зрозуміти ваш код

Це лише пропозиції та не є обов'язковими.


4
Равіолі, равіолі ...
FrownyFrog

2
@FrownyFrog: Вибачте? Мені невідомо про що ти говориш? nvm перевірка в Інтернеті, і я шкодую, що повідомляю, що є частиною проблеми. дивіться тег із математикою та геометрією. Це гарний привід підбадьорити свою математику. Що ти думаєш. Але якщо ви не згодні, я думаю, що я оновлю питання і додаю формулу.
Мухаммад Салман

@MuhammadSalman Змінити answer must be positiveна answer must be >= 0- Якщо кола не перетинаються (як у прикладах 4, 7, 10), то правильна відповідь - 0, остання перевірена я не є позитивною.
manassehkatz-Moving 2 Кодидакт

@manassehkatz: Добре, звичайно. Зроблено
Мухаммад Салман

Відповіді:


3

Желе ,  27 25 24  22 байт

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

Повна програма, що приймає список двох центрів як складні координати, і радіус, який друкує результат (як діадичне посилання повертає список довжиною 1).

Спробуйте в Інтернеті!

Щоб прийняти дві координати як пари, додайте Uḅıдо основного посилання, як це .

Як?

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

тільки цифри І що це [-7 + 13j, -25 + -5j]? Я не маю такого прикладу. Можливо, вам доведеться пояснити, що ви зробили?
Мухаммад Салман

Я вже пояснив це у відповіді ... це координати на складній площині ... Я можу зробити [[x1,y1],[x2,y2]]це, але це коштує 3 байти. (Зауважте також, що -7+13j це число :)) - [-7+13j,-25+-5j]відповідає прикладу, який повертається 132,[-7, 13], [-25, -5], 17
Джонатан Аллан

Я не знаю Джелі, тому я програю на цьому. Також я надіслав повідомлення перед поясненням. Але так, впевнений, що це працює (я думаю?)
Мухаммад Салман

Це не має нічого спільного з Jelly per se, це лише математика. Точка в 2-просторі - це те саме, що і комплексне число .
Джонатан Аллан

Не те, що я мав на увазі. Звичайні мови я зміг би прочитати і розповісти, що відбувається. Желе та інші подібні мови - це біль для читання.
Мухаммад Салман

3

JavaScript (ES6), 72 байти

Альтернативна формула, запропонована @ceilingcat

Приймає вхід як 5 різних параметрів (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

Спробуйте в Інтернеті!


JavaScript (ES7), 81 80 77 байт

Збережено 3 байти завдяки @Neil

Приймає вхід як 5 різних параметрів (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

Спробуйте в Інтернеті!

Як?

Це засновано на загальній формулі MathWorld для неконгруентних кіл:

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 - відстань між двома центрами, а r і R - радіусами.

З R = r це спрощується до:

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

І при r '= 2r :

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

Примітка : Якщо d більше 2r , Math.acos()повернеться NaN, що примусово до 0, коли застосовано правий зсув. Це очікуваний результат, оскільки d> 2r означає, що перехрестя взагалі немає.


d*(r*r-d*d)**.5економить 3 байти.
Ніл

@ceilingcat Дякую! Використання with(Math)та переміщення визначення dзберігає ще 2 байти.
Арнольд

3

Mathematica 66 57 51 байт

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

A Disk[{x,y},r]позначає область, обписану колом, центром якого {x,y}є радіус r.

RegionIntersection[a,b]повертає перетин областей a, b. Areaзаймає площу. IntegerPartокругляється до найближчого цілого числа.


Для запису я не бачив подання алефальфи, коли я робив своє. Його коротший (отже, більш вдалий) запис, але я все-таки залишив свою.
DavidC

Ви можете замінити IntegerPartна Floor.
matrix89

@mathe, спасибі Якщо я використовую спеціальні кронштейни для підлоги, чи знаєте ви, як я повинен рахувати байти?
DavidC

@DavidC кожен має 3 байти, тому підміна в цьому випадку є нейтральною для кількості байтів. Вони корисні, якщо вираз інакше потребуватиме дублювання, хоча (-1 байт порівняно з Floor[ ]).
attinat






0

Excel, 119 байт

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

Введення взято як 5 окремих змінних:

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

0

Python 2 , 109 байт

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)

Спробуйте в Інтернеті!

Досить прямо. Отримайте відстань між колами та використовуйте R=2rяк замінник у рівнянні. d<R andдо короткого замикання, якщо кола не перетинаються.



0

T-SQL, 122 байти

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

(розрив рядка лише для читабельності).

Використовує підтримку просторової геометрії MS SQL .

Відповідно до наших стандартів IO , SQL може приймати дані з попередньо існуючої таблиці t з intполями r і varcharполями a і b, що містять координати у форматі (x y).

Мій вислів аналізує координати у вигляді POINTоб'єктів геометрії, розширених радіусом за допомогою функції STBuffer(), а потім приймаючи наступні STIntersection()знаки STArea().

Якщо мені дозволено вводити фактичні об’єкти геометрії в таблицю замість цього, мій код стає майже тривіальним (48 байт):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.