I have a 3 pairs of x, y coordinates (A, B, C) that form two connected line segments.
I want to calculate the angle of the line segment based upon a random point (x, y coordinates) that can fall either side of the line segments.
For example, if the random point was D, I would want to calculate the green angle, or if the random point was E, I would want to calculate the red angle.
Here is the function signature I'm looking to complete:
function angle(segment_1, segment_2, random_point) {
}
In your function, you could create an intermediate segment between your random point and the base and then add these 2 angles
angle(BA,BE) + angle(BE,BC);
You need some basic functions like scalar product and cross product to achieve this ;
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)