2013-04-12 4 views
2

Я столкнулся с некоторой проблемой, пока рисовал направление стрелки. У меня есть координаты точки (x, y) и их угол. Я хочу сделать это, чтобы нарисовать стрелку в соответствии с заданным углом (просто чтобы показать направление точки как стрелку в каждой координате точки). Здесь мы должны принять координаты '+ x', '+ y', '-x', '-y' равные 90, 0, 270, 180 градусов, соответственно.Рисование стрелки в координате (x, y) в Python

Я немного незнакомый с инструментами рисования Python. Я все еще не уверен, чтобы нарисовать направленную точку (стрелка на основе угла), использую ли я pylab или некоторые другие модули или ... все еще не уверен. Я поставил следующие коды в качестве образца, чтобы дать более подробное описание:

# Inputs: 
x = np.array([ 2, 4, 8, 10, 12, 14, 16]) 
y = np.array([ 5, 10, 15, 20, 25, 30, 35]) 
angles = np.array([45,275,190,100,280,18,45]) 

import numpy as np 
import scipy as sp 
import pylab as pl 

def draw_line(x,y,angle): 

    # First, draw (x,y) coordinate ??? 
    # Second, according to the angle indicate the direction as an arrow ??? 

ответ

0

Ваши обозначенные углы соответствуют картам, а декартовы условности имеют (+ x, + y, -x, -y) как (0, 90, 180, 270) соответственно. Они также будут принимать радианы. Чтобы преобразовать углы:

import math 
cartesianAngleRadians = (450-mapAngleDegrees)*math.pi/180.0 

Вот исходный код, который рисует засечки в соответствии с вашим предусмотренным х, у точек.

import numpy as np 
import scipy as sp 
import pylab as pl 
import math 

x = np.array([ 2, 4, 8, 10, 12, 14, 16]) 
y = np.array([ 5, 10, 15, 20, 25, 30, 35]) 
angles = np.array([45,275,190,100,280,18,45]) 

def draw_line(x,y,angle,length): 
    cartesianAngleRadians = (450-angle)*math.pi/180.0 
    terminus_x = x + length * math.cos(cartesianAngleRadians) 
    terminus_y = y + length * math.sin(cartesianAngleRadians) 
    pl.plot([x, terminus_x],[y,terminus_y]) 
    print [x, terminus_x],[y,terminus_y] 


pl.axis('equal') 
pl.axis([-5,20,-5,40]) 
for i in range(0,len(x)): 
    print x[i],y[i],angles[i] 
    draw_line(x[i],y[i],angles[i],1) 

pl.show() 
+0

Спасибо за точный ответ. Кстати, какова основная роль «450» в вашем начальном коде? – Spider

+0

(450 - a) преобразует a = (90, 0, 270 180) в (360, 450, 180, 270), если вы по модулю 360 (что sin/cos в радианах), это эквивалентно (0, 90, 180 , 270). 360-a меняет знак, а дополнительный 90 - на смещение нулевого угла от + y до + x. –

6

Вы можете рисовать стрелки с matplotlib.pyplot.arrow(x, y, dx, dy, hold=None, **kwargs). У части, с которой вы, похоже, сталкиваетесь с трудностями, является определение смещений dx и dy с учетом угла и длины стрелки r. Для полярных координат с angle в радианах

dx = r*cos(angle) 
dy = r*sin(angle) 

так, что ваша draw_line функция становится

def draw_line(x, y, angle): 
    r = 1 # or whatever fits you 
    arrow(x, y, r*cos(angle), r*sin(angle)) 

Это нарисовать стрелку, начиная с (x,y) в направлении angle с длиной 1.

Смежные вопросы