Area persimpangan lingkaran

14

Deskripsi:

Diberikan xdan yposisi dua lingkaran bersama dengan mereka radii, output area persimpangan dua lingkaran.


Memasukkan :

Anda akan diberikan input berikut:

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

Metode input:

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

Keluaran:

  • Integer non-negatif (tidak ada desimal) sama dengan luas persimpangan dua lingkaran.

  • Sebuah string sama dengan bilangan bulat yang disebutkan di atas.

Catatan :

  • Output harus> = 0, karena area tidak boleh negatif.
  • Dalam kasus pembulatan desimal ke bilangan bulat terdekat

Contoh:

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

Kriteria pemenang:

Ini adalah sehingga kode terpendek dalam byte untuk setiap bahasa menang.


Saran :

  • Berikan tautan TIO sehingga dapat diuji.
  • Berikan penjelasan agar orang lain dapat memahami kode Anda

Ini hanya saran dan tidak wajib.

Muhammad Salman
sumber
4
Ravioli, ravioli ...
FrownyFrog
2
@FrownyFrog: Permisi? Saya tidak tahu apa yang Anda bicarakan? nvm periksa di internet dan saya minta maaf untuk melaporkan bahwa itu adalah bagian dari masalah. lihat tag yang mengatakan matematika dan geometri. Ini adalah alasan yang bagus untuk memoles matematika Anda. Bagaimana menurut anda. Tetapi jika Anda tidak setuju saya pikir saya akan memperbarui pertanyaan dan menambahkan formula.
Muhammad Salman
@MuhammadSalman Ubah answer must be positiveke answer must be >= 0- Jika lingkaran tidak berpotongan (seperti pada contoh 4, 7, 10) maka jawaban yang benar adalah 0, yang terakhir saya periksa tidak positif.
manassehkatz-Moving 2 Codidact
@manassehkatz: Ok, tentu. Selesai
Muhammad Salman

Jawaban:

3

Jelly ,  27 25 24  22 byte

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

Program lengkap yang menerima daftar dua pusat sebagai koordinat kompleks dan jari-jari yang mencetak hasilnya (sebagai tautan diadik, ia mengembalikan daftar panjang 1).

Cobalah online!

Untuk mengambil dua koordinat sebagai pasangan tambahkan Uḅıke tautan utama, seperti ini .

Bagaimana?

×,²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
sumber
hanya angka-angka. Dan apa itu [-7 + 13j, -25 + -5j]? Saya tidak punya contoh itu. Anda mungkin harus menjelaskan apa yang Anda lakukan?
Muhammad Salman
Saya menjelaskannya dalam jawaban sudah ... mereka berkoordinasi pada bidang yang kompleks ... Saya bisa melakukan [[x1,y1],[x2,y2]]tetapi biaya 3 byte. (Perhatikan juga itu -7+13j adalah angka :)) - [-7+13j,-25+-5j]sesuai dengan contoh yang kembali 132,[-7, 13], [-25, -5], 17
Jonathan Allan
Saya tidak tahu Jelly jadi saya bingung tentang itu. Saya juga mengirim pesan sebelum penjelasan. Tapi ya, tentu ini berhasil (saya kira?)
Muhammad Salman
Ini tidak ada hubungannya dengan Jelly, itu hanya matematika. Titik dalam 2-ruang sama dengan bilangan kompleks .
Jonathan Allan
Bukan itu yang saya maksud. Bahasa-bahasa normal saya akan bisa membaca dan menceritakan apa yang sedang terjadi. Jelly dan bahasa-bahasa lain semacam itu sulit dibaca.
Muhammad Salman
3

JavaScript (ES6), 72 byte

Formula alternatif disarankan oleh @ceilingcat

