Tengo 3 pares de coordenadas x, y (A, B, C) que forman dos segmentos de línea conectados.
Quiero calcular el ángulo del segmento de línea en función de un punto aleatorio (coordenadas x, y) que puede caer a ambos lados de los segmentos de línea.
Por ejemplo, si el punto aleatorio fuera D, me gustaría calcular el ángulo verde, o si el punto aleatorio fuera E, me gustaría calcular el ángulo rojo.
Aquí está la firma de la función que estoy buscando para completar:
function angle(segment_1, segment_2, random_point) { }
En su función, podría crear un segmento intermedio entre su punto aleatorio y la base y luego agregar estos 2 ángulos
angle(BA,BE) + angle(BE,BC);
Necesita algunas funciones básicas como el producto escalar y el producto cruzado para lograr esto;
import math from collections import namedtuple Point = namedtuple('Point', 'x y') # define nom of a vector def norm(v): n = math.sqrt(vx*vx + vy*vy) return n # normalise a vector def normedVec(v): n = norm(v) nv = Point(vx/n, vy/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)