перемещение стрелки по всему телу - PullRequest
0 голосов
/ 13 сентября 2018

Я создал следующую функцию, которая получает две точки линии и выводит три точки треугольника со стрелкой.Что мне нужно добавить, так это длину, согласно которой стрелка будет перемещена в сторону от точки B по линии AB.Чтобы объяснить это лучше, мне бы хотелось, чтобы это было так: A -----> - B, где две черты равны длине

def create_arrowhead(A, B):
    """
    Calculate the arrowheads vertex positions according to the edge direction.

    Parameters
    ----------
    A : array
    x,y Starting point of edge
    B : array
    x,y Ending point of edge

    Returns
    -------
    B, v1, v2 : tuple
    The point of head, the v1 xy and v2 xy points of the two base vertices of the arrowhead.
    """
    w = 0.005 # half width of the triangle base
    h = w * 0.8660254037844386467637  # sqrt(3)/2

    mag = math.sqrt((B[0] - A[0])**2.0 + (B[1] - A[1])**2.0)

    u0 = (B[0] - A[0]) / (mag)
    u1 = (B[1] - A[1]) / (mag)
    U = [u0, u1]
    V = [-U[1], U[0]]
    v1 = [B[0] - h * U[0] + w * V[0], B[1] - h * U[1] + w * V[1]]
    v2 = [B[0] - h * U[0] - w * V[0], B[1] - h * U[1] - w * V[1]]

    return (B, v1, v2)

1 Ответ

0 голосов
/ 21 сентября 2018

Я наконец нашел решение.Умножая переменную расстояния на компоненты единичного вектора и вычитая этот результат из координат B.Это создаст точку на линии AB с расстоянием d от B.

def create_arrowhead(A, B, d):
"""
Use trigonometry to calculate the arrowheads vertex positions according to the line direction.

Parameters
----------
A : array
    x,y Starting point of line segment
B : array
    x,y Ending point of line segment

Returns
-------
C, v1, v2 : tuple
    The point of head with distance d from point B, the v1 xy and v2 xy points of the two base vertices of the arrowhead.
"""
w = 0.003 # Half of the triangle base width
h = w / 0.26794919243 # tan(15)

AB = [B[0] - A[0], B[1] - A[1]]
mag = math.sqrt(AB[0]**2.0 + AB[1]**2.0)

u0 = AB[0] / mag
u1 = AB[1] / mag
U = [u0, u1] # Unit vector of AB

V = [-U[1], U[0]] # Unit vector perpendicular to AB

C = [ B[0] - d * u0, B[1] - d * u1 ]

v1 = [C[0] - h * U[0] + w * V[0], C[1] - h * U[1] + w * V[1]]
v2 = [C[0] - h * U[0] - w * V[0], C[1] - h * U[1] - w * V[1]]

return (C, v1, v2)
...