GlowScript с программой PhysUtil не работает - PullRequest
0 голосов
/ 01 марта 2019

Это код, который я пытаюсь выполнить, но он показывает некоторые ошибки, которые я не могу понять:

    GlowScript 2.7 VPython

### INITIALIZE VPYTHON
# -----------------------------------------------------------------------
# -*- coding: utf-8 -*-
from __future__ import division
from visual import *
get_library('https://cdn.rawgit.com/PERLMSU/physutil/master/js/physutil.js')
#from physutil import *
from visual.graph import *

### ΔΗΜΙΟΥΡΓΙΑ ΣΤΟΙΧΕΙΩΝ ΓΡΑΦΙΚΩΝ, ΕΞΟΜΟΙΩΣΗΣ, ΟΠΤΙΚΟΠΟΙΗΣΗΣ ΚΑΙ ΧΡΟΝΟΥ
# ------------------------------------------------------------------------

# ΔΗΜΙΟΥΡΓΙΑ ΠΑΡΑΘΥΡΟΥ ΤΙΤΛΟΥ
scene.title = "Horizontal Projectile"                                                                   #Ορισμός τίτλου 
scene.width= 1000
scene.center=vector (500,0,0)
scene.height= 1000

scene.background = (color.black)                                                                        #Ορισμός ως χρώμα του background το μαύρο
scene.fullscreen = False
# ΔΗΜΙΟΥΡΓΙΑ ΑΝΤΙΚΕΙΜΝΕΝΩΝ ΣΚΗΝΙΚΟΥ (οι μονάδες ειναι σε μέτρα)
field = box(pos = vector(625, 0, 0), size = vector(1250, 0.5, 100), color = color.green, opacity = 0.5)       #Δημιουργία του "γήπεδου" ως αντικείμενο box και ορίζονται τα χαρακτηριστικά του οπως διάνυσμα θεσης, μεγεθος, χρώμα και χρωματική διαπερατότητα.
ball = sphere(radius = 5, color = color.blue)                                                           #Δημιουργία της "μπάλας" ως αντικείμενο sphere.Ορισμός των χαρακτηριστικών του όπως ακτίνα και χρώμα.

# ΔΗΜΙΟΥΡΓΙΑ ΣΥΣΤΗΜΑΤΟΣ ΑΞΟΝΩΝ - Define axis marks the field with a specified number of tick marks

xaxis = PhysAxis(field, 6,                                                                              # Ορισμός αριθμού των σημείων τιμών του άξονα Χ
    axisType = "x",                                                                                     # Ορισμός ώς οριζόντιος άξονας.
    labelOrientation = "down",
    startPos = vector(0,0,0),
    length = 1000)                                                                                      # Ορισμός αριθμού των σημείων τιμών του άξονα Υ
yaxis = PhysAxis(field, 6,                                                                              # Ορισμός ώς κατακόρυφος άξονας.
    axisType = "y",
    labelOrientation = "left",
    startPos = vector(0, 0, 0),                                                                         #Ορισμός αρχής του άξονα Υ ίδιο με αυτής του άξονα Χ
                 length = 500)                                                                          #Μονάδες ειναι σε μέτρα

# ΔΗΜΙΟΥΡΓΙΑ ΠΑΡΑΘΥΡΟΥ ΓΡΑΦΙΚΩΝ ΠΑΡΑΣΤΑΣΕΩΝ.--Set up graph with two plots
posgraph = PhysGraph(4, backgroundColor = color.black, xlabel=u'Χρόνος (sec)',                          #Δημιουργία 4 γραφικών παραστάσεων, ορισμός χρώματος υπόβαθρου το μαύρο, ορισμός ονόματος του άξονα Χ
                     ylabel=u'Θέση Χ (m)-[Kόκκινο], Θέση Υ (m)-[Πράσινo], Ux (m/s)-[Μπλέ], Uy (m/s)-[Κίτρινο]')         #Ορισμός ονόματος του άξονα Υ τα ονόματα των γραφικών παραστάσεων και τα αντίστοιχα χρώματα τους


# ΔΗΜΙΟΥΡΓΙΑ ΙΧΝΟΥΣ ΓΙΑ ΤΗΝ ΑΠΟΤΥΠΩΣΗ ΤΗΣ ΤΡΟΧΙΑΣ ΤΟΥ ΣΩΜΑΤΟΣ Set up trail to mark the ball's trajectory
trail = curve(color = color.white, radius = 1)                                                          #Ορισμός χρώματος και ακτίνας της καμπύλης του ίχνους. Οι μονάδες είναι σε μέτρα.

