Contents
Articles
Behaviors
Books
Director News
Director Web Sites
FAQ
Games
Mailing Lists
News Groups
Project Examples
Reviews
Software
Tools
Useful Web Sites
Utilities
Xtras

Don't miss these
Wheel Mouse
Killing Moon / Director
Check QuickTime Version
Impressario Thumbnail Slider
DirectCommunication
Apples
Progress Bar
Drag sprite around a snap grid
Internet Explorer 5 - PC
QTGrab
 

 

 

Behavior Math

Added on 8/24/2004

 

Compatibilities:
D8_5 D9 FR Parent

This item has not yet been rated

Author: sirozz

(sorry for bad english) This is my math script. You can do reverse kinematics, trigo, bezier, momentum, vector calculation, prime numbers and a lot of things with it. Ceci est le script parent que j'utilise pour réaliser divers calculs comme de l'inverse cinématique, de la trigo, des courbes de bézier, des momentums, du calcul vectoriel, rechercher des nombres premiers etc...

Download PC Source
---------------------------------
-- MATH OBJ                    --
-- Pierre Cornier 2004         --
-- cornier_pierre@hotmail.com  --
---------------------------------

-- degToRad(angle en degrés)
-- fastDegToRad(angle en degrés(entier))
-- radToDeg(angle en radians)
-- rotate2dVector(point1, angle en radians, pivot)
-- fastRotate2dVector(point1, angle en degrés(entier), pivot)
-- fastMag2dVector(point1)
-- mag2dVector(point1)
-- fastDistance2d(point1, point2)
-- distance2d(point1, point2)
-- vectorToRad(point1)
-- vectorToDeg(point1)
-- dot2d(point1, point2)
-- fastDot2d(point1, point2)
-- aCos(angle en radians)
-- getIntersectH(point1, point2, point3)
-- getFarAngle(c, a, b)
-- bezier(p1, p2, p3, p4, t)
-- normalise2d(vecteur)
-- setRange(oldMin, oldMax, newMin, newMax, n)
-- toreSurface(xMax, yMax, point)
-- isInsidePoly(listePoints, point)
-- sigmoid(x, n)
-- stepTo(v, num, cible)
-- stepPoint(v, pt, cible)
-- limitPoint(point, pointMin, pointMax)
-- isPrime(p)


property deg2rad
property rad2deg
property cosinus, sinus
property radians


on new me
  deg2rad = pi / 180
  rad2deg = 180 / pi
  cosinus = []
  sinus = []
  radians = []
  repeat with n = 1 to 360
    cosinus[n] = cos(n)
    sinus[n] = sin(n)
    radians[n] = n * deg2rad
  end repeat
  return me
end





----------------------------------------------------
-- degToRad(angle en degrés)
-- retourne l'angle en radians
----------------------------------------------------
on degToRad me, n
  return n * deg2rad
end





----------------------------------------------------
-- fastDegToRad(angle en degrés)
-- retourne l'angle en radians
-- angle en degrés est une valeur entière
----------------------------------------------------
on fastDegToRad me, n
  return radians[n]
end





----------------------------------------------------
-- radToDeg(angle en radians)
-- retourne l'angle en degrés
----------------------------------------------------
on radToDeg me, n
  return n * rad2deg
end





----------------------------------------------------
-- rotate2dVector(point1, angle en radians, pivot)
-- fait pivoter le point1 autour du pivot
----------------------------------------------------
on rotate2dVector me, p1, aAngle, pivot
  vecteur = p1 - pivot
  x1 = vecteur[1] * cos(aAngle) + vecteur[2] * sin(aAngle)
  y1 = vecteur[1] * sin(aAngle) - vecteur[2] * cos(aAngle)
  return pivot + point(x1, y1)
end





----------------------------------------------------
-- fastRotate2dVector(point1, angle en degrés(entier), pivot)
-- fait pivoter le point1 autour du pivot
----------------------------------------------------
on fastRotate2dVector me, p1, aAngle, pivot
  vecteur = p1 - pivot
  x1 = vecteur[1] * cosinus[aAngle] + vecteur[2] * sinus[aAngle]
  y1 = vecteur[1] * sinus[aAngle] - vecteur[2] * cosinus[aAngle]
  return pivot + point(x1, y1)
