Tychos Python Language Reference
The following reference guide identifies the language syntax, built in variables, functions, and classes that are used to code your simulations using the Python Language. We have included documentation here for some of the helpful functions defined in the Python language. This is not a complete list of all functions available in Python, just ones that might be commonly used in Tychos for building scenarios as well as defining goals for those scenarios.
Comments
Comments are statements that you can insert in your code that do not get interpreted and executed by Tychos. To create a comment, you simply indicate a comment by using a hashtag:
# This is a comment.
Variables
To define a variable in Tychos all you need to do is identify a name for the variable. You then type an =
sign to assign a value to the variable. The following demonstrates various variable declarations
# Assigns a variable called x the value of 10
x = 10
# Assign a new variable y the value of the x
y = x
# Assign x the value of itself plus 1
x = x + 1
Built-in Scenario Variables
There are a few variables that are built into Tychos. These variables are:
t
— How many seconds has passed since this Scenario was started?dt
— Time between frames as seconds, e.g. 0.1 is 1/10th of a second.frame_count
— How many frames have passed? e.g. 1, 2, 3...
Common Math Operators and Functions
These are some common mathematical operators and functions for performing various calculations.
Mathematical Operators
Tychos uses the following operators to perform basic math calculations:
+
— Addition-
— Subtraction*
- Multiplication/
- Division** - Exponent
%
- Modulo
Basic Math Functions
You can also use the following basic math functions:
sqrt(positive_number)
The sqrt(positive_number)
function takes a single non negative number and returns the real square root of the number.
# returns number 2
sqrt(4)
exp(power)
The exp(power)
function calculates Euler's number (e) to the given power.
# returns 54.59815
exp(4)
log(x)
The log(x)
returns the natural log (base e) of x.
# returns number 2
abs(-2)
ceil(x)
The ceil(x)
function rounds a number up to the nearest integer.
# returns 5
exp(4.1)
floor(x)
The floor(x)
function rounds a number down to the nearest integer.
# returns 4
exp(4.9)
sign(x)
The sign(x)
function returns +1 if x is less than 0, -1 if x is greater than 0, and 0 if x is equal to 0.
# returns -1
sign(-42)
# returns 1
sign(42)
# returns 0
sign(0)
abs(x)
The abs(x)
function returns the absolute value of a number.
# returns number 2
abs(-2)
random()
The random()
function returns a semi random number between 0 and 1.
x = random()
randrange(a, b)
The randrange(a,b)
function returns a semi random number between a
and b
.
x = randrange(10, 100)
factorial(x)
The factorial(x)
function calculates the product of all positive integers less than or equal to the given positive integer.
# x! = x*(x-1)*(x-2)....(1)
# returns 120
factorial(5)
combin(n, r)
The combin(x,y)
function calculates the number of ways to choose a sample of r elements from a set of n distinct objects where order does not matter and replacements are not allowed.
# x!/(y!*(x-y)!)
# returns 10
combin(5,2)
Trigonometric Functions
The following functions all use radians as the angle measurement. You can use pi
to represent PI.
sin(angle)
The sin(angle)
function is used to evaluate the trigonometric sine value for a given input angle. The input angle must be provided in radians.
# returns number 1
sin(pi/2)
cos(angle)
The cos(angle)
function is used to evaluate the trigonometric cosine value for a given input angle. The input angle must be provided in radians.
# returns number 1
cos(0)
tan(angle)
The tan(angle)
function is used to evaluate the trigonometric tangent value for a given input angle. The input angle must be provided in radians.
# returns number 1
tan(pi/4)
asin(value)
The asin(value)
function is used to evaluate the trigonometric arcsine value (inverse sine) for a given input. The output angle is given in radians.
# returns number 1.57
asin(1)
acos(value)
The acos(value)
function is used to evaluate the trigonometric arccosine value (inverse cosine) for a given input. The output angle is given in radians.
# returns number 0
acos(1)
atan2(x, y)
The atan2(value)
function is used to evaluate the trigonometric arctangent value (inverse tangent) for a given x and y input. The output angle is given in radians.
# returns number -0.785
atan2(-1, 1)
# returns 2.36
atan2(1, -1)
radians(angle)
The input is an angle measurement in degrees and the output is the angle measurement in radians.
# returns number .785
radians(45)
degrees(angle)
The input is an angle measurement in radians and the output is the angle measurement in degrees.
# returns number 180
degrees(pi)
Vector and Vector Functions
The following functions provide operations for creating and using vectors in calculations.
vec(x, y), or vec(x,y,z)
Creates a Vector object representing a 3d vector with components identified as x, y, and z.
# Create a vector with components x=2, y=2, z=0
v1 = vec(2,2)
# Create a vector with components x=2, y=2, z=2
v2 = vec(2,2,2)
# Change a component of the vector:
v1.x = 3
Adding and Subtracting Vectors
Vectors can be added or subtracted from one another using standard +, - operators:
v1 = vec(2,2)
v2 = vec(1,1)
# Add the two vectors together:
v3 = v1 + v2 # Returns vec(3,3,0)
Multiplying and Dividing By A Scalar
Vectors can also by scaled using the standard *, / operators:
v1 = vec(2,2)
# Multiply by a scalar
v2 = 2 * v1 # Returns vec(4,4,0)
# Divide by a scalar
v3 = v1 / 2 # Returns vec(1,1,0)
dot(v1, v2)
Calculates the dot product of two Vector objects.
# Work is the dot product of Force (F) and displacement (r)
F = vec(2, 2)
r = vec(3, 3)
# returns 12
Work = dot(F, r)
cross(v1, v2)
Calculates the cross product for two vectors in three dimensional space.
# Torque is the cross product of Force and moment arm (r)
F = vec(2, 0, 0)
r = vec(0, 2, 0)
# returns Vector vec(0, 0, 4)
cross(F, r)
norm(vec)
Same as hat
. See below.
hat(vec)
This function returns a unit vector representation of the given input vector. Its magnitude is 1 and the direction matches the direction of the input vector. This can be useful if you need just the direction of a vector, but not its magnitude.
vec
- any two or three dimensional vector.
Example:
u = hat(vec(3, 4)) # returns vec(0.6, 0.8, 0)
mag(u) # returns 1
mag(vec)
This function returns the scaler magnitude of any given vector. This is helpful when you want to know the length of a vector, for example, if you want the magnitude of a vector, but not the direction.
vec
- any two or three dimensional vector.
Example:
mag(vec(3, 4)) # returns 5
mag2(vec)
This function returns the scaler squared magnitude of any given vector.
vec
- any two or three dimensional vector.
Example:
mag2(vec(3, 4)) # returns 25
diff_angle(vec1, vec2)
This function returns the angle between two vectors. The angle value is returned in radians.
vec1
- any two or three dimensional vector.vec2
- any two or three dimensional vector.
Example:
# returns 0.7853981633974484
diff_angle(vec(4, 4), vec(4, 0))
proj(vec1, vec2)
This function returns the vector projection of vec1
along vec2
.
vec1
- any two or three dimensional vector.vec2
- any two or three dimensional vector.
comp(vec1, vec2)
This function returns the scalar projection of vec1
along vec2
.
vec1
- any two or three dimensional vector.vec2
- any two or three dimensional vector.
distance(point1, point2)
This function returns a scalar quantity representing the distance between two points.
point1
- any two or three dimensional vector representing a point in space.point2
- any two or three dimensional vector representing a point in space.
Example:
distance(vec(5,5), vec(3,3)) # returns 2.8284271247461903
direction(vec)
This function returns a scalar angle measurement. This is helpful when you want to know the direction of a vector, like the direction of a velocity vector, or the direction of a force vector. The returned angle is given in radians, measured from the positive x axis.
vec
- any two or three dimensional vector.
Example:
direction(vec(4, 4)) # returns 0.7853981633974483
polar(radius, angle)
This function returns a two-dimensional vector representing the cartesian components of a polar coordinate corresponding to the magnitude of the radius and the radial angle.
radius
- scalar quantity representing the scalar distance of the radius of theangle
- scalar quantity representing the angle measurement of the polar coordinate.
Example:
polar(10, pi/4) # returns vec(7.07, 7.07, 0)
get_rotated_position(position, angle, axis)
This function is simply used for finding a point that has been rotated a given angle about a specific axis. It is just a utility function that could be performed by doing some simple trigonometry calculations, but hey, why not make it easier for you?
position
- A vector representing the point that is rotated.angle
- scalar quantity representing the angle measurement of rotation.axis
- A 2D vector that identifies the axis point about which the position has been rotated.
Example:
get_rotated_position(vec(10, 0), pi, vec(0, 0)) # returns vec(-10, 0, 0)
Other Useful Functions
Some other useful functions..._
rgb(r, g, b)
This function returns a hexadecimal value for the red, green, and blue input values. This can be useful for setting the color of an object based on the RGB color model.
r
- a value between 0 and 255 representing the RED of RGB.g
- a value between 0 and 255 representing the GREEN of RGB.b
- a value between 0 and 255 representing the BLUE of RGB.
Example:
color = rgb(100, 100, 0) # returns '#646400'
stop()
This function interrupts the simulation and stops it at the current frame.
stop()
-> stops the simulation.
Example:
if buggy.pos.x > 100:
stop() # simulation stops
Collision Functions
The following functions are meant to help users model collisions more easily. These functions could be used for other purposes rather than modeling collisions as Tychos is not a physics engine. These functions could be thought of as "overlap" functions. They return information about the overlap of objects.
has_collided(source, target)
This function returns a boolean true/false value when two objects are given as the source and target. It returns false if the two objects are not determined to be overlapping.
source
-circle
orrectangle
orline
objecttarget
-circle
orrectangle
orline
object
Example:

