2017-09-05 4 views
3

J'essaie de créer un symbole d'angle en utilisant vpython entre deux vecteurs. Ces vecteurs sont le vecteur source et la projection x-y de ce vecteur. J'utilise le paquet vpython et en particulier arc du module shapes de vpython.Créer un angle entre deux vecteurs vpython?

from vpython import * 
import numpy as nump 


scene2 = canvas(title='Source Vector', 
    width=800, height=600, 
    center=vector(0,0,0), background=color.white) 

scene2.select() 

geophone = pyramid(pos=vector(0,0,0), size=vector(2,2,2), 
        color = color.green, up = vector(-1,0,0)) 

shot_loc = sphere(pos=vector(-20,30,-20), 
       size=vector(2,2,2), color= color.red) 

shot_loc_label = label(pos=shot_loc.pos, 
    text='Vib Shot', xoffset=-30, 
    yoffset=30, space=10, 
    height=12, 
    font='serif') 

ray_vector = arrow(pos=vector(0,0,0), axis=shot_loc.pos, 
        shaftwidth=0.2, color= color.blue, length =40, headlength = 2, headwidth =1) 

ray_vec_label = label(pos=(ray_vector.axis - ray_vector.pos)/2, 
    text='Ray Vector', xoffset=-30, 
    yoffset=30, space=10, 
    height=12, 
    font='sans') 

source_vector = arrow(pos=vector(0,0,0), axis= vector(20,-30, 20), 
        shaftwidth=0.2, color= color.red, length =30, headlength = 2, headwidth =1) 

projection_of_source_vector = cylinder(pos=vector(0,0,0), axis= vector(20,0, 20), 
        radius=0.2, color=color.green) 

source_vec_label = label(pos=source_vector.axis, 
    text='Source Vector', xoffset=30, 
    yoffset=30, space=10, 
    height=12, 
    font='sans') 





plunge_angle = diff_angle(vector(20,0, 20),vector(20,-30, 20)) 

plung_arc = shapes.circle(radius=10, angle1=0, angle2=plunge_angle, np=10, rotate=90) 



extrusion(path=[vector(20,0, 20), vector(20,-30, 20)], 
      shape=plung_arc) 


x_axis = arrow(pos=vector(-50,0,0), axis=vector(50,0,0), shaftwidth=0.2, 
       color= color.black, length =100, headlength = 2, headwidth =1) 

z_axis = arrow(pos=vector(0,-40,0), axis=vector(0,40,0), shaftwidth=0.2, 
       color= color.black, length =80, headlength = 2, headwidth =1) 

y_axis = arrow(pos=vector(0,0,40), axis=vector(0,0,-40), shaftwidth=0.2, 
       color= color.black, length =80, headlength = 3, headwidth =2) 



T_x = text(text='X', 
    align='center', color=color.black, pos = vector(-52,0,0), 
      billboard =True, height =2) 

T_y = text(text='Z', 
    align='center', color=color.black, pos = vector(0,-43,0), 
      billboard =True, height =2) 

T_z = text(text='Y', 
    align='center', color=color.black, pos = vector(0,0, 43), 
      billboard =True, height =2) 

T_x.width = 2*T_x.width 
T_y.width = 2*T_y.width 
T_z.width = 2*T_z.width 

3d cartisian

+0

Je pense que vous devez décrire un peu plus en détail ce que vous essayez d'atteindre et ce qui ne fonctionne pas. – skrx

+0

Merci pour votre commentaire. Je voudrais créer un arc fermé entre deux vecteurs dans vpython et l'étiqueter avec un symbole d'angle. Ces deux vecteurs sont tels que représentés sur la figure ci-jointe, à savoir le vecteur source et sa projection dans le plan X-Y. Ce qui ne fonctionne pas, c'est la partie création d'arc. @skrx –

Répondre

2

a finalement réussi à le faire moi-même. Le résultat de ce code écrit dans le cahier jupyter est montré dans la figure ci-jointe. J'utilise la nouvelle version de vpython qui peut fonctionner dans le cahier de jupyter. L'un de ceux-ci n'a pas pu être accompli est l'écriture thêta et alpha en utilisant Latex.

