圆交集区


14

说明:

给定xy两个圆的位置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在Internet上检查,很抱歉报告这是问题的一部分。请参阅标有数学和几何的标签。精读数学是一个很好的借口。你怎么看。但是,如果您不同意,我想我将更新问题并添加公式。
穆罕默德·萨勒曼

@MuhammadSalman更改answer must be positiveanswer must be >= 0-如果圆不相交(如示例4、7、10 中所示),则正确答案为0,我最后检查的结果不是肯定的。
manassehkatz-Moving 2 Codidact'Apr

@manassehkatz:好的,当然。完成
穆罕默德·萨尔曼

Answers:


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
Jonathan Allan '18

我不认识果冻,所以我迷失了。另外,我在解释之前已发送了消息。但是,是的,确定能奏效(我猜吗?)
穆罕默德·萨尔曼

这与果冻本身无关,只是数学。2空间中的点与复数相同。
乔纳森·艾伦'18

不是我的意思 普通语言,我将能够阅读并判断正在发生的事情。果冻和其他类似语言很难阅读。
穆罕默德·萨勒曼

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字节

@Neil节省了3个字节

将输入作为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是两个中心之间的距离,rR是半径。

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大于2rMath.acos()将返回NaN,应用右移时将其强制为0。这是预期的结果,因为d> 2r表示根本没有交集。


d*(r*r-d*d)**.5节省3个字节。
尼尔,

@ceilingcat谢谢!使用with(Math)和移动的定义d可以节省2个字节。
Arnauld

3

Mathematica 66 57 51字节

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

A Disk[{x,y},r]是指以{x,y}半径为r

RegionIntersection[a,b]返回区域的交叉abArea占据该区域。 IntegerPart舍入到最接近的整数。


作为记录,我没有像自己一样看到alephalpha的提交。他的入场时间较短(因此更为成功),但无论如何我还是离开了我。
DavidC

您可以替换IntegerPartFloor
基质89:05

@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对空间几何的支持

根据我们的IO标准,SQL可以从预先存在的表t中获取输入,表t具有int字段r以及包含坐标格式的varchar字段 ab(x y)

我的陈述将座标解析为 POINT使用函数以半径扩展的几何对象STBuffer(),然后采用STIntersection()后跟STArea()

如果允许我在表中输入实际的几何对象,那么我的代码几乎变得微不足道了(48个字节):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.