<s> from visual import * <EOL> print ( """<STR_LIT>""" ) <EOL> scene . title = "<STR_LIT>" <EOL> scene . width = <NUM_LIT> <EOL> scene . height = <NUM_LIT> <EOL> R = <NUM_LIT> * <NUM_LIT:4> <EOL> plane = curve ( pos = [ ( <NUM_LIT:0> , - <NUM_LIT:10> , - <NUM_LIT:10> ) , ( <NUM_LIT:0> , - <NUM_LIT:10> , <NUM_LIT:10> ) , ( <NUM_LIT:0> , <NUM_LIT:10> , <NUM_LIT:10> ) , ( <NUM_LIT:0> , <NUM_LIT:10> , - <NUM_LIT:10> ) , <EOL> ( <NUM_LIT:0> , - <NUM_LIT:10> , - <NUM_LIT:10> ) , ( <NUM_LIT:0> , - <NUM_LIT:6> , - <NUM_LIT:10> ) , ( <NUM_LIT:0> , - <NUM_LIT:6> , <NUM_LIT:10> ) , ( <NUM_LIT:0> , - <NUM_LIT:2> , <NUM_LIT:10> ) , ( <NUM_LIT:0> , - <NUM_LIT:2> , - <NUM_LIT:10> ) , <EOL> ( <NUM_LIT:0> , <NUM_LIT:2> , - <NUM_LIT:10> ) , ( <NUM_LIT:0> , <NUM_LIT:2> , <NUM_LIT:10> ) , ( <NUM_LIT:0> , <NUM_LIT:6> , <NUM_LIT:10> ) , ( <NUM_LIT:0> , <NUM_LIT:6> , - <NUM_LIT:10> ) , ( <NUM_LIT:0> , <NUM_LIT:10> , - <NUM_LIT:10> ) , <EOL> ( <NUM_LIT:0> , <NUM_LIT:10> , - <NUM_LIT:6> ) , ( <NUM_LIT:0> , - <NUM_LIT:10> , - <NUM_LIT:6> ) , ( <NUM_LIT:0> , - <NUM_LIT:10> , - <NUM_LIT:2> ) , ( <NUM_LIT:0> , <NUM_LIT:10> , - <NUM_LIT:2> ) , ( <NUM_LIT:0> , <NUM_LIT:10> , <NUM_LIT:2> ) , <EOL> ( <NUM_LIT:0> , - <NUM_LIT:10> , <NUM_LIT:2> ) , ( <NUM_LIT:0> , - <NUM_LIT:10> , <NUM_LIT:6> ) , ( <NUM_LIT:0> , <NUM_LIT:10> , <NUM_LIT:6> ) ] ) <EOL> s_theta = sphere ( pos = ( <NUM_LIT:0> , - <NUM_LIT:12> , - <NUM_LIT:10> ) , radius = <NUM_LIT> , color = ( <NUM_LIT> , <NUM_LIT:1.0> , <NUM_LIT> ) ) <EOL> s_theta_label = label ( pos = s_theta . pos , text = "<STR_LIT>" , yoffset = - <NUM_LIT:5> , <EOL> opacity = <NUM_LIT:0> , box = <NUM_LIT:0> , line = <NUM_LIT:0> ) <EOL> s_length = sphere ( pos = ( <NUM_LIT:0> , - <NUM_LIT:12> , <NUM_LIT:10> ) , radius = <NUM_LIT> , color = ( <NUM_LIT> , <NUM_LIT> , <NUM_LIT:1.0> ) ) <EOL> s_length_label = label ( pos = s_length . pos , text = "<STR_LIT>" , yoffset = - <NUM_LIT:5> , <EOL> opacity = <NUM_LIT:0> , box = <NUM_LIT:0> , line = <NUM_LIT:0> ) <EOL> s_text = label ( pos = ( <NUM_LIT:0> , <NUM_LIT:12> , <NUM_LIT:0> ) , text = "<STR_LIT>" , <EOL> opacity = <NUM_LIT:0> , box = <NUM_LIT:0> , line = <NUM_LIT:0> ) <EOL> fixlength = <NUM_LIT:0> <EOL> fixtheta = <NUM_LIT:0> <EOL> avector = array ( [ <NUM_LIT:0> , <NUM_LIT:0> , - <NUM_LIT> ] ) <EOL> bvector = vector ( <NUM_LIT:0> , <NUM_LIT:3> , <NUM_LIT:2> ) <EOL> a = arrow ( pos = ( <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> ) , shaftwidth = R , color = color . red ) <EOL> b = arrow ( pos = ( <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> ) , axis = bvector , shaftwidth = R , color = color . green ) <EOL> a . axis = avector <EOL> cvector = cross ( avector , bvector ) <EOL> c = arrow ( pos = ( <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> ) , axis = cvector , shaftwidth = R , color = color . yellow ) <EOL> scene . autoscale = <NUM_LIT:0> <EOL> scene . forward = ( - <NUM_LIT:1> , - <NUM_LIT> , - <NUM_LIT:1> ) <EOL> drag = <NUM_LIT:0> <EOL> while True : <EOL> rate ( <NUM_LIT:100> ) <EOL> if scene . mouse . events : <EOL> m = scene . mouse . getevent ( ) <EOL> if m . drag : <EOL> drag = True <EOL> obs = None <EOL> elif m . drop : <EOL> drag = False <EOL> elif m . click : <EOL> if m . pick is s_length : <EOL> if fixtheta : <EOL> fixtheta = not ( fixtheta ) <EOL> s_theta . color = ( <NUM_LIT> , <NUM_LIT:1.0> , <NUM_LIT> ) <EOL> fixlength = not ( fixlength ) <EOL> if fixlength : <EOL> s_length . color = ( <NUM_LIT:0.0> , <NUM_LIT:0.0> , <NUM_LIT:1.0> ) <EOL> else : <EOL> s_length . color = ( <NUM_LIT> , <NUM_LIT> , <NUM_LIT:1.0> ) <EOL> elif m . pick is s_theta : <EOL> if fixlength : <EOL> fixlength = not ( fixlength ) <EOL> s_length . color = ( <NUM_LIT> , <NUM_LIT> , <NUM_LIT:1.0> ) <EOL> fixtheta = not ( fixtheta ) <EOL> if fixtheta : <EOL> s_theta . color = ( <NUM_LIT:0.0> , <NUM_LIT:1.0> , <NUM_LIT:0.0> ) <EOL> else : <EOL> s_theta . color = ( <NUM_LIT> , <NUM_LIT:1.0> , <NUM_LIT> ) <EOL> if drag : <EOL> rate ( <NUM_LIT:100> ) <EOL> newobs = scene . mouse . project ( normal = vector ( <NUM_LIT:1> , <NUM_LIT:0> , <NUM_LIT:0> ) , d = <NUM_LIT:0> ) <EOL> if newobs and ( newobs != obs ) : <EOL> obs = newobs <EOL> if not fixlength and not fixtheta : <EOL> bvector = obs <EOL> if bvector . mag > <NUM_LIT:20> : bvector = bvector * ( <NUM_LIT:20> / bvector . mag ) <EOL> b . axis = bvector <EOL> elif fixlength : <EOL> length = <NUM_LIT> <EOL> bvector = length * norm ( obs ) <EOL> b . axis = bvector <EOL> elif fixtheta : <EOL> length = mag ( obs ) <EOL> bvector = length * norm ( vector ( <NUM_LIT:0> , <NUM_LIT> , <NUM_LIT:1> ) ) <EOL> b . axis = bvector <EOL> cvector = cross ( avector , b . axis ) <EOL> c . axis = cvector </s>