from vpython import * 
import numpy as nump 


scene2 = canvas(width=800, height=600, 
    center=vector(0,0,0), background=color.white) 

scene2.select() 

geophone = pyramid(pos=vector(0,0,0), size=vector(2,2,2), 
        color = color.green, up = vector(-1,0,0)) 

geophone_label = label(pos=geophone.pos, 
    text='Geophone', xoffset=-30, 
    yoffset=-20, space=10, 
    height=12, 
    font='sans') 

shot_loc = sphere(pos=vector(-20,30,-20), 
       size=vector(2,2,2), color= color.red) 

shot_loc_label = label(pos=shot_loc.pos, 
    text='Vib Shot', xoffset=-30, 
    yoffset=30, space=10, 
    height=12, 
    font='sans') 

ray_vector = arrow(pos=vector(0,0,0), axis=shot_loc.pos, 
        shaftwidth=0.2, color= color.blue, length =40, headlength = 2, 
        headwidth =1) 

ray_vec_label = label(pos=(ray_vector.axis - ray_vector.pos)/2, 
    text='Ray Vector', xoffset=-30, 
    yoffset=30, space=10, 
    height=12, 
    font='sans') 

source_vector = arrow(pos=vector(0,0,0), axis= vector(20,-30, 20), 
        shaftwidth=0.2, color= color.red, length =30, headlength = 2, 
         headwidth =1) 

projection_of_source_vector = cylinder(pos=vector(0,0,0), axis= vector(20,0, 20), 
        radius=0.2, color=color.green) 

source_vec_label = label(pos=source_vector.axis, 
    text='Source Vector', xoffset=30, 
    yoffset=30, space=10, 
    height=12, 
    font='sans') 




plunge_angle = diff_angle(vector(20,0, 20),vector(20,-30, 20)) 

plung_arc = shapes.arc(radius=10, angle1=0, angle2=-plunge_angle) 

b = cross(vector(20,0, 20),vector(20,-30, 20)) 
norm_vector = norm(b) 

extrusion(path=[vector(0,0, 0), norm_vector], 
      shape=plung_arc) 

plunge_label = label(pos=vector(4,-4,4), 
    text='α', xoffset=30, 
    yoffset=-20, space=10, 
    height=12, 
    font='sans') 



back_azimuth_angle = diff_angle(vector(20,0, 20),vector(0,0, -1)) 
back_azimuth_arc = shapes.arc(radius=10, angle1=0, angle2=back_azimuth_angle) 

c = cross(vector(20,0, 20),vector(0,0, -1)) 
norm_vector_azimth = norm(c) 

extrusion(path=[vector(0,0, 0), norm_vector_azimth], 
      shape=back_azimuth_arc) 

azimuth_label = label(pos=vector(3,0,-2), 
    text='θ', xoffset=30, 
    yoffset=30, space=10, 
    height=12, 
    font='sans') 


x_axis = arrow(pos=vector(-50,0,0), axis=vector(50,0,0), shaftwidth=0.2, 
       color= color.black, length =100, headlength = 2, headwidth =1) 

z_axis = arrow(pos=vector(0,-40,0), axis=vector(0,40,0), shaftwidth=0.2, 
       color= color.black, length =80, headlength = 2, headwidth =1) 

y_axis = arrow(pos=vector(0,0,40), axis=vector(0,0,-40), shaftwidth=0.2, 
       color= color.black, length =80, headlength = 3, headwidth =1) 



T_x = text(text='X', 
    align='center', color=color.black, pos = vector(-52,0,0), 
      billboard =True, height =2) 

T_y = text(text='Z', 
    align='center', color=color.black, pos = vector(0,-43,0), 
      billboard =True, height =2) 

T_z = text(text='Y', 
    align='center', color=color.black, pos = vector(0,0, 43), 
      billboard =True, height =2) 

T_x.width = 2*T_x.width 
T_y.width = 2*T_y.width 
T_z.width = 2*T_z.width 

Cartesian system