自作のCocoa Frameworkを呼び出してatan2の値を計算するAppleScriptです。
2点の緯度経度情報同士の方位(角度)を計算するatan2は、位置情報計算において割と重要な関数ですが、AppleScriptの標準状態では利用できません。
Satimage SoftwareのSatimage OSAX(フリー)をインストールすることでAppleScript中から利用できるようになりますが、これだけだといまひとつ不安なので、atan2を呼び出すだけの簡単なCocoa FrameworkをObjective-Cで記述して、呼び出してみました。
trigonometry.framework (To ~/Library/Frameworks)
Cocoa FrameworkとAppleScriptの間ではNSNumberでやりとりしますが、atan2の計算をObjective-C内で行うにはCGFloatで値を渡す必要がありました(maybe)。また、atan2の計算後に結果をCGFloatからNSNumberに変換。この計算結果をAppleScriptで受け取っています。
一応、両方の計算結果を付けあわせて0〜180度、0〜-180度の範囲で検算を行なったところ、同じ結果が得られました。
atan2の計算速度について、Satimage OSAXとFramework呼び出しで比較してみたところ(1万回ループで計測)、
Satimage OSAX:0.0000224 sec
Cocoa Framework:0.0000649 sec
と、OSAXよりもFramework呼び出しのほうが3倍時間がかかることがわかりました。ただし、1回あたりの所要時間がごくごく短いので、あまり問題にならないレベルでしょう。
Numbers.appの内部で利用している関数ライブラリ「cephes math library」をCocoa FrameworkにWrappingした「ObjectiveCephes」が存在しているものの、同ライブラリがCのライブラリであるためか、入出力をNSNumberで行うことができない仕様になっていました(処理速度を確保するため???)。このatan2の計算フレームワークと同様にパラメータをcastするようにすれば、cephes math libraryに含まれる各関数をAppleScriptから利用できることになるはずです。
AppleScript名:atan2をFramework呼び出しで計算する |
— Created 2018-05-07 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "trigonometry" –By myself
set aNum to 10 set bNum to 20 set aList to {aNum, bNum} set cNum to atan2 aList –SatImage OSAX –> 0.463647609001
set dNum to (current application’s calcAtan2’s atan2Num:aNum withNum:bNum) as real –> 0.463647609001
|
★Click Here to Open This Script
|
AppleScript名:atan2をFramework呼び出しで計算する(検算) |
— Created 2018-05-07 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "trigonometry" –By myself
set aNum to 0 set notMatchList to {}
repeat with bNum from 0 to 180 set aList to {aNum, bNum} set cNum to atan2 aList –SatImage OSAX set dNum to (current application’s calcAtan2’s atan2Num:aNum withNum:bNum) as real if cNum is not equal to dNum then set the end of notMatchList to {cNum, dNum} end if end repeat
repeat with bNum from 0 to -180 by -1 set aList to {aNum, bNum} set cNum to atan2 aList –SatImage OSAX set dNum to (current application’s calcAtan2’s atan2Num:aNum withNum:bNum) as real if cNum is not equal to dNum then set the end of notMatchList to {cNum, dNum} end if end repeat
return notMatchList |
★Click Here to Open This Script
|