# Initial State
p1 = circle(pos=vec(15, 0), radius=10, color=rgb(0, 200, 200), opacity=.6)
b1 = rectangle(pos=vec(0, 0), size=vec(15, 15), color=rgb(200, 0, 200), opacity=.6)
b1.rotate(radians(45))
p3 = circle(pos=vec(-15, 0), radius=10, color=rgb(0, 0, 200), opacity=.6)
# Calculations
has_collided(p1, b1) # returns True
has_collided(b1, p3) # returns True
has_collided(p1, p3) # returns False
get_mtv(source, target)
This function returns a two dimensional vector representing the minimum translation vector (MTV) that would be needed to separate two objects when they overlap. This can be used to simulate collision forces or to move objects apart based on the magnitude and direction of the MTV.
source
-circle
orrectangle
orline
objecttarget
-circle
orrectangle
orline
object
Example:

# Initial State
p1 = circle(pos=vec(0, 0), radius=10, color=rgb(200, 200, 200), opacity=.6)
p2 = circle(pos=vec(12, 10), radius=10, color=rgb(0, 200, 0), opacity=.6)
b1 = rectangle(pos=vec(-12, 0), size=vec(15, 15), color=rgb(200, 0, 0), opacity=.6)
mtv1 = arrow(pos=p1.pos, color="green")
mtv2 = arrow(pos=p1.pos, color="red")
# Calculations
mtv1.size = get_mtv(p1, p2)
mtv2.size = get_mtv(p1, b1)
get_intersections(source, target)
This function returns a list containing all the points where the object boundaries intersect. The points are vectors corresponding with the coordinates of those intersection locations. This can be used to identify exactly where the overlap is occurring in your scenarios.
source
-circle
orrectangle
orline
objecttarget
-circle
orrectangle
orline
object
The image below shows an example of the points of intersection between a rectangle and a line, but note, those points are being showed for demonstration only, and would not be visible unless you assign them to a visible object, in this case the position of two small circle objects.
Example:
# Initial State
r = rectangle(pos=vec(-4, 0), size=vec(10,15), color="orange", opacity=.5)
r.rotate(.1)
l = line(pos=vec(0,10), pos2=vec(-10, -20))
# Calculations
points = get_intersections(r, ln)
Logical Operators
The following operators are used to execute logical AND and OR comparisons for the use of evaluating logical statements.
and
This is used for performing a logical AND conjunction. For example, "A and B" is true only if A is true and B is true. "A and B" is false if either A or B is false.
A = True
B = True
A and B # returns true
B = False
A and B # returns false
You can use the and
operator to test if two comparisons are both true:
x = 2
(x < 3) and (x == 2) # returns True
(x < 3) and (x != 2) # returns False
or
This is used for performing a logical OR conjunction. For example, "A or B" is true if A or B is true. "A or B" is false only if A and B are both false.
A = True
B = False
A or B # returns True
A = False
A or B # returns False
You can use the or
operator to test if one of two comparisons are true:
x = 2
(x < 3) or (x == 3) # one is true, so returns True
(x < 1) or (x == 3) # both are false, so returns False
Built-in Classes
Tychos has only a few classes that are used to create the basic simulated objects in the Tychos universe as well as a few tools for analyzing those objects in the simulated world. The graphical objects in Tychos that can be used are:
There are also two gradient fill objects that can be added to some of the above graphical objects (circle, rectangle, ellipse, arc, poly_line)
Common Attributes
The following attributes are shared by most of the graphical objects listed above. Exceptions are noted below.
pos
- vector
pos
- vectorThe position of of the graphic object scaled to the world. This is not a pixel position, but rather a position in the World as a vector with x,y,z
coordinates. Currently the z coordinate value does not affect the position of the object in the World. The linear_gradient
and radial_gradient
do not have these attributes
color
- string
color
- stringObjects will be drawn in this color. Use HTML colors e.g. "#ff3300", "blue", or the rgb
function.
opacity
- float
opacity
- floatObjects can be drawn with an opacity between 1 and 0, representing 100% opaque to 100% transparent.
image
- string
image
- stringCertain objects (circle, rectangle, ellipse, arc) can also be represented with an image by setting the image attribute of the object. The text can either be a URI link or an asset reference to a graphic file that can be a PNG, SVG, GIF, or JPEG image.
Here is an example of using a URI for displaying a circle as an image:
rocket = circle(pos=vec(0, 0), radius=10)
rocket.image = "https://upload.wikimedia.org/wikipedia/commons/3/3d/Spacecraft.png"

