/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 1 ĠE no ve a Ġ( fab ien . me ur isse @ en ove a . net ) Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġdil iv ia . s 2 Ċ Ċ import Ġdil iv ia . math . M _ PI Ċ import Ġdil iv ia . math . vectors . times Ċ import Ġdil iv ia . s 2 . S 2 Random . random Double Ċ import Ġdil iv ia . s 2 . S 2 Random . random Frame Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . assertj . core . data . Offset Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sin Ċ Ċ class ĠS 2 Cent roid s UnitTest Ġ{ ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtriangle True Cent roid Small Triangles () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTest ĠTrue Cent roid () Ġwith Ġvery Ġsmall Ġtriangles . Ġ ĠThis Ġtest Ġassumes Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġtriangle Ġis Ġsmall Ġenough Ġso Ġthat Ġit Ġis Ġnearly Ġplan ar . ĊĠĠĠĠĠĠĠ Ġfor Ġ( iter Ġin Ġ 0 Ġuntil Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( p , Ġx , Ġy ) Ġ= Ġrandom Frame () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġ 1 e - 4 Ġ* Ġ 1 e - 4 . pow ( random Double ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 0 Ġ= Ġ( p Ġ- Ġd Ġ* Ġx ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġ( p Ġ+ Ġd Ġ* Ġx ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġ( p Ġ+ Ġ 3 Ġ* Ġd Ġ* Ġy ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcentroid Ġ= ĠS 2 Cent roid s . true Cent roid ( p 0 , Ġp 1 , Ġp 2 ). normalize () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcentroid Ġof Ġa Ġplan ar Ġtriangle Ġis Ġat Ġthe Ġintersection Ġof Ġits ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmedi ans , Ġwhich Ġis Ġtwo - th ir ds Ġof Ġthe Ġway Ġalong Ġeach Ġmedian . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Cent roid Ġ= Ġ( p Ġ+ Ġd Ġ* Ġy ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( centroid . angle ( expected Cent roid )). is LessThan OrEqualTo ( 2 e - 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( centroid . angle ( S 2 Cent roid s . plan ar Cent roid ( p 0 , Ġp 1 , Ġp 2 ). normalize ())). is LessThan OrEqualTo ( 2 e - 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġedge True Cent roid Sem i Equ ator () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġthe Ġcentroid Ġof Ġpoly line ĠABC Ġthat Ġfollows Ġthe Ġequ ator Ġand Ġconsists ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġtwo Ġ 9 0 Ġdegree Ġedges Ġ( i . e ., ĠC Ġ= Ġ- A ). Ġ ĠThe Ġcentroid Ġ( multiplied Ġby ĊĠĠĠĠĠĠĠ Ġ// Ġlength ) Ġshould Ġpoint Ġtoward ĠB Ġand Ġhave Ġa Ġnorm Ġof Ġ 2 . 0 . Ġ Ġ( The Ġcentroid ĊĠĠĠĠĠĠĠ Ġ// Ġitself Ġhas Ġa Ġnorm Ġof Ġ 2 / Pi , Ġand Ġthe Ġtotal Ġedge Ġlength Ġis ĠPi .) ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠS 2 Point ( 0 , Ġ- 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠS 2 Point ( 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠS 2 Point ( 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcentroid Ġ= ĠS 2 Cent roid s . true Cent roid ( a , Ġb ) Ġ+ ĠS 2 Cent roid s . true Cent roid ( b , Ġc ) ĊĠĠĠĠĠĠĠ Ġprintln ( S 2 Cent roid s . true Cent roid ( a , Ġb )) ĊĠĠĠĠĠĠĠ Ġprintln ( S 2 Cent roid s . true Cent roid ( b , Ġc )) ĊĠĠĠĠĠĠĠ ĠassertThat ( S 2 Point Util . approx Equals ( b , Ġcentroid . normalized ())). isTrue () ĊĠĠĠĠĠĠĠ Ġprintln ( centroid ) ĊĠĠĠĠĠĠĠ ĠassertThat ( centroid . norm ()). is Close To ( 2 . 0 , ĠOffset . offset ( 1 e - 1 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġedge True Cent roid Great Circ les () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġrandom Ġgreat Ġcircles Ġand Ġdivide Ġthem Ġrandomly Ġinto Ġsegments . ĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġmake Ġsure Ġthat Ġthe Ġcentroid Ġis Ġapproximately Ġat Ġthe Ġcenter Ġof Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġsphere . Ġ ĠNote Ġthat Ġbecause Ġof Ġthe Ġway Ġthe Ġcentroid Ġis Ġcomputed , Ġit Ġdoes ĊĠĠĠĠĠĠĠ Ġ// Ġnot Ġmatter Ġhow Ġwe Ġsplit Ġthe Ġgreat Ġcircle Ġinto Ġsegments . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġthis Ġis Ġa Ġdirect Ġtest Ġof Ġthe Ġproperties Ġthat Ġthe Ġcentroid ĊĠĠĠĠĠĠĠ Ġ// Ġshould Ġhave , Ġrather Ġthan Ġa Ġtest Ġthat Ġit Ġmatches Ġa Ġparticular Ġformula . ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( iter Ġin Ġ 0 Ġuntil Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcentroid Ġ= ĠS 2 Point () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChoose Ġa Ġcoordinate Ġframe Ġfor Ġthe Ġgreat Ġcircle . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy , Ġ_) Ġ= Ġrandom Frame () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv 0 Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtheta Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( theta Ġ< Ġ 2 Ġ* ĠM _ PI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġcos ( theta ) Ġ* Ġx Ġ+ Ġsin ( theta ) Ġ* Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid Ġ= Ġcentroid Ġ+ ĠS 2 Cent roid s . true Cent roid ( v 0 , Ġv 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 0 Ġ= Ġv 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtheta Ġ+= Ġrandom Double (). pow ( 1 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClose Ġthe Ġcircle . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid Ġ= Ġcentroid Ġ+ ĠS 2 Cent roid s . true Cent roid ( v 0 , Ġx ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( centroid . norm () Ġ<= Ġ 2 e - 1 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