# ΔΗΜΙΟΥΡΓΙΑ ΠΕΔΙΟΥ ΚΙΝΗΣΗΣ ΤΟΥ ΣΩΜΑΤΟΣ--Set up motion map for ball
motionMap = MotionMap(ball, 5,                                                                          #Αναμοενόμενος χρόνος ολοκλήρωσης προσομοίωσης.
    4,                                                                                                  #Αριθμός σημείων τροχιάς ανά αναμενόμενο χρόνο προσομοίωσης
    markerScale=0.5,
    labelMarkerOffset = vector(0, -20, 0),                                                              
    dropTime = False)                                                                                   #Αν η τιμή είναι True εμφανίζει τη χρονική στιγμή του κάθε σημείου τροχιάς.

# ΟΡΙΣΜΟΣ ΧΡΟΝΟΜΕΤΡΟΥ ΣΤΟ ΠΑΡΑΘΥΡΟ ΠΡΟΣΟΜΟΙΩΣΗΣ Set timer in top right of screen
timerDisplay = PhysTimer(200, 200)                                                                      #Ορισμός θέσης χρονόμετρου της εξομοίωσης(οι μονάδες είναι σε μέτρα)


### ΟΡΙΣΜΟΣ ΠΑΡΑΜΕΤΡΩΝ ΚΑΙ ΑΡΧΙΚΩΝ ΣΥΝΘΗΚΩΝ ΠΡΟΣΟΜΟΙΩΣΗΣ.
# ----------------------------------------------------------------------------------------

# Ορισμός παραμέτρων     
ball.m = 0.6                                                                                            # Μάζα σώματος σε κιλά Kg-mass of ball in kg
ball.pos = vector(0,100, 0)                                                                             # Αρχική θέση σώματος σε μορφή συντεταγμένων (x,y,z), οι μονάδες είναι σε μέτρα.
ball.v = vector(150, 0, 0)                                                                              # Αρχική ταχύτητα σώματος σε μορφή συντεταγμένων (Ux,Uy,Uz), οι μονάδες είναι σε m/s.
Xrand=50
g = vector(0, -9.81, 0)                                                                                 # Επιτάχυνση σώματος λόγω της βαρύτητας σε μορφή συντεταγμένων (ax,ay,az), οι μονάδες είναι σε m/s/s.

# Ορισμός χρονικών παράμετρων
t = 0                                                                                                   # Αρχική τιμή χρόνου
deltat = 0.001                                                                                          # Ορίζεται το βήμα του χρόνου της εξομοίωσης.
scene.autoscale = False

### ΒΡΟΓΧΟΣ ΥΠΟΛΟΓΙΣΜΟΥ ΤΩΝ ΕΞΙΣΩΣΕΩΝ ΠΕΡΙΓΡΑΦΗΣ ΤΗΣ ΕΞΟΜΟΙΩΣΗΣ ΚΑΙ ΣΧΕΔΙΑΣΜΟΣ ΓΡΑΦΙΚΩΝ.
# ------------------------------------------------------------------------------------

while ball.pos.y > 0 :                                                                                 #Συνάρτηση που επιτρέπει να συνεχίζει να τρέχει ο κώδικας για όσο η τιμή της θέσης του σώματος στον Υ είναι > 0.

                                                                                                        # Απαιτειται ώστε να ειναι ορατή η εξέλιξη της εξομοίωσης/ ανανέωση ομαλή ώστε
                                                                                                        #να μην εκτελείται το πρόγραμμα περισσότερες από 1000 φορές/sec)
    rate(1000)    


    Fnet = ball.m * g                                                                                   # Υπολογισμός ολικής δύναμης όπου δέχεται το σώμα


    ball.v = ball.v + (Fnet/ball.m * deltat)                                                            # Συνάρτηση υπολογισμού και ανανέωσης ταχύτητας σώματος της μορφής (U=Uo+a*t) χρησιμοποιώντας το 2ο Νόμο Νεύτωνα.
    #ballv = ball.v + (Fnet/ball.m * deltat)
    ball.pos = ball.pos + ball.v * deltat
    if ball.pos.y<=0:
            break
    #ball.v=ballv
    #ball.pos = ballxy                                                               # Συνάρτηση υπολογισμού και ανανέωσης θέσης σώματος κάθε χρονική στιγμή της μορφής (X=Xo+U*t).


    # Update motion map, graph, timer, and trail                                                
    motionMap.update(t, ball.v)                                                                         
    posgraph.plot(t, ball.pos.x, ball.pos.y, ball.v.x, ball.v.y)                                        #Δημιουργία γραφικής παράστασης για X,Y,Ux,Uy ως προς τον χρόνο
    trail.append(pos = ball.pos)
    timerDisplay.update(t)


    t = t + deltat                                                                                      # Ανανέωση χρόνου εξέλιξης της προσομοίωσης 