no_fill
- boolean
no_fill
- booleanIf set to True
, the area inside the object will be transparent.
fill
- object
fill
- objectOptional argument for rendering the filled area with either a linear_gradient
or radial_gradient
visible
- boolean
visible
- booleanAll objects can be hidden from view by setting this flag to False
.
motion_map
- boolean
motion_map
- booleanThis flag tells Tychos to attach a series of strobe images called a motion map.
Labels
The circle, rectangle, ellipse and arc objects can display a text label within their bounded areas. The text will scale with the object.
label_text
- string
label_text
- stringThe text of an attached label.
label_color
- string
label_color
- stringThe color of the attached label text.
label_font
- string
label_font
- stringThe font family of the attached label text.
label_style
- dictionary
label_style
- dictionaryA dictionary whose key-value pairs match CSS font styling attributes of the attached label text.
Borders
You can add a border to the circle, rectangle, ellipse, arc, and poly_line objects:

border_size
- int
border_size
- intThe border thickness in pixels.
border_color
- string
border_color
- stringThe border will be drawn in this color. Use HTML colors e.g. "#ff3300"
, "blue"
.
border_style
- string
border_style
- stringSets the border as either solid (default = "none"
) or "dash"
for a dashed border, or "dot"
for a dotted border.
Effects
Objects can also be visually altered by setting the following attributes:

skew_x
- float
skew_x
- floatThe value represents the radian angle value that the object's coordinate map is transformed about its x axis.
skew_y
- float
skew_y
- floatThe value represents the radian angle value that the object's coordinate map is transformed about its y axis.
flip_x
- boolean
flip_x
- booleanMirrors the object about its x axis.
flip_y
- boolean
flip_y
- booleanMirrors the object about its y axis.
blur
- float
blur
- floatSets the standard deviation value of a Gaussian blur.
Common Methods
remove()
remove()
All Tychos objects can be removed from the scenario world scope. Once this done, you will not be able to reference the object as it will be removed from your scenario's collection of viewable objects.
rotate()
rotate()
object.rotate(angle=0, axis=vec(0, 0))
— Rotates the object by a given angle value in radian units. You can also provide an optional vector that identifies the axis of rotation.

rectangle
objects rotated at different anglesExample:
# Calculations editor
r_green.rotate(-pi/4)
r_blue.rotate(radians(90))
r_orange.rotate(radians(45))
clone()
clone()
All objects can be cloned. This creates and returns a duplicate object that can be modified independently.
circle
A circle
is drawn as a colored circle in the World View. Circle objects can have borders, labels, or even image overlays (see below).
c = circle()
c_big_red = circle(pos=vec(50, 0), radius=25, color="red")
c_green = circle(pos=vec(100, 0), color="green", opacity=.5)
c_green.border_size=5
c_green.border_color="blue"
c.label_text="hi"
c.label_color="white"
c.label_font="Courier"