end





----------------------------------------------------
-- fastMag2dVector(point1)
-- retourne la magnitude du vecteur
----------------------------------------------------
on fastMag2dVector me, p
  return sqrt(p[1] * p[1] + p[2] * p[2])
end






----------------------------------------------------
-- mag2dVector(point1)
-- retourne la magnitude du vecteur
----------------------------------------------------
on mag2dVector me, p
  v = vector(p[1], p[2], 0)
  return v.magnitude
end






----------------------------------------------------
-- fastDistance2d(point1, point2)
-- retourne la distance entre le point1 et le point2
----------------------------------------------------
on fastDistance2d me, p1, p2
  v1 = vector(p1[1], p1[2], 0)
  v2 = vector(p2[1], p2[2], 0)
  return v1.distanceTo(v2)
end






----------------------------------------------------
-- distance2d(point1, point2)
-- retourne la distance entre le point1 et le point2
----------------------------------------------------
on distance2d me, p1, p2
  p3 = p2 - p1
  return me.mag2dVector(p3)
end






----------------------------------------------------
-- vectorToRad(point1)
-- retourne l'angle en radians formé par le vecteur
----------------------------------------------------
on vectorToRad me, p
  return atan(p[1], p[2])
end






----------------------------------------------------
-- vectorToDeg(point1)
-- retourne l'angle en degrés formé par le vecteur
----------------------------------------------------
on vectorToDeg me, p
  return atan(p[1], p[2]) * rad2deg
end






----------------------------------------------------
-- dot2d(point1, point2)
-- retourne le cosinus de l'angle formé par les 2 vecteurs
----------------------------------------------------
on dot2d me, p1, p2
  v1 = vector(p1[1], p1[2], 0)
  v2 = vector(p2[1], p2[2], 0)
  return v1.dot(v2)
end






----------------------------------------------------
-- fastDot2d(point1, point2)
-- retourne le cosinus de l'angle formé par les 2 vecteurs
----------------------------------------------------
on fastDot2d me, p1, p2
  return p1[1] * p2[1] + p1[2] * p2[2]
end






----------------------------------------------------
-- aCos(angle en radians)
-- retourne l'inverse cosinus de l'angle
----------------------------------------------------
on aCos me, n
  a = Sqrt(-n * n + 1)
  if a = 0 then return 0
  return atan(-n / a) + 2 * 0.7854
end






----------------------------------------------------
-- getIntersectH(point1, point2, point3)
-- retourne le point d'intersection entre la hauteur
-- et la base du triangle
----------------------------------------------------
on getIntersectH me, p1, p2, p3
  --           p3
  --          /|
  --     a  /  |    b
  --      /    h    
  --    /      |      
  -- p1 ------p4-------- p2
  --       c
  c = p2 - p1
  dota = me.fastDot2d(p3 - p1, c)
  dotb = me.fastDot2d(p2 - p3, c)
  if dota + dotb = 0 then dota = .001
  return p1 + (c * dota) / (dota + dotb)
end






----------------------------------------------------
-- getFarAngle(c, a, b)
-- retourne l'angle opposé à c en radians dans le triangle a, b, c
----------------------------------------------------
on getFarAngle me, c, a, b
  if a*b = 0 then return 0
  return me.aCos((a*a+b*b-c*c)/float(2*a*b))
end






----------------------------------------------------
-- bezier(p1, p2, p3, p4, t)
-- retourne le point à la position(t) sur la courbe de bezier :
-- p1 est le point numéro 1
-- p2 est le point de tangente 1
-- p3 est le point de tangente 2
-- p4 est le point numéro 2
-- t est la position du point sur la courbe (0<=t<=1)
----------------------------------------------------
on bezier me, p1, p2, p3, p4, t
  px = power(1-t,3) * p1[1] + 3 * power(1-t,2) * t * p2[1] + 3 * (1-t) * power(t,2) * p3[1] + power(t,3) * p4[1]
  py = power(1-t,3) * p1[2] + 3 * power(1-t,2) * t * p2[2] + 3 * (1-t) * power(t,2) * p3[2] + power(t,3) * p4[2]
  return point(px, py)
