楕円弧の長さを求める


問題:長径100、偏平率0.5、始角30°、終角120°の楕円弧の長さを求めなさい。

まず、楕円をいくつかに分割して、原点から楕円上の点までのベクトルを考え
てみる。楕円上の 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
ということで、

答え:71.224

ついでに 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 (ここまで) ===

戻る