9

Pythonで2本の線の間の角度を計算しようとしています。私はインターネットを検索し、それを行う方法の方程式を見つけました。しかし、常に正確な結果が得られるとは限りません。一部の結果は明らかに誤りであり、他の結果は正しいと思われます。私のコードは以下のとおりです。

def angle(pt1,pt2):
    m1 = (pt1.getY() - pt1.getY())/1
    m2 = (pt2.getY() - pt1.getY())/(pt2.getX()-pt1.getX())

    tnAngle = (m1-m2)/(1+(m1*m2))
    return math.atan(tnAngle)

def calculate(pt,ls):
    i=2
    for x in ls:
        pt2 = point(x,i)
        i=i+1
        ang = angle(pt,pt2)*180/math.pi
        ang = ang * (-1)
        print ang


pt = point(3,1)
ls = [1,7,0,4,9,6,150]

calculate(pt,ls)

それが生成する結果は次のとおりです。

45.0
0.0
45.0
-75.9637565321
0.0
-63.4349488229
0.0

問題は、2 番目の結果、5 番目、および最後の結果が 1 つの点を共有しているため交差し、配列内の値が異なるため他の点が重複していない理由が理解できないことです。

4

3 に答える 3

20

次の場合、角度の式は失敗します

pt2.getX() == pt1.getX()

(つまり、pt1とpt2が垂直線上にある場合)ゼロで除算できないためです。(m2、勾配は無限大になります。)

また

m1 = (pt1.getY() - pt1.getY())/1

常にゼロになります。したがって、少なくとも、数式を斜面のアークタンに簡略化することができます。ただし、数式がすべての可能なポイントで機能するわけではないので、私は気にしません。

代わりに、2つのベクトル(有向線分)間の角度を計算するためのより堅牢な方法(実際には標準的な方法)は、内積式を使用することです。

ここに画像の説明を入力してください

ここでa = (x1, y1)、、、はb = (x2, y2)、に<a,b>等しくx1*x2 + y1*y2||a||はベクトルの長さa、つまりsqrt(x1**2 + y1**2)


import math

def angle(vector1, vector2):
    x1, y1 = vector1
    x2, y2 = vector2
    inner_product = x1*x2 + y1*y2
    len1 = math.hypot(x1, y1)
    len2 = math.hypot(x2, y2)
    return math.acos(inner_product/(len1*len2))

def calculate(pt, ls):
    i = 2
    for x in ls:
        pt2 = (x, i)
        i += 1
        ang = math.degrees(angle(pt, pt2))
        ang = ang * (-1)
        print(ang)

pt = (3, 1)
ls = [1,7,0,4,9,6,150]

calculate(pt, ls)
于 2012-11-05T04:56:23.823 に答える
6

Python2を使用しているようです/。両方の引数がintの場合、整数除算が実行されます。Python3の動作を取得するには、これをファイルの先頭に配置します。

from __future__ import division
于 2012-11-05T04:55:55.730 に答える