SlideShare une entreprise Scribd logo
1  sur  12
Télécharger pour lire hors ligne
円と円の交点の求め方
@shora_kujira16
• ICPCのライブラリを整備していたら

「円と円の交点」のコードがよく分からなかったの
で解説します。
• 参考にしたコードはコレです
問題のコード
pair<P, P> cc_cross(const C& c1, const C& c2) {
double d = abs(c1.p - c2.p);
double rc = (d*d + c1.r*c1.r - c2.r*c2.r) / (2*d);
double rs = sqrt(c1.r*c1.r - rc*rc);
P diff = (c2.p - c1.p) / d;
return make_pair(c1.p + diff * P(rc, rs),
c1.p + diff * P(rc, -rs));
}
double d = abs(c1.p - c2.p);
d
c1.p
c2.p
double rc =

(d*d + c1.r*c1.r - c2.r*c2.r) / (2*d);
cos = a2
+b2
c2
2ab
余弦定理
b
c
aθ
double rc =

(d*d + c1.r*c1.r - c2.r*c2.r) / (2*d);
b
bcosθ
θ
cos =
a2
+ b2
c2
2ab
b cos =
a2
+ b2
c2
2a
double rs = sqrt(c1.r*c1.r - rc*rc);
c1.r
rc
rs
P diff = (c2.p - c1.p) / d;



=> diffは c1.p→c2.p の単位ベクトル
d
c1.p
c2.p
c1.p + diff * P(rc, rs)

長くなるので次のページヘ
rc
rs
c1.p
diff * P(rc, rs) とは?

=> rc*diff + rs*rot90(diff) のこと
di = (x + jy)
rot90(di ) = rot90(x + jy)
= y + jx
di P(rc, rs) = (x + jy) · (rc + jrs)
= rc(x + jy) + rs( y + jx)
= rcdi + rsrot90(di )
c1.p + diff * P(rc, -rs)

先ほどと同様
rc
rs
c1.p
感想
• 余弦定理便利なんだけど、よく忘れる
• jを掛けて90 回転させるテクニックに気づくのに時
間がかかってしまった(電気系なら日常的に使って
いるはずなのに)

Contenu connexe

Tendances

Code Contracts in .NET 4
Code Contracts in .NET 4Code Contracts in .NET 4
Code Contracts in .NET 4
信之 岩永
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
Takayuki Shimizukawa
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
 

Tendances (20)

QoS for ROS 2 Dashing/Eloquent
QoS for ROS 2 Dashing/EloquentQoS for ROS 2 Dashing/Eloquent
QoS for ROS 2 Dashing/Eloquent
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
 
llvm入門
llvm入門llvm入門
llvm入門
 
iostatの見方
iostatの見方iostatの見方
iostatの見方
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
Code Contracts in .NET 4
Code Contracts in .NET 4Code Contracts in .NET 4
Code Contracts in .NET 4
 
乱数と擬似乱数の生成技術
乱数と擬似乱数の生成技術乱数と擬似乱数の生成技術
乱数と擬似乱数の生成技術
 
xFlow分析の基礎と実例
xFlow分析の基礎と実例xFlow分析の基礎と実例
xFlow分析の基礎と実例
 
ガード節を使おう
ガード節を使おうガード節を使おう
ガード節を使おう
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門 いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門
 
Jupyter notebook を用いた文芸的インフラ運用のススメ
Jupyter notebook を用いた文芸的インフラ運用のススメJupyter notebook を用いた文芸的インフラ運用のススメ
Jupyter notebook を用いた文芸的インフラ運用のススメ
 
モナドをつくろう
モナドをつくろうモナドをつくろう
モナドをつくろう
 
もしSIerのエンジニアがSRE本を読んだら
もしSIerのエンジニアがSRE本を読んだらもしSIerのエンジニアがSRE本を読んだら
もしSIerのエンジニアがSRE本を読んだら
 
自作GPUへの道
自作GPUへの道自作GPUへの道
自作GPUへの道
 
並行実行制御の最適化手法
並行実行制御の最適化手法並行実行制御の最適化手法
並行実行制御の最適化手法
 
The only one big thing every programmer should know
The only one big thing every programmer should knowThe only one big thing every programmer should know
The only one big thing every programmer should know
 
IETF111 RATS: Remote Attestation ProcedureS 報告
IETF111 RATS: Remote Attestation ProcedureS 報告IETF111 RATS: Remote Attestation ProcedureS 報告
IETF111 RATS: Remote Attestation ProcedureS 報告
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
 

Plus de Sho IIZUKA (6)

HDDの返品保証を使ってみた
HDDの返品保証を使ってみたHDDの返品保証を使ってみた
HDDの返品保証を使ってみた
 
FM-indexによる全文検索
FM-indexによる全文検索FM-indexによる全文検索
FM-indexによる全文検索
 
円と円の外接線の求め方
円と円の外接線の求め方円と円の外接線の求め方
円と円の外接線の求め方
 
About Pointer
About PointerAbout Pointer
About Pointer
 
勝手に解説 TopCoder Marathon Match 82 ColorLinker
勝手に解説 TopCoder Marathon Match 82 ColorLinker勝手に解説 TopCoder Marathon Match 82 ColorLinker
勝手に解説 TopCoder Marathon Match 82 ColorLinker
 
grepについて
grepについてgrepについて
grepについて
 

円と円の交点の求め方