### ΑΠΟΤΕΛΕΣΜΑ ΚΩΔΙΚΑ
# --------------------------------------------------------------------------------------

# Print the final time and the ball's final position
print ('Ο χρόνος που χρειάζεται για να φτάσει στο έδαφος είναι t='), t,'sec'                          #Εντολή υπολογισμού και εκτύπωσης χρόνου οριζόντιας βολής
print ('\n')                                                                                              #Κενή γραμμή.
#print 'Το βεληνεκές ειναι:' ,ball.pos.x,"m"                                                            #Εντολή υπολογισμού και εκτύπωσης βεληνεκούς οριζόντιας βολής.
#print "\n"                                                                                              #Κενή γραμμή.
#print u'Η τελική θέση στον άξονα Y ειναι:' ,ball.pos.y, "m"                                             #Εντολή υπολογισμού και εκτύπωσης βεληνεκούς οριζόντιας βολής.
#print "\n"                                                                                              #Κενή γραμμή.
#print u'Η συνιστώσα της ταχύτητας στον άξονα Χ τη χρονική στιγμή πριν ακουμπήσει το έδαφος είναι:', ball.v.x, "m/s"     #Εντολή υπολογισμού και εκτύπωσης οριζόντιας συνιστώσας ταχύτητας της οριζόντιας βολής. 
#print "\n"                                                                                              #Κενή γραμμή.
#print u'Η συνιστώσα της ταχύτητας στον άξονα Y τη χρονική στιγμή πριν ακουμπήσει το έδαφος είναι:', ball.v.y, "m/s"     #Εντολή υπολογισμού και εκτύπωσης κατακόρυφης συνιστώσας ταχύτητας της οριζόντιας βολής.
#print "\n"                                                                                              #Κενή γραμμή.
#print u'Ο λόγος του βεληνεκούς προς την αρχική ταχύτητα του σώματος (s/u) ειναι:', ball.pos.x/ball.v.x                  #Εντολή υπολογισμού και εκτύπωσης του λόγοςυ του βεληνεκούς προς την αρχική ταχύτητα του σώματος (s/u).
#print "\n"                                                                                              #Κενή γραμμή.
#print u' Η κατακόρυφη μετατόπιση του σώματος όταν στον άξονα των Χ βρίσκεται στη θέση Χ=', Xrand, u'm είναι:', (g.y*Xrand**2/(2*ball.v.x**2)) ,"m"   #Εντολή υπολογισμού και εκτύπωσης κατακόρυφης μετατόπισης του σώματος από το αρχικό του ύψος της οριζόντιας βολής.
#print "\n"
#print ball.pos

Этот код показывает следующую ошибку:

ReferenceError: PhysAxis is not defined

ReferenceError: PhysAxis is not defined

At or near line 29: xaxis = PhysAxis(field, 6, 

Этоэто первая ошибка, это может показать еще немного на пути.Код успешно выполняется на компьютере с Windows, используя vidle и vpython, но GlowScript не принимает его.Ошибка, по-видимому, связана с библиотекой PhysUtil, которую я импортирую в строку 8 кода.Кроме того, код является рабочим примером с сайта PhysUtil.В моей машине с Windows класс PhysAxis определен, но в файле Javascript, очевидно, нет.Я не могу найти, что не так с файлом.GlowScript необходим для использования, которое я хочу.

Если вы не можете найти библиотеку PhysUtil:

https://perlmsu.github.io/physutil/installation/

1 Ответ

0 голосов
/ 22 апреля 2019

Эта проблема была решена на форуме GlowScript.

...