次の様な計算を何かに使えないかと…
/* https://ja.wikipedia.org/wiki/矢_(幾何学) https://en.wikipedia.org/wiki/Circle#Sagitta 弦 c と 矢 s から 半径 r を求める r = (c*c) / (8*s) + s/2 半径 r と 弦 c から 矢 s を求める s = r - sqrt( r*r - (c/2)*(c/2) ) 半径 r と 矢 s から 弦 c を求める c = sqrt( r*r - (r-s)*(r-s) ) * 2 i_func.hxx https://drive.google.com/file/d/1kHadFbhUi9QfGRovMXKYr2xHgcFJAqdZ/view */ double r_cs (const double c , const double s) { return ( ( c*c ) / ( 8*s ) + s/2 ) ; } double s_rc (const double r , const double c) { return ( r-sqrt(r*r - (c/2)*(c/2) ) ) ; } double c_rs (const double r , const double s) { return ( sqrt(r*r - (r-s)*(r-s) )*2 ) ; }
動作を確認するために 3,4,5 や 5,12,13 は知っていたが次のキーワードで検索.
三平方の定理 整数 組み合わせ
https://ja.wikipedia.org/wiki/ピタゴラスの定理
先ず C++ で書いたもの.
#include <cmath> double r_cs (const double c , const double s) { return ( ( c*c ) / ( 8*s ) + s/2 ) ; } double s_rc (const double r , const double c) { return ( r-sqrt(r*r - (c/2)*(c/2) ) ) ; } double c_rs (const double r , const double s) { return ( sqrt(r*r - (r-s)*(r-s) )*2 ) ; } #include <iostream> int main(void){ std::cout << "6 1 5" << std::endl ; std::cout << r_cs(6,1) << std::endl ; std::cout << s_rc(5,6) << std::endl ; std::cout << c_rs(5,1) << std::endl ; std::cout << std::endl ; std::cout << "8 2 5" << std::endl ; std::cout << r_cs(8,2) << std::endl ; std::cout << s_rc(5,8) << std::endl ; std::cout << c_rs(5,2) << std::endl ; std::cout << std::endl ; return 0 ; }
次の所に貼り付けて動作確認できます.
https://paiza.io/ja/
https://wandbox.org/
https://ideone.com/
次は JavaScript .
function r_cs (c , s) { return ( ( c*c ) / ( 8*s ) + s/2 ) ; } function s_rc (r , c) { return ( r-Math.sqrt(r*r - (c/2)*(c/2) ) ) ; } function c_rs (r , s) { return ( Math.sqrt(r*r - (r-s)*(r-s) )*2 ) ; } console.log ("6 1 5") ; console.log (r_cs(6,1)) ; console.log (s_rc(5,6)) ; console.log (c_rs(5,1)) ; console.log ("") ; console.log ("8 2 5") ; console.log (r_cs(8,2)) ; console.log (s_rc(5,8)) ; console.log (c_rs(5,2)) ; console.log ("") ;
Python .
import math def r_cs (c , s) : return ( ( c*c ) / ( 8.*s ) + s/2. ) def s_rc (r , c) : return ( r-math.sqrt(r*r - (c/2)*(c/2) ) ) def c_rs (r , s) : return ( math.sqrt(r*r - (r-s)*(r-s) )*2 ) print ("6 1 5") print (r_cs(6,1)) print (s_rc(5,6)) print (c_rs(5,1)) print ("") print ("8 2 5") print (r_cs(8,2)) print (s_rc(5,8)) print (c_rs(5,2)) print ("")
2020/05/30
r_cs.py の r_cs で「浮動小数点数」として扱われていなかったので修正.
def r_cs (c , s) : return ( ( c*c ) / ( 8.*s ) + s/2. )