2016-11-04 58 views
0

标记点(注释称为“标记点”)的点是将3D绘图中的现有点旋转一个点。基本上我将所有点移动60度。出于某种原因,当移动点时,我有两点重叠。我试图改变我的陈述,并且混淆了他的指数,但并未成功。我包括整个功能的唯一原因是,您可以绘制并查看我遇到的问题。这里是;让我知道如果您有任何疑问:在xy平面上旋转点时重叠的绘图点

def transform_3d_trig(a,b,c): 
     q=2*math.pi/(360) 
     d=c*q 
     a2 = a+b 
     n = 12 

     sin=math.sin 
     cos=math.cos 
     sqrt=math.sqrt 
     x = [] 
     y = [] 
     z = [] 

     for i in range(n): 
      if i <= 5: 
       x.append(a*np.cos(q*(60*(i-1)))) 
       y.append(a*np.sin(q*(60*(i-1)))) 
       z.append(0) 
      else: 
       x.append(a2*np.cos(q*(60*(i-1)))) 
       y.append(a2*np.sin(q*(60*(i-1)))) 
       z.append(0) 

     x_new = x #new lists 
     y_new = y 
     z_new = z 
     for i in range(n): 
      y_new[i] = y[i]*cos(d) 
      z_new[i] = y_new[i]*np.tan(d) 

     # plot points at this stage (before rotation); no overlapping points 
     fig = plt.figure(figsize=(12,12)) 
     ax3 = fig.add_subplot(211, projection='3d') 
     bond2 = [x_new[4],x_new[10],y_new[4],y_new[10],z_new[4],z_new[10]] 
     ax3.plot(bond2[:2],bond2[2:4],bond2[4:6], color='r') 
     ax3.scatter(x_new, y_new, z_new) 
     ax3.set_xlabel('\nX') 
     ax3.set_ylabel('\nY') 
     ax3.set_zlabel('\nZ') 

     x_dummy = x_new #dummy variables to not screw up list 
     y_dummy = y_new 
     for i in range(n): #marked spot 
      if (i == 5 or i == 11): 
       x_new[i] = x_dummy[i-5] 
       y_new[i] = y_dummy[i-5] 
      else: 
       x_new[i] = x_dummy[i+1] 
       y_new[i] = y_dummy[i+1] 

      print(x_new[i], y_new[i]) #to track what point are overlapping 

     # plot points at this stage (after rotation); overlapping points 
     ax3 = fig.add_subplot(212, projection='3d') 
     bond2 = [x_new[4],x_new[10],y_new[4],y_new[10],z_new[4],z_new[10]] 
     ax3.plot(bond2[:2],bond2[2:4],bond2[4:6], color='r') 
     ax3.scatter(x_new, y_new, z_new) 
     ax3.set_xlabel('\nX') 
     ax3.set_ylabel('\nY') 
     ax3.set_zlabel('\nZ') 
     plt.show() 
     return x, y, z, x_new, y_new, z_new 

回答

1

这个问题可能是,这些行不这样做你所期望的:

x_dummy = x_new 
y_dummy = y_new 

他们不创建数组的副本,但只会重复参考文献。因此,在修改_dummy“版本”时,实际上是“拧紧”原始_new阵列,因为它们(引用)同一个对象。

要实现你正在寻找(我认为)的行为,你就需要强制数据的实际拷贝:

x_dummy = x_new.copy() 
y_dummy = y_new.copy() 
+0

对不起,我的评论在混乱制成。 x_new,y_new和z_new是列表,而不是数组。我又坏了。我将编辑我的原始帖子。 –

+1

只是一样。您复制引用,而不是复制内容。 – Julien

+0

它给了我一个错误“'列表'对象没有属性'复制'” –