Mengambil input sebagai 5 parameter berbeda (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

Cobalah online!


JavaScript (ES7), 81 80 77 byte

Disimpan 3 byte berkat @Neil

Mengambil input sebagai 5 parameter berbeda (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

Cobalah online!

Bagaimana?

Ini didasarkan pada formula umum dari MathWorld untuk lingkaran yang tidak kongruen:

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

di mana d adalah jarak antara dua pusat dan r dan R adalah jari-jari.

Dengan R = r , ini disederhanakan menjadi:

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

Dan dengan r '= 2r :

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

Catatan : Jika d lebih besar dari 2r , Math.acos()akan kembali NaN, yang dipaksakan ke 0 ketika shift kanan diterapkan. Ini adalah hasil yang diharapkan, karena d> 2r berarti tidak ada persimpangan sama sekali.

Arnauld
sumber
d*(r*r-d*d)**.5menghemat 3 byte.
Neil
@ceilingcat Terima kasih! Menggunakan with(Math)dan memindahkan definisi dmenyimpan 2 byte lebih banyak.
Arnauld
3

Mathematica 66 57 51 byte

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

A Disk[{x,y},r]mengacu pada wilayah yang dibatasi oleh lingkaran yang dipusatkan {x,y}dengan jari-jari r.

RegionIntersection[a,b]mengembalikan persimpangan daerah a, b. Areamengambil area. IntegerPartmembulatkan ke bilangan bulat terdekat.

DavidC
sumber
Sebagai catatan, saya tidak melihat penyerahan alephalpha seperti yang saya lakukan sendiri. Entrinya lebih pendek (karena itu lebih sukses), tetapi saya tetap punya entri saya.
DavidC
Anda bisa menggantinya IntegerPartdengan Floor.
matrix89
@mathe, Trims. Jika saya menggunakan tanda kurung Floor khusus, apakah Anda tahu bagaimana saya menghitung byte?
DavidC
@ DavidvidC masing-masing adalah 3 byte, sehingga substitusi netral dalam hal ini untuk jumlah byte. Mereka berguna jika ekspresi sebaliknya membutuhkan tanda kurung (-1 byte dibandingkan dengan Floor[ ]).
attinat
1

Haskell , 83 byte

(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

Hanya formula, sungguh. Ketik harus dinyatakan sebagai Intuntuk NaN untuk memetakan ke 0 dengan floor.

Cobalah online!

Angs
sumber
formula alternatif
ceilingcat
1

JavaScript (Node.js) , 69 byte

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

Cobalah online!

Pendek tidak yakin apakah bisa bermain golf lebih jauh. Setiap saran dipersilahkan


sumber
0

Perl 6 , 56 byte

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

Cobalah online!

Mengambil koordinat lingkaran sebagai bilangan kompleks.

nwellnhof
sumber
0

Excel, 119 byte

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

Input diambil sebagai 5 variabel terpisah:

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

Python 2 , 109 byte

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)

Cobalah online!

Cukup mudah. Dapatkan jarak antar lingkaran, dan gunakan R=2rsebagai substituit dalam persamaan. d<R anduntuk korsleting jika lingkaran tidak tumpang tindih.

Sunny Patel
sumber
0

Pyth , 63 byte

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

Suite uji

Mengambil input sebagai rangkap tiga yang terdiri dari dua ganda dan satu angka.

hakr14
sumber
0

T-SQL, 122 byte

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

(line break hanya untuk keterbacaan).

Menggunakan dukungan MS SQL untuk geometri spasial .

Sesuai standar IO kami , SQL dapat mengambil input dari tabel t yang sudah ada dengan intbidang r dan varcharbidang a dan b yang berisi koordinat dalam format(x y) .

Pernyataan saya mem-parsing koordinat sebagai POINTobjek geometri diperluas oleh jari-jari menggunakan fungsi STBuffer(), kemudian mengambil yang STIntersection()diikuti olehSTArea() .

Jika saya diizinkan untuk memasukkan objek geometri yang sebenarnya dalam tabel sebagai gantinya, maka kode saya menjadi hampir sepele (48 byte):

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