end






----------------------------------------------------
-- normalise2d(vecteur)
-- retourne le vecteur normalisé
----------------------------------------------------
on normalise2d me, p
  mag = me.fastMag2dVector(p)
  return point(p[1] / float(mag), p[2] / float(mag))
end






----------------------------------------------------
-- setRange(oldMin, oldMax, newMin, newMax, n)
-- change la taille du nombre n
-- oldMin et oldMax sont l'intervale de départ
-- newMin et newMax sont l'intervale d'arrivée
----------------------------------------------------
on setRange me, oldMin, oldMax, newMin, newMax, n
  t1 = oldMax - oldMin
  t2 = newMax - newMin
  r = t2 / float(t1)
  return ((n-oldMin) * r) + newMin
end






----------------------------------------------------
-- toreSurface(xMax, yMax, point)
-- limite le point à la surface de tore xMax et yMax
----------------------------------------------------
on toreSurface me, xMax, yMax, p
  return point((p[1] + xMax) mod xMax, (p[2] + yMax) mod yMax)
end






----------------------------------------------------
-- isInsidePoly(listePoints, point)
-- retourne vrai si le point est dans le polygone (listePoints)
----------------------------------------------------
on isInsidePoly me, listePoints, p
  total = 0
  pt = listePoints[1]
  lastQuad = (pt[1] < p[1] and pt[2] < p[2]) +
             (pt[1] > p[1] and pt[2] < p[2]) * 2 +
             (pt[1] > p[1] and pt[2] > p[2]) * 3 +
             (pt[1] < p[1] and pt[2] > p[2]) * 4
  repeat with n = 2 to listePoints.count
    pt = listePoints[n]
    whichQuad = (pt[1] < p[1] and pt[2] < p[2]) +
                (pt[1] > p[1] and pt[2] < p[2]) * 2 +
                (pt[1] > p[1] and pt[2] > p[2]) * 3 +
                (pt[1] < p[1] and pt[2] > p[2]) * 4
    delta = whichQuad - lastQuad
    case delta of
      3: delta = -1
      -3: delta = 1
    end case
    total = total + delta
    lastQuad = whichQuad
  end repeat
  if total = 4 or total = -4 then return true
  return false
end









----------------------------------------------------
-- sigmoid(x, n)
-- fonction sigmoïde Y = 1 / (1 + e(-nX))
----------------------------------------------------
on sigmoid me, a, n
  return 1. / (1 + exp(-n*a))
end









----------------------------------------------------
-- stepTo(v, num, cible)
-- déplace le nombre num vers le nombre cible à la vitesse v
-- retourne num + v si num < cible ou num - v si num > cible
----------------------------------------------------
on stepTo me, v, num, cible
  return num + (num < cible) * v - (num > cible) * v
end








----------------------------------------------------
-- stepPoint(v, pt, cible)
-- v est la vitesse de déplacement du point
-- pt est le point actuel
-- cible est le point cible
-- déplace le point vers la cible à la vitesse v
----------------------------------------------------
on stepPoint me, v, pt, cible
  x = pt[1] + (pt[1] < cible[1]) * v - (pt[1] > cible[1]) * v
  y = pt[2] + (pt[2] < cible[2]) * v - (pt[2] > cible[2]) * v
  return point(x, y)
end









----------------------------------------------------
-- limitPoint(point, pointMin, pointMax)
-- Limite le point au rectangle [a, a, b, b]
----------------------------------------------------
on limitPoint me, pt, a, b
  x = max(min(pt[1], b), a)
  y = max(min(pt[2], b), a)
  return point(x, y)
end








----------------------------------------------------
-- isPrime(p)
-- retourne vrai si le nombre est premier
----------------------------------------------------
on isPrime me, p
  if not(p mod 2) then return 0
  a = 3
  repeat while (a*a-1    if p mod a = 0 then return 0
    a = a + 2
  end repeat
  return 1
end

 


Contact

MMI
36 South Court Sq
Suite 300
Newnan, GA 30263
USA

Send e-mail