4

3D 空間の任意の 2 点間に曲線を描きたいです。曲線は、ええと、「垂直」でなければなりません。つまり、曲線のポイントの x、y 位置は同じ線上にある必要がありますが、地上から発射物を送り、空中を移動して再び地面に衝突したかのように、z 値を変更する必要があります。物理的に正確である必要はありません。弧は問題ありません。

これは開始コードです:

import numpy as np

p1=np.array([1,1,1]) #x,y,z coordinates of the first point
p2=np.array([3,3,3]) #x,y,z coordinates of the second point

xi=np.linspace(p1[0],p2[0],100) #determine 100 x coordinates between two points
yi=np.linspace(p1[1],p2[1],100) #determine 100 y coordinates between two points
zi= ??                          #determine 100 z coordinates between two points. 

これらの 100 の z 座標 ( ) を決定するにはどうすればよいziですか?

連続したポイント間に線を引くのは簡単であると判断した後zi(mayaviまたはmplot3dを使用)、曲線のビジュアルを提供します。

4

2 に答える 2

3

最終的に曲線を取得するために使用scipy.interpolateし、それを点間の線の z 座標に追加しました。他の人が言ったように、これを行うには複数の方法があります。これは私の目的には十分です。

### objective: draw an arc between points p1 and p2. z coordinates are raised.

import numpy as np
from scipy import interpolate
from mayavi import mlab

###inputs
p1=np.random.uniform(0,20,(3)) #first point
p2=np.random.uniform(0,20,(3)) #second point
npts = 100 # number of points to sample
y=np.array([0,.5,.75,.75,.5,0]) #describe your shape in 1d like this
amp=5 #curve height factor. bigger means heigher 

#get the adder. This will be used to raise the z coords
x=np.arange(y.size)
xnew = np.linspace(x[0],x[-1] , npts) #sample the x coord
tck = interpolate.splrep(x,y,s=0) 
adder = interpolate.splev(xnew,tck,der=0)*amp
adder[0]=adder[-1]=0
adder=adder.reshape((-1,1))

#get a line between points
shape3=np.vstack([np.linspace(p1[dim],p2[dim],npts) for dim in xrange(3)]).T

#raise the z coordinate
shape3[:,-1]=shape3[:,-1]+adder[:,-1]

#plot
x,y,z=(shape3[:,dim] for dim in xrange(3))
mlab.points3d(x,y,z,color=(0,0,0))
mlab.plot3d(x,y,z,tube_radius=1)
mlab.outline()
mlab.axes()
mlab.show()
于 2013-05-13T21:53:52.850 に答える
0

円弧の曲率は制限されていないため、この質問に対する正解は 1 つではありません。この問題の計算の基礎は発射体の運動であり、次の 2 つの重要な方程式が得られます。

x_2 - x_1 = v_1 cos theta dt
z_2 - z_1 = -1/2 g dt^2 + v_0 sin theta dt

ここで、v_1 は発射体の初期速度、theta は発射体が発射される水平からの角度、dt は発射体がポイント 1 からポイント 2 に移動するのにかかる時間、g は重力定数です。簡単にするために、ここでは y を無視します。問題は、これにより 2 つの方程式が得られることですが、v_1、theta、および dt の 3 つの未知数があることです。

たとえば、p1 と p2 のうち高い方が軌跡のピークになるという制約を追加できます。たとえば、p2 が高い場合、

v_2 = v_1 - g dt = 0

これらの 3 つの方程式を解くと v_1 が得られ、時間の経過に伴う z 座標が得られます。

z = -1/2 g t^2 + v_1 t + z_1

t = np.linspace(0, dt, 100)でこぼこした時間のベクトルが得られ、それを z の式に差し込むことができます。

于 2013-05-13T16:12:21.357 に答える