Круг пересечения области


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 Codidact

@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]&

А 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




1

JavaScript (Node.js) , 69 байт

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

Попробуйте онлайн!

Короче не уверен, можно ли дальше играть в гольф. Любые предложения приветствуются



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

Pyth , 63 байта

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

Тестирование

Принимает ввод в виде тройки, состоящей из двух двойных чисел и числа.


0

T-SQL, 122 байта

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

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

Использует поддержку MS SQL пространственной геометрии .

В соответствии с нашими стандартами ввода-вывода , 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.