2016-11-04 2 views
0

Der markierte Punkt (Kommentar sagt "markierter Punkt") besteht darin, die vorhandenen Punkte in einem 3D-Plot um einen Punkt zu drehen. Grundsätzlich verschiebe ich alle Punkte um 60 Grad. Aus irgendeinem Grund überlappe ich beim Verschieben der Punkte zwei Punkte. Ich habe versucht, meine if-Anweisung zu ändern und habe mit den Indizes herumgespielt, war aber nicht erfolgreich. Der einzige Grund, warum ich die gesamte Funktion einbezogen habe, ist, dass Sie das Problem, das ich habe, grafisch darstellen können. Hier ist es; lassen Sie mich wissen, wenn Sie Fragen haben:Plotpunkte überlappen beim Drehen von Punkten in der xy-Ebene

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 

Antwort

1

Das Problem ist wahrscheinlich, dass diese Zeilen nicht tun, was Sie erwarten:

x_dummy = x_new 
y_dummy = y_new 

Sie schaffen keine Kopien Ihrer Arrays aber nur duplizieren die Referenzen. Als Ergebnis "verschrauben" Sie Ihre ursprünglichen _new Arrays, wenn Sie die _dummy "Versionen" modifizieren, weil sie (Verweise) auf das gleiche Objekt sind.

das Verhalten zu erreichen, die Sie suchen (Ich gehe davon aus), würden Sie die aktuelle Kopie der Daten erzwingen müssen:

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

Sorry, mein Kommentar in verwirrend gemacht. Die x_new, y_new und z_new sind Listen, keine Arrays. Mein schlechtes wieder. Ich werde meinen ursprünglichen Beitrag bearbeiten. –

+1

Genauso. Duplizierst die Referenzen, kopierst den Inhalt nicht. – Julien

+0

es gibt mir einen Fehler "'Liste' Objekt hat kein Attribut 'Kopieren'" –

Verwandte Themen