matplotlib 从具有和Angular 的坐标绘制直线

zmeyuzjn  于 2023-03-09  发布在  Angular
关注(0)|答案(4)|浏览(181)

我基本上想从坐标(x,y)以给定的Angular 绘制一条线(计算正切值)。
使用pl.plot([x1, x2], [y1, y2], 'k-', lw=1)这样简单的代码行,我可以在两点之间绘制一条直线,但为此我需要计算(x2,y2)坐标。我的(x1,y1)坐标是固定的,Angular 是已知的。计算(x2,y2)在某些点会出现问题,所以我只想从(x1,y1)绘制一条带有Angular (最好是长度)的直线。
我想到的最简单的解决方案是使用点斜率函数y - y1 = m(x - X1).解释这个问题并进行一些搜索,我使用了这段代码:

x1 = 10
y1 = -50
angle = 30

sl = tan(radians(angle))
x = np.array(range(-10,10))
y = sl*(x-x1) + y1

pl.plot(x,y)
pl.show

sl是这里的斜率,x1和y1是坐标。我需要解释一下,因为这是一个很差的问题。
那么,现在,有什么想法我可以做/解决这个问题?

s1ag04yj

s1ag04yj1#

更新版本2023
我不是很确定你到底想从解释中得到什么,但我认为这将接近你所要求的。
如果知道要使用的直线的Angular 和长度,则应使用三角函数来获得新点。

import numpy as np
import math
import matplotlib.pyplot as plt

def plot_point(point, angle, length):
     '''
     point - Tuple (x, y)
     angle - Angle you want your end point at in degrees.
     length - Length of the line you want to plot.

     Will plot the line on a 10 x 10 plot.
     '''

     # unpack the first point
     x, y = point

     # find the end point
     endy = y + length * math.sin(math.radians(angle))
     endx = x + length * math.cos(math.radians(angle))

     # plot the points
     fig = plt.figure()
     ax = plt.subplot(111)
     ax.set_ylim([0, 10])   # set the bounds to be 10, 10
     ax.set_xlim([0, 10])
     ax.plot([x, endx], [y, endy])

     fig.show()
yqyhoc1h

yqyhoc1h2#

this website的启发,给定WGS84坐标、方位角(有时称为前向方位角)和距离,可以使用以下逻辑计算结果目标点:

import math 

distance = 100 # kilometres
radius = 6371 # earth's radius in kilometres

lon, lat = -7.83197, 37.040893
bearing = 40

δ = distance / radius
θ = math.radians(bearing)

φ1 = math.radians(lat)
λ1 = math.radians(lon)

sinφ2 = math.sin(φ1) * math.cos(δ) + math.cos(φ1) * math.sin(δ) * math.cos(θ)
φ2 = math.asin(sinφ2)
y = math.sin(θ) * math.sin(δ) * math.cos(φ1)
x = math.cos(δ) - math.sin(φ1) * sinφ2
λ2 = λ1 + math.atan2(y, x)

lat2 = math.degrees(φ2)
lon2 = math.degrees(λ2)

这将产生

>>> lon2, lat2
(-7.831861171142511, 37.04091627610624)

hmmo2u0o

hmmo2u0o3#

复数的标准模块 cmath 使计算变得简单。

import cmath

   pt = cmath.rect(r, angle)  
   x = pt.real  
   y = pt.imag

给定直线的长度(或半径)r和以弧度表示的Angular ,我们可以得到从原点(0,0)开始的直线的终点x和y坐标(x,y)。

  • 不从原点出发的:如果直线从任何其他点(x1,y1)开始,简单相加得到(x2,y2),x2 = x1+ x和y2 = y1 + y
  • 度到弧度:如果Angular 可以用度来表示,那么使用math.radians(deg)来得到同样的弧度。2当然,记住在使用前导入math。

rect(r,phi)是你要调用的函数。它返回一个复数!只需将它的真实的部和虚部作为你需要的x和y值。

a2mppw5e

a2mppw5e4#

您需要的是全新的,名为**axline**。

import numpy as np
import matplotlib.pyplot as plt

x1 = 10
y1 = -50
angle = 30

sl = np.tan(np.radians(angle))

x = np.arange(-10,10)
y = sl*(x-x1) + y1

plt.plot(x,y, 'o', label='manual')

plt.axline((x1,y1), slope=sl, color='red', label='axline')

plt.legend()
plt.grid()
plt.show()

相关问题