自作の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 |
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 |
ぴよまるソフトウェアが選ぶ、2018年に書いた「価値あるScript」 – AppleScriptの穴 says:
[…] ・atan2をFramework呼び出しで計算する これは、1つの緯度/経度情報をもとに他の座標がどの方角に存在するかを計算するために必要なものです。 […]