興味があろうがなかろうが。

なるべく役に立つ、とがった内容を記していきたいと思います。

【FreeCADプログラミング】内積で2つのベクトルがなす角度を取得

本日のお題は『内積で2つのベクトルがなす角度を取得』です。

これまでは内積を平行・直交といった方向の判定に使ってきました。しかし、内積の使い方はそれだけではありません。

今回はもう1つの使い方を勉強していきたいと思います。

1. 環境

  • FreeCAD 0.18

2. 内積による角度取得の方法

内積算出には以下のような公式があります。この式を変形することで、角度を計算していきます。

f:id:appli-get:20191010142132j:plain

内積の公式

左辺にcosθだけをまとめると、以下のようになります。それぞれの計算はこれまでの記事でやってきたことですので算出できます。

f:id:appli-get:20191010142231j:plain

公式にプログラムを当てはめる

最後にこの値をPythonのacosメソッドに入れると、角度が算出されます。
(この角度はラジアンで出てきますので、必要に応じて度数に変換します。)

3. プログラムを書いてみよう

# -*- coding: utf-8 -*-

import FreeCAD
import math

#ベクトルの大きさを求めるメソッド
def Magnitude(vector):
    return math.sqrt((vector.x ** 2+ (vector.y ** 2+ (vector.z ** 2))

vector1 = FreeCAD.Vector(1,0,0)
vector2 = FreeCAD.Vector(0,1,0)

#分母側の計算
mag1 = Magnitude(vector1)
mag2 = Magnitude(vector2)
magProduct = mag1 * mag2

#分子側の計算
dotProduct = vector1.dot(vector2)

cosTheta = dotProduct / magProduct
radian = math.acos(cosTheta)        #ラジアン
angle = radian * 180.0 / math.pi    #度数

FreeCAD.Console.PrintMessage(str(angle))

 

90.0

X軸方向とY軸方向のなす角度ですから90.0°が算出されました。合っていますね。

4. 補足

4.1. 内積で算出される角度のクセ

内積の角度計算には1つクセがあります

それは『0~180°までの角度が必ず算出される』ことです。

例えば上記のソースコードでは90°が算出されましたが、内積の計算でこれを意図的に270°が算出されるように細工することはできません。
(算出した後に360°から引き算をすれば別ですが)

状況によっては、このクセが便利なときもありますし、不便なときもあります

4.2. Vector APIにgetAngleというメソッドがある

実はVector APIに角度を計算する『getAngle』というメソッドがあります。

今回このメソッドを使っても良かったのですが、中でどういう算出方法がなされているのか説明から判断できなかったため、自作しました。
(GitHubを調べれば、中身の詳細が分かるかもしれませんので、今度調べてみます)

ブラックボックスで値を入れて確認してみた感じでは、今回自作したメソッドと同様、内積計算を行っているっぽいです。

5. まとめ

  • 2つのベクトルから角度を求める際は、内積を用いる
  • 内積で算出される角度は必ず0~180°に収まる
  • 0~180°以内に収まる利点もある

6. 最後に

内積の使い方についてはこれで『平行・直交判定』、『角度の算出』の2種類の技を会得したことになります。

私もまだまだ相当な未熟者ですが、このブログを通じて、パワーアップを図ります。

更なる情報をお探しの方は!

下記のリンクから、FreeCADプログラミングのトップページに飛びます。

よろしければご参照くださいませ。

www.interested-or-not.com