# I read the first mail and find an algorithm for the special case of
"moving point particles in a 2D pentagon boundary". The answer is
given as using pyode script but I am excited about my solution and want
to share it with you :-)
# The easy part of using a rectangular boundary (of which sides
are parallel to the axes) is that, one should only check if x position
of a particle is greater than x_max (coordinate of the right side of
the rectangle), if x<x_min, y<y_min and y>y_max. And if it
exceeds the boundary in the next step of the simulation according to
ODE (or any kind of calculation) of the simulation, then reverse the
velocity in that direction (and mirror the coordinate using the
boundary line as the axis of symmetry).
# So, We can try to use this simple idea in pentagon case.
# We can divide the pentagon in five triangles: Put a point in the center and draw lines to vertexes.
http://www.math.union.edu/~dpvc/courses/1999-00/MTH012-02-WI00/notes/DividedPentagon.jpg
# Call the bottom triangle 0th triangle, turn in counter clockwise direction and call other triangles as 1st, 2nd...
# The algorithm is as following:
# First determine in which triangle the particle is. One can get
this using an atan2(x,y) like function. atan2 returns the angle between
the position of the particle and the x-axis. We can beforehand
calculate the angles between the sides of triangles and the x-axis. And
using this information we can find in which triangle the particle is.
(or maybe y/x is just enough for determination)
# If it is in the zeroth triangle, all we have to do is to look
for the y position. If it is less than minus of the height of the
bottom triangle then it exceeds the boundary. Apply the reflection like
in a rectangular boundary.
# One can not do this in other triangles (1st, 2nd...). Because
their boundaries are not parallel to axes but they have slopes. So, if
we rotate the coordinate system, until the bottom side of the triangle
becomes parallel to y-axis, e.g.
rotate 72 degrees clock wise for 1st triangle, 2*72 degrees for the
2nd..., (360/5=72) we can apply this reflection law. (this is the trick)
# After applying the reflection one must rotate the coordinate system counter clock wise.
# Here is the formula of rotating a coordinate system (taken from
Arfken, Mathematical Methods for Physicists). (x,y) is the coordinate
in the old system and (x', y') is the coordinate in the new (rotated)
system, a is the angle of rotation.
x' = x*cos(a) + y*sin(a)
y' = -x*sin(a) + y*cos(a)
#
But one don't have to make trigonometric calculations for every
rotation, because a is constant. It is 72 or integer multiples of 72
and one can calculate sines and cosines beforehand e.g. sin(72) =
0.9511, cos(72)=0.3090, for CCW rotations, and sin(-72)=-0.9511,
cos(-72)=0.3090 for CW rotations.
# Here is the pseudo code:
take_the_simulation_one_step_further()
hi,
I need to bounce objects against a border that is not running parallel
to x or y, but in a gradient angle. actually I need to bounce the
objects within a pentagon. iSeg2D allows object to cross the border when
they bounce, there is no x/y-max for gradients.
I am also looking into frank's pyode script. Is there something in it,
that can do that?
marius.
_______________________________________________
PD-list@iem.at mailing list
UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list