Below is the constructor for the circle
object that shows its default values:
circle(
pos=vec(0,0),
radius=10,
color="black",
no_fill=False,
fill=None,
image="",
opacity=1,
visible=True,
motion_map=False,
label_text="",
label_color="black"
label_font="default",
label_style={},
border_size=0,
border_color="black",
border_style="none"
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
radius
— The radius of thecircle
.
ellipse
An ellipse
is drawn as a colored ellipse in the World View.
e1 = ellipse(pos=vec(0, 0), size=vec(10,5), color="green", opacity=.6)
e2 = ellipse(pos=vec(10, 0), size=vec(5,10), color="blue", opacity=.6)
e3 = ellipse(pos=vec(0, -10), size=vec(5,5), color="red", opacity=.6)

Below is the constructor for the ellipse
class that shows its default values:
ellipse(
pos=vec(0,0),
size=vec(10,5),
color=default_color,
no_fill=False,
fill=None,
border_size=0,
border_color=default_color,
border_style="none",
image="",
opacity=1,
visible=True,
motion_map=False,
label_text=""
label_color="black",
label_font="",
label_style={},
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
size
— The size of theellipse
given as a vector withx,y,z
coordinates.
These attributes may also be modified on the ellipse
after it is created, just like the circle
.
rectangle
A rectangle
is very similar to a circle
but it is represented as a colored rectangle in the World View.
# Initial State editor
r = rectangle(size=vec(20,10))
r_big_red = rectangle(pos=vec(25, 0), size=vec(25, 25), color="red")
r_green = rectangle(pos=vec(50, 0), color="green", opacity=.5)
r_green.border_size=5
r_green.border_color="blue"
r.label_text="hi"
r.label_color="white"
r.label_font="Courier"

Below is the constructor for the rectangle
object that shows its default values:
rectangle(
pos=vec(0,0),
size=vec(10,5),
color=default_color,
no_fill=False,
fill=None,
border_size=0,
border_color=default_color,
border_style="none",
image="",
opacity=1,
visible=True,
motion_map=False,
label_text="",
label_color=default_color,
label_font="default",
label_style={},
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
size
— The size of therectangle
given as a vector withx,y,z
coordinates.
arc
The arc
object represents a graphical elliptical arc that sweeps out from a starting angular position to an ending angular position.
# Different arc objects
a1 = arc(pos=vec(10, 10), size=vec(10, 10), start=0, end=pi/2, mode="chord", color="green", border_color="purple", border_size=3)
a2 = arc(pos=vec(-10, 10), size=vec(10, 5), start=0, end=5*pi/4, mode="open", color="red", border_color="purple", border_size=3)
a3 = arc(pos=vec(-10, -10), size=vec(10, 10), start=0, end=pi/2, mode="pie", color="orange", border_color="purple", border_size=3)
a4 = arc(pos=vec(-10, 20), size=vec(10, 10), start=pi, end=6*pi/5, mode="pie", no_fill=True, border_color="purple", border_size=3)

Below is the constructor for the arc
object that shows its default values:
arc(
pos=vec(0,0),
size=vec(10,5),
start=0,
end=pi,
mode="chord",
no_fill=False,
fill=None,
color=default_color,
border_size=0,
border_color=default_color,
border_style="none"
opacity=1,
visible=True,
motion_map=False,
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
size
— The size of thearc
ellipse given as a vector withx,y,z
coordinates.start
— The starting angular value for the arc sweep.end
— The ending angular value of the arc sweep.mode
— The render mode which can be "chord
", "open
", or "pie
".
arrow
The arrow
object represents a graphical arrow and is commonly used to illustrate vectors, but can be used for representing anything in your simulations.
# Initial State editor
c = circle(pos=vec(0,0), color="green")
a = arrow(pos=c.pos, size=vec(20, 20), color="purple")
a.show_components = True
Below is the constructor for the arrow
object that shows its default values:
arrow(
pos=vec(0,0),
size=vec(0,1),
color=default_color,
stroke=0,
style="none"
opacity=1,
show_components=False,
visible=True,
motion_map=False,
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
pos
— The initial position of yourarrow
tail as a vector withx,y,z
coordinates.size
— The size of thearrow
given as a vector withx,y,z
coordinates.stroke
— Thearrow
thickness in pixels.style
— Anarrow
can have a "dash" style, or a "dot" style, or "none" which is the default.show_components
— This flag tells Tychos to attach additional x and y component arrows.
line
The line
class draws a line and is commonly used to illustrate some connecting member like a string or cable, but could really represent anything you like.
myLine = line(pos=vec(0, 0), pos2=vec(20, 20), color="purple", stroke=2)
anotherLine = line(pos=vec(0, 0), pos2=vec(10, 20), color="green", stroke=10)

Below is the constructor for the line
class that shows its default values:
line(
pos=vec(0,0),
pos2=vec(1,0),
color=default_color,
stroke=1,
style="none",
opacity=1,
visible=True,
motion_map=False,
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
pos
— coordinates for the starting point of theline
as vectorpos2
— coordinates of the termination point of theline
as a vector.stroke
— Stroke value that determines the visual thickness of theline
. This is measured in pixels.style
— Sets theline
as either solid (default = "none") or "dash" for a dashed line, or "dot" for a dotted line.
poly_line
The poly_line
class draws a series of connected lines between a given set of points. This object can be used to represent a complex path or a shape other than a circle or rectangle.

Below is the constructor for the poly_line
class that shows its default values:
poly_line(
pos=vec(0,0),
color=default_color,
stroke=1,
style="none",
fill=None,
no_fill=True,
opacity=1,
visible=True,
motion_map=False,
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
stroke
— Stroke value that determines the visual thickness of thepoly_line
. This is measured in pixels.style
— Can be"none"
for solid segments,"dash"
for dashed line segments or"dot"
for dotted line segments.
poly_line
objects have a number of methods for manipulating the poly_line
points, like adding new points, changing existing points, removing points, etc:
set_points: (points)
-> Set the points for thepoly_line
given aList
of points.translate: (delta_position)
-> Move all the points according to a vector.rotate: (angle, axis)
-> Transform the points a certain angle measurement about an axis. This axis is relative to the first point in thepoly_line
.npoints():
-> Returns the number of points in thepoly_line
.append: (*points)
-> Add a point (or many points) to the end of thepoly_line
.unshift: (*points)
-> Add a point (or many points) at the beginning of thepoly_line
.shift: ()
-> Remove the first point in thepoly_line
object.splice: (start, how_many, *points)
-> Insert a point or several points anywhere at the specific index position. You can also identify how many points you would like to remove from thepoly_line
as well.pop: (n)
-> Get the vector for point number n and remove it. Can use negative values, where -1 is the last point, -2 the next to the last, etc.clear: ()
-> Remove all the points in thepoly_line
.modify: (n, point)
-> Modify the point at the specified n position, replacing it with the given vector.slice: (start, end)
-> Returns the set of points (but does not remove them) from thepoly_line
object beginning at thestart
value and ending at theend
index position.
spring
A spring
is a visual representation of a common elastic connector that displays a given number of coils that dynamically change shape once the dimensions of the spring
are changed in the Calculations Pane.
The code below shows the three different spring
objects above that have different lengths, widths and coil numbers. The circle
objects are shown just for reference.
# Initial State editor
c1 = circle(pos=vec(0, 0), radius=2, color="green")
spring1 = spring(pos=vec(0, 20), pos2=c1.pos, color="black", coils=20, width=2)
c2 = circle(pos=vec(10, 0), radius=2, color="green")
spring2 = spring(pos=vec(10, 20), pos2=c2.pos, color="black", coils=10, width=4)
c3 = circle(pos=vec(20, 0), radius=2, color="green")
spring3 = spring(pos=vec(20, 20), pos2=c3.pos, color="black", coils=20, width=2)

Below is the constructor for the spring
class that shows its default values:
spring(
pos=vec(0,0),
pos2=vec(1,0),
color=default_color,
coils=5,
width=10,
stroke=1,
opacity=1,
visible=True,
motion_map=False,
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
pos
— coordinates for the starting point of thespring
as a 2D vector.pos2
— coordinates of the termination point of thespring
as 2D vectorcoils
— The number "coil" zig-zags.width
— The width of the "coil" zig-zags.stroke
— Stroke value that determines the visual thickness of thespring
. This is measured in pixels.
These attributes may also be modified after the spring
is created.
label
You can add text labels to any scenario using the label
object.
lbl_dog = label(pos=vec(0,0), size=vec(20,20), text="dog", color="green")
lbl_cat = label(pos=vec(0,-15), size=vec(10,10), text="cat", color="red")
lbl_mouse = label(pos=vec(0,15), size=vec(10,10), text="mouse", color="blue")
lbl_dog.font="Impact"
lbl_cat.font="Times"
lbl_mouse.font="monospace"
lbl_dog.style = {"text-shadow":"3px 3px 3px black"}
lbl_cat.style = {"font-style":"oblique"}
lbl_mouse.style = {"text-decoration":"underline"}// Some code

Below is the constructor for the label
class that shows its default values:
label(
pos=vec(0,0),
size=vec(10,10),
text="",
color=default_color,
font="default",
style={},
opacity=1,
visible=True,
motion_map=False
skew_x = 0,
skew_y = 0,
flip_x = False,
flip_y = False,
blur = 0
)
size
— The width and height of thelabel
as a 2D vector.text
— The text of thelabel
as a string.font
— CSS font family identifier, e.g. "Times", or "Courier"style
— A dictionary with key value pairs that represent CSS font styling rules.
These attributes may also be modified after the label
object is created.
compound
Compound objects allow you to group any of the above graphical objects together so that they can all be animated as a single object. Compound objects can even be added to other compound objects to make some complex object compositions.

Below is the constructor for the compound
class that shows its default values:
compound(
pos=vec(0,0),
opacity=1,
visible=True,
)
pos
— coordinates for the center point of thecompound
as a 2D vector.opacity
— The objects in thecompound
will be drawn with an opacity between 1 and 0, representing 100% opaque to 100% transparent.visible
— The objects in thecompound
can be hidden from view by setting this flag toFalse
.
These attributes may also be modified after the compound
object is created.
compound.add(*objects)
To add an object to a compound, you simply call the add method with the object variable that you want to add. You can add as many objects as you want in one call.
# Make some graphic objects.
c1 = circle(pos=vec(-5, 0), radius=1, color="orange")
c2 = circle(pos=vec(5, 0), radius=1, color="orange")
r1 = rectangle(pos=vec(0,0), size=vec(11, 1), color="orange")
# Add them to a compound
cmp1 = compound(pos=vec(0,0))
cmp1.add(c1, c2, r1)
compound.remove()
compound
objects, like all Tychos objects can be removed from the scenario world scope. Once this is done, you will not be able to reference the objects as they will all be removed from your scenario's collection of viewable objects.
compound.clone()
As is the case with all other Tychos objects, compounds can be cloned, the only difference is that all the objects in the compound are also cloned.
World
The world object represents the viewable area of the scenario.
world.set_extents
You can set the viewable extents of the world in the Settings Pane, or by calling the following method on the world object:
world.set_extents(pos=vec(0,0), size=vec(10,10))
The inputs are two vector objects representing the center position of the view of the world, and secondly the size of the viewable world.
Gradient Fills
The radial_gradient
and linear_gradient
objects are used as fill parameters for the following objects:
circle
rectangle
ellipse
arc
poly_line
radial_gradient
Below is the constructor for the radial_gradient
object that shows its default values:
radial_gradient(
start_x=50,
start_y=50,
end_x=50,
end_y=50,
colors=[]
offsets=[]
)
start_x
— This attribute defines the relative x position (as a percentage) of the start the radial gradient.start_y
— This attribute defines the relative y position (as a percentage) of the start the radial gradient.end_x
— This attribute defines the relative x position (as a percentage) of the end the radial gradient.end_y
— This attribute defines the relative y position (as a percentage) of the end the radial gradient.colors
— A list of HTML color values for yourradial_gradient
, e.g. "red" or "#ff0000".offsets
— A list of corresponding numerical values defining where the associated gradient stop is placed along the gradient.
Example:
c1 = circle(pos=vec(-50,0), radius=10)
c1.fill = radial_gradient(start_x=10, start_y=10, end_x=30, end_y=30, colors=["white", "red", "black"], offsets=[0,50,100])
r1 = rectangle(size=vec(20,20), pos=vec(0,50))
r1.fill = radial_gradient(start_x=10, start_y=10, end_x=30, end_y=30, colors=["white", "purple", "black"], offsets=[0,40,100])
e1 = ellipse(pos=vec(50,50), size=vec(20, 10))
e1.fill = radial_gradient(start_x=10, start_y=10, end_x=30, end_y=30, colors=["white", "purple", "black"], offsets=[0,40,100])
a1 = arc(pos=vec(-50, 50))
a1.fill = radial_gradient(start_x=10, start_y=10, end_x=30, end_y=30, colors=["white", "purple", "black"], offsets=[0,40,100])
p1 = poly_line(pos=vec(0, 0), stroke=1, color="red")
p1.append(vec(0,0))
p1.append(vec(25,0))
p1.append(vec(0,25))
p1.append(vec(0,0))
p1.fill = linear_gradient(colors=["black", "red"])
c2 = circle(pos=vec(50,0), radius=10)
c2.fill = linear_gradient(colors=["black", "red"])
r2 = rectangle(size=vec(20, 20), pos=vec(0,-50))
r2.fill =linear_gradient(colors=["yellow", "red"])
e2 = ellipse(pos=vec(50,-50), size=vec(20, 10))
e2.fill = linear_gradient(colors=["orange", "red", "black"], offsets=[0,30,100])
a2 = arc(pos=vec(-50, -50))
a2.fill = linear_gradient(colors=["red", "black"], offsets=[30, 100], angle=pi/2)

linear_gradient
Below is the constructor for the linear_gradient
object that shows its default values:
linear_gradient(
angle=0,
colors=[]
offsets=[]
)
angle
— This attribute transforms the linear gradient by rotating the gradient from the relative center position of the filled object. The value is defined in radians.colors
— A list of HTML color values for yourradial_gradient
, e.g. "red" or "#ff0000".offsets
— A list of corresponding numerical values defining where the associated gradient stop is placed along the gradient.
Interface Widgets
Tychos also provides several "widgets" for displaying data in different ways as well as adding user interactivity so that your simulations can respond to input.
graph
A graph
is a 2-dimensional chart of data that you specify in the Initial State editor. Each graph
that is created will appear by default on the right side of the World View, but can be aligned to the left instead. Your program needs to add points to the graph with the plot
command.
g1 = graph(title="Line Graph", align="left", width="50%", height=200)
g1.plot(color="purple", mode="line", x=[0,1,2,3], y=[0, 10, 10, 0], fill=True)
g1.plot(color="green", mode="line", x=[0,1,2,3], y=[0, 2, 4, 9], fill=False)

g2 = graph(title="Scatter Graph", align="right", width="50%", height=400)
x_vals = random.sample(range(-50, 50), 100)
y_vals = random.sample(range(0, 100), 100)
g2.plot(color="orange", mode="scatter", x=x_vals, y=y_vals)

Here is the constructor for creating a graph
object
graph(
title="Graph",
align="right",
y_axis="Y",
x_axis="X",
width=500,
height=350,
plot_rate=None
)
title
= Optional text that will appear at the top of the graph.align
= Optional value of "left
" or "right
" to align the graph to the corresponding side of the view window.y_axis
= Optional text that will appear on the left side of the graph as the vertical axis label.x_axis
= Optional text that will appear at the bottom of the graph as the horizontal axis label.width
= Optional numeric value in pixels for setting the width, or a text value percentage e.g. "50%" or "90%".height
= Optional numeric value in pixels for setting the height, or a text value percentage e.g. "50%" or "90%".plot_rate
= Optional numerical value greater than 0 that sets the individual graph's plotting schedule. This over rides the default Graph Strobe Rate value set in the Settings tab.
Plotting Values
To plot values for the graph, the plot
method is used. You can either plot points by calling the plot method with the x and y arguments set to single numerical inputs, or to plot more than a single point, you can instead set the x and y arguments to be lists of numerical values.
When plotting, Tychos will plot the points you specify when the simulation plot timer has expired. This is called "strobing" the graph. There is a default plot timer set in the Settings tab called Graph Strobe Rate for the scenario, but this can be over ridden by setting the graph's plot rate.
The arguments for the plot method are shown below:
graph.plot(
x=0,
y=0,
color=default_color,
mode="line",
fill=False
)
x
= This is either a single numerical value or a list of numerical values.y
= This is either a single numerical value or a list of numerical values.color
= Optional "line" or "scatter" that will either display the points as connected with lines, or not. The default is to connect the plotted points with lines.mode
= Optional "line" or "scatter" that will either display the points as connected with lines, or not. The default is to connect the plotted points with lines.fill
= Optional boolean value for filling in the plotted area.
Clearing Values
To clear values for the graph, the clear
method is used. Clearing the plotted values occurs immediately when the method is called, clearing all the plotted values from the graph:
graph.clear()
bar_chart
A bar_chart
is a chart of data that is displayed as a set of bars representing an array of data values. Each bar_chart
that is created will appear on the right side of the World View.
bc_energy = bar_chart(title="Energy Bar Chart", min=0, max=500)
bc_energy.data = [150, 250, 200, 500]
bc_energy.colors = ["red", "blue", "green", "black"]
bc_energy.labels = ["KE", "Ue", "Ug", "TE"]

bar_chart
with four bars.title
= Optional text that will appear at the top of thebar_chart.
align
= Optional value of "left
" or "right
" to align the bar chart to the corresponding side of the view window.min
= Optional minimum value whose default is 0. If any bar data value is less than this minimum, the bar will be truncated.max
= Optional maximum value whose default is 1. This sets the maximum viewable bar height. If any bar data value is greater than this maximum, the bar will be truncated.width
= Optional numeric value in pixels for setting the width, or a text value percentage e.g. "50%" or "90%".height
= Optional numeric value in pixels for setting the height, or a text value percentage e.g. "50%" or "90%".
bar_chart.data
bar_chart.data
— Sets the data values for the bars in the bar chart.
# Set the data for the bars
bc_energy.data =[x,y,z,w] # Where x, y, z, and w are numerical data values
bar_chart.labels
bar_chart.labels
— Defines a set of labels - one label corresponding to each data bar in the chart. If the number of labels does not match the number of bars set by the number of data values, then a numbered label will be assigned to the extra data value.
# Set the labels for the bars
bc_energy.labels = ["KE", "Ue", "Ug", "TE"]
bar_chart.colors
bar_chart.colors
— List of colors, one color corresponding to each data bar in the chart. If the number of colors does not match the number of bars set by the number of data values, then any extra bars will be given the default HTML color of #aaa
.
# Set the colors for the bars
bc_energy.colors = ["red", "blue", "green", "black"]
pie_chart
A pie_chart
is a chart of data that is displayed as circle that is "sliced" into different pieces of a "pie" representing the relative proportion to the sum of all the values in the chart's data. Each pie_chart
that is created will appear on the right side of the World View by default, but can be aligned to the left.
pc = pie_chart(title="Pie Chart", data=[10,20, 30], width=300, height=200)
pc.labels = ["yes", "no", "maybe"]
pc.colors = ["lightgreen", "red", "gold"]

pie_chart
.The constructor options for adding a pie_chart
to your scenario are the following:
title
= Optional text that will appear at the top of thepie_chart.
align
= Optional value of "left
" or "right
" to align thepie_chart
to the corresponding side of the view window.width
= Optional numeric value in pixels for setting the width, or a text value percentage e.g. "50%" or "90%".height
= Optional numeric value in pixels for setting the height, or a text value percentage e.g. "50%" or "90%".
pie_chart.data
pie_chart.data
— Sets the data values for the pie slices in the pie chart.
# Set the data for the bars
pc.data =[x,y,z] # Where x, y, z, are numerical data values
pie_chart.labels
pie_chart.labels
— Defines a set of labels - one label corresponding to each data slice in the chart. If the number of labels does not match the number of data values, then a numbered label will be assigned to the extra data value.
# Set the labels for the pie chart slices
pc.labels = ["yes", "no", "maybe"]
pie_chart.colors
pie_chart.colors
— List of colors, one color corresponding to data value in the chart. If the number of colors does not match the number of data values, then any extra values will be given the default colors.
# Set the colors for the data values
pc.colors = ["lightgreen", "red", "gold"]
table
A table
displays data organized in columns and rows.
Each table
that is created will appear on the right side of the World View. When creating a table
you can give it a title, and will need to define the column names for the table
. You can also optionally define the precision for the numerical values being displayed in the table.
Below is the constructor for the table
widget and default values:
table(title="Table", align="right", columns=[], precision=4)
title
= Optional text that will appear at the top of thetable
widget.align
= Optional value of "left
" or "right
" to align the table to the corresponding side of the view window.columns
— A list of strings representing the column names that will appear in the table.precision
— Optional precision level for representing numerical values.
table.add_row([value1, value2, ...])
table.add_row([values])
— This adds a row of data to the table. Keep in mind that you must supply a list of values whose length is equal to that of the columns in the table.
values
= A list of values corresponding to the columns in the table.

Example:
# Initial State editor
table1 = table(title="example")
table1.columns = ["Time", "X Pos", "Y Pos"]
table1.precision = 6
# Calculations editor
# c is a circle object that is moving
table1.add_row([t, c.pos.x, c.pos.y])
meter
A meter
is a numeric display of data. Each meter
that is created will appear on the left side of the World View. Your program needs to tell the meter
what value it needs to display by using the display
command.

Below is the constructor for the meter
widget and default values:
meter(title="Meter", align="left", color="black", suffix="")
title
= Optional text that will appear at the top of themeter
widget.align
= Optional value of "left
" or "right
" to align the meter to the corresponding side of the view window.color
— HTML color value for yourmeter
, e.g. "red" or "#ff0000".suffix
— text added at the end of the data value display.
meter.display()
meter.display(value)
— Displays the value on the meter
.
value
= Numeric value to be displayed.
Example:
# Initial State editor
mt = meter(title="Time", color="red", suffix="s")
# Calculations editor
mt.display(t)
gauge
A gauge
is an analog display of data that is very similar to a meter
that you specify in the Initial Sate pane. Each gauge
that is created will appear on the left side of the World View. Gauges also need to to be set up with a specific minimum and maximum value for identifying the range of the gauge
. Your scenario needs to tell the gauge
what value it needs to display by using the display
command.

Below is the constructor for the Gauge
widget and default values:
gauge(title="Gauge", align="left", min=0, max=100, color="black")
title
= Optional text that will appear at the top of thegauge
widget.align
= Optional value of "left
" or "right
" to align the gauge to the corresponding side of the view window.min
= The minimum value of thegauge
max
= The maximum value of thegauge
color
— HTML color value for yourgauge
, e.g. "red" or "#ff0000".
gauge.display()
gauge.display(value)
— Displays the value in the Gauge.
Example:
# Initial State editor
g1 = gauge(title="Value 1", min=0, max=200, color="orange")
g2 = gauge(title="Value 2", min=-100, max=100, color="purple")
g3 = gauge(title="Value 3", min=0, max=100, color="blue")
# Calculations editor
val = 44
g1.display(val)
g2.display(val)
g3.display(val)
button
A button
is a clickable widget that you can add to your scenarios that allows you to respond to the mouse in several ways.

To create a button, you can supply all the following properties defined below:
button(
title = "Button",
align = "left",
color = "red",
label_text = ""
label_color = "black",
label_font = "default",
style = "normal",
on_click = None
on_mouse_over = None
on_mouse_out = None
on_mouse_down = None
on_mouse_up = None
)
title
- Optional text that will appear at the top of the button widget.align
= Optional value of "left" or "right" to align the button to the corresponding side of the view window.color
— HTML color value for your button, e.g. "red" or "#ff0000".label_text
- Text that you want to appear on the button itself.label_color
- HTML color value for your label text, e.g. "red" or "#ff0000".label_font
- A font family name for the label text, like "Courier" or "Times New Roman".style
- This can be one of three options, "arcade", "normal", or "alert", but can also be a CSS style object, i.e. {text-decoration: "underline"}on_click
— The name of a function that will be called whenever the button is clicked.on_mouse_over
— The name of a function that will be called whenever the moves over the button.on_mouse_out
— The name of a function that will be called whenever the mouse moves away from the button.on_mouse_down
— The name of a function that will be called whenever the mouse button is pressed while on the button.on_mouse_up
— The name of a function that will be called whenever the button is release while on the button.
Example
b1 = button(title="Arcade", style="arcade", color="green", label_text="YES")
b1.label_font = "Impact"
b1.label_color = "white"
b2 = button(title="Normal", style="normal", label_text="Hello!")
b2.style = {"text-decoration":"underline"}
b2.color = "lightblue"
b3 = button(title="Alert", style="alert", label_text="Danger!")
b3.label_font = "Courier"
toggle
A toggle
is an interactive widget that allows you to associate a boolean value (True
or False
) with the state of the toggle
widget.

False

True
Below is the constructor for the toggle
widget and default values:
toggle(
title="Toggle",
align="left"
)
title
= Optional text that will appear at the top of thetoggle
widget.align
= Optional value of "left
" or "right
" to align the toggle to the corresponding side of the view window.
Toggle.value
x = toggle.value
— Returns the current value of the toggle
. This is read/write.
Example:
# Initial State editor
t1 = toggle(title="Activate")
# Calculations editor
is_active = t1.value
slider
A slider
is an interactive widget that allows you to link a value in your scenario to the current value of a horizontal slider.

slider
widget with a value of 0.Below is the constructor for the slider
widget and default values:
slider(
title="Slider",
align="left",
min=0,
max=100,
value=0,
step=1
)
title
= Optional text that will appear at the top of theslider
widget.align
= Optional value of "left
" or "right
" to align the slider to the corresponding side of the view window.min
= The minimum value of theslider
max
= The maximum value of theslider
step
= The step increment of theslider
slider.value
x = slider.value
— Returns the current value of the Slider. This is read/write.
Example:
# Initial State editor
s1 = slider(title="I'm A Slider", min=0, max=100, step=2)
# Calculations editor
x = s1.value
Input
An input
is an interactive widget that allows you to link a value in your scenario to the current value input into a text box.

input
widgetBelow is the constructor for the Input
widget:
input(title="Input", align="left", min=0, max=100, step=1)
title
— The text title of theinput
align
= Optional value of "left
" or "right
" to align the input to the corresponding side of the view window.min
= The minimum value that the user can enter in theinput
max
= The maximum value that the user can enter in theinput
step
= The step increment of theinput
input.value
x = input.value
— Returns the current value of the Input
.
Example:
# Initial State editor
input_widget = input(title="Size", max=10, min=-10, step=.1)
# Calculations editor
x = input_widget.value
menu
A menu
is an interactive widget that allows you to link a value in your scenario to the current value selected from a drop-down menu.

menu
widgetBelow is the constructor for the menu
widget:
menu(title="Menu", align="left", choices=[], values=[])
title
— The text title of theinput
align
= Optional value of "left
" or "right
" to align the menu to the corresponding side of the view window.choices
— Alist
of menu choices.values
— An optionallist
of corresponding menu values for each choice. If no values are given, the values are assumed to be the choices.
menu.value
x = menu.value
— Returns the current value of the menu
.
Example:
# Initial State editor
m = menu(title="Pick One", choices=["A","B","C"], values=[1,2,3])
# Calculations editor
x = menu.value
control_panel
A control_panel
widget allows you to group other widgets together which better organizes your widgets. Once you create a control_panel
, you simply add other UI widgets to it. You can can set the layput of the control_panel to be either "row" or "column:.

Below is the constructor for the control_panel
widget:
control_panel(
title="Control Panel",
align="left",
layout="row")
title
— The text title of thecontrol_panel
align
= Optional value of "left
" or "right
" to align the control panel to the corresponding side of the view window.layout
— Either "row" to arrange the contained widgets horizontally, or "column" to arrang them vertically.
control_panel.add(*widgets)
To add widgets to a control panel, you simply supply the widgets' variable names to the add function, like this::
# Define the Sliders
s_width = slider(title="Width", min=1, max=100, step=1)
s_height = slider(title="Height", min=1, max=100, step=1)
s_shade = slider(title="Shade", min=0, max=255, step=1)
s_opacity = slider(title="Opacity", min=0, max=1, step=.01, value=1)
cp = control_panel(title="Change the Rectangle", layout="column", align="left")
cp.add(s_width, s_height, s_shade, s_opacity)
The above would create a control_panel that looks like this:

Interactivity
The following section describes additional interactivity that you can add through the use of keyboard
and mouse
objects.
keyboard
The keyboard
object represents your computers keyboard and has commands to see if any keys are pressed during a simulation.
keyboard.is_down
keyboard.is_down(key)
-> boolean
— Return 1/0 whether key
is currently down
keyboard.last_pressed
keyboard.last_pressed(key)
-> boolean
— was key
typed? i.e. key was pushed down then released.
keyboard.keys
keyboard.keys
-> list
— returns a list of string values representing all keys currently being pressed.
mouse
The mouse
object represents your computer's mouse.
mouse.pos
mouse.pos
-> vec
— Returns two dimensional vector representing the position of the mouse in the simulation space.
mouse.is_down
mouse.is_down(button_num=0)
-> boolean
— Returns whether the mouse button is pressed. button_num
— Which button to check? 0 = primary button, 1 = secondary, etc.
mouse.is_over
mouse.is_over(object)
-> boolean
— Returns whether the mouse is positioned over an object that is either a circle
or a rectangle
. It currently does not work for any of the other Tychos objects.
Audio
The audio
object can be used to add sound to your scenarios. This can be done by creating an oscillator
that plays a continuous frequency using a specified wave type, or by creating a sound
object that plays an audio file given a URL, or finally by just playing a specified tone for a specified amount of time.
audio.sound
To create a sound object, you need to specify a URL for the location of the .wav, .ogg, or .mp3 file
my_sound = audio.sound("https://www.example.com/my_cool_sound.wav")
The sound object has these methods and attributes:
sound.play()
- Plays the sound file.sound.stop()
- If the sound file is currently playing, it stops the sound file.sound.volume
- A numeric value that determines the volume that the sound file will play at. Value must be larger than 0 to hear the sound.sound.playback_rate
- A numeric value that determines the playback speed of the file. If a negative value is given, the file plays backwards.
audio.oscillator
An oscillator object is created using this constructor method:
my_oscillator = audio.oscillator(freq=400, volume=1, type="sine")
The oscillator object has these methods and attributes:
oscillator.start()
- Starts the oscillation.oscillator.stop()
- Stops the oscillation.oscillator.freq
- A numeric value that determines the frequency of the sound wave that the oscillator will generate.oscillator.volume
- A numeric value that determines the volume of the sound wave that the oscillator will generate. Value must be larger than 0 to hear the sound.oscillator.type
- A string value of "sine", "square", "sawtooth", or "triangle" that determines the type of oscillation.
Finally, you can also call a method directly on the audio
object for generating a tone for a specified amount of time:
audio.play_tone
audio.play_tone(freq, volume, time)
— Produces an audio tone for the specified time at the specified frequency (freq
) and volume.
CSV Files
Comma separated files can be loaded into the current session of Tychos, and then the data can be read into your scenarios.
You need to upload the file through the interface, found in the Settings Tab of the Hack Panel:
Once this has been done, you can access the data in the file using the csv_files
object.
csv_files
This object is a list of Python dictionaries representing the data contained in each file.
You access each file as you would any list in Python:
my_file = csv_files[0]
CSV file
For example, let's say your CSV file has the name "my_data.csv"
and looks like this:
Time, X, Y
0, 10, -10
1, 11, -9
2, 12, -8
The dictionary has two keys, one representing the name of the file, and the other representing the data in the file:
name = my_file["name"] # Returns string "my_data.csv"
data = my_file["data"] # Returns list of dictionary objects
The data is itself a list, representing the rows of the data in the file. Each row is a dictionary whose keys correspond to the column headers in the CSV file:
my_file.data[1] # Returns {"Time":"0", "X":"10", "Y":"-10"}
Then to access the X value in the file located at row 2 of the data (line #3 above), then you would type:
x = float(data[1]["X"] # Returns 11.0
Last updated
Was this helpful?