繁体   English   中英

根据随机点求两条相连线段的角度

[英]Find the angle of two connected line segments based upon a random point

我有 3 对 x、y 坐标(A、B、C),它们形成两个连接的线段。

在此处输入图片说明

我想根据可以落在线段任一侧的随机点(x,y 坐标)计算线段的角度。

例如,如果随机点是 D,我想计算绿色角度,或者如果随机点是 E,我想计算红色角度。

这是我要完成的函数签名:

function angle(segment_1, segment_2, random_point) {

}

在你的函数中,你可以在你的随机点和基地之间创建一个中间段,然后添加这两个角度

angle(BA,BE) + angle(BE,BC);

您需要一些基本功能,如标量积和叉积来实现这一点;

import math
from collections import namedtuple
Point = namedtuple('Point', 'x y')

# define nom of a vector
def norm(v):
    n = math.sqrt(v.x*v.x + v.y*v.y)
    return n

# normalise a vector
def normedVec(v):
    n = norm(v)
    nv = Point(v.x/n, v.y/n)
    return nv

# print angle in degrees
def printAngle(name,rad):
    deg = rad * 180.0 / math.pi
    print("{}={}".format(name,deg))

# scalar (aka dot)product of 2 vectors 
def dotProduct(v1,v2):
    d = v1.x*v2.x +  v1.y*v2.y
    print("dot={}".format(d))
    return d

# vectorial (aka cross) product
def crossProd(v1,v2):
    c = v1.x*v2.y - v1.y*v2.x
    print("c={}".format(c))
    return c

# compute angle between 2 vectoris
def angle(s1,s2):
    n1 = normedVec(s1)
    n2 = normedVec(s2)
    cosAngle = dotProduct(n1,n2)
    d = crossProd(n1,n2)
    angle = math.acos(cosAngle)
    if d <= 0:
        angle = - angle
    printAngle("angle",angle)
    return angle

# compute angle between 2 vectors using point orientation 
def angleOriented(AB,AC,AX):
    # Compute angle between 2 vectors
    ABC = angle(AB, AC)
    # Compute angle to random point
    ABX = angle(AB, AX)
    # if angle is negative then change angle sign 
    if ABX < 0:
        ABC = - ABC
    # put angle between 0 and 360
    while ABC < 0:
        ABC += 2*math.pi
    printAngle("Oriented",ABC)

# test
AB = Point(1,0)
AC = Point(-1,1)
AD = Point(0,-1)
AE = Point(0,1)

ABE = angleOriented(AB,AC,AE)
print("-----")
ABD = angleOriented(AB,AC,AD)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM