まず、楕円をいくつかに分割して、原点から楕円上の点までのベクトルを考え
てみる。楕円上の i番目の点までのベクトルを v[i]とすると、i+1番目の点ま
でのベクトルは v[i+1]。i番目から i+1番目までのベクトル sは v[i+1]-v[i]
で表される。
楕円弧の長さは始角から終角の間の s の長さを求めて足してやればよい。
まず、楕円を 1°ずつ分割する場合を考えてみる。
#! ruby
include Math
require 'matrix'
v=(30..120).collect{|e|
Vector[50*cos(e*PI/180),
50*0.5*sin(e*PI/180)]}
s=(0..v.size-2).collect{|i| v[i+1]-v[i]}
p s.inject(0){|t,a| t+a.r} #>71.223904585379
もうちょっと正確にしたいので 0.1°ずつ分割してみる。
#! ruby
include Math
require 'matrix'
deg,v=30.0,[]
while deg<120.0
v<<Vector[50*cos(deg*PI/180),50*0.5*sin(deg*PI/180)]
deg+=0.1 #0.1°ずつ分割
end
v<<Vector[50*cos(120.0*PI/180),50*0.5*sin(120.0*PI/180)]
s=(0..v.size-2).collect{|i| v[i+1]-v[i]}
p s.inject(0){|t,a| t+a.r} #> 71.2242647014212
ちなみに
1° ずつ分割した場合 71.223904585379 0.1° ずつ分割した場合 71.2242647014212 0.01° ずつ分割した場合 71.2242683027258 0.001° ずつ分割した場合 71.2242683387392 0.0001° ずつ分割した場合 71.2242683390996 Rhinoceros で求めた長さは 71.2242683476329ということで、
ついでに jww の外部変形にしてみる。
=== 楕円弧長さ.BAT (ここから) ===
@REM 楕円弧の長さを求める
@echo off
REM #jww
REM #cd
REM #g1
REM #1ci 楕円(弧)を選択
REM #e
copy jwc_temp.txt jwc_temp.bak
ruby -Ks -x %~f0
EXIT
# 0.1°ずつ分割
# 小数点以下 3桁まで求める。
#! ruby -Ks
include Math
require 'matrix'
$stderr=open("error.log","w")
$stdout=open("jwc_temp.txt","w")
ci=open("jwc_temp.bak").grep(/^ci/)[0].
split[1..-1].collect{|e| e.to_f}
ci[3..5]=[0.0,360.0,1.0] if ci.size==3
a,d1,d2,h=ci[2..5]
#p ci
deg,v=d1,[]
while deg<d2
v<<Vector[a*cos(deg*PI/180),a*h*sin(deg*PI/180)]
deg+=0.1
end
v<<Vector[a*cos(d2*PI/180),a*h*sin(d2*PI/180)]
s=(0..v.size-2).collect{|i| v[i+1]-v[i]}
l=s.inject(0){|t,a| t+a.r}
# puts "h# 楕円弧の長さは #{l}"
puts "h# 楕円弧の長さは #{(l*1000).round*0.001}"
=== 楕円弧長さ.BAT (ここまで) ===
| 戻る |