Un premier outil de développement LUA disponible !

Pour parler de la programmation en générale, partager des algorithmes...

Re: Un premier outil de développement LUA disponible !

Messagepar Invité le 09 Juin 2011, 23:39

A titre d'exemple, pour répondre à la question de maestroarte, voici un classeur tns prêt à être utilisé.
Il s'agit ici de modéliser des molécules qui vont interagir (chocs) entre elles et récupérer de l'énergie sur la partie basse de la zone représentée en fonction de la température...
hotmolecules.tns
(6.04 Kio) Téléchargé 243 fois


Voici le code correspondant (John Powers) :
Il s'agit cette fois d'un script lua évolué, mais cela reste très lisible, d'autant que tout est largement documenté.
On y retrouvera les idées décrites dans les exemples d'initiation précédents (classes, gestions d'événements...).
Vous pourrez également vous reporter au site http://www.inspired-lua.org pour plus d'information sur les fonctions utilisées.
Code: Tout sélectionner
-- Copyright (C) 2010, Texas Instruments Incorporated
-- All rights reserved
-- Molecules pick up speed and bounce off each other depending on the temperature
-- John Powers  2010-05-30

TotalMolecules = 25


------------------------------------------------------ Event handlers

function on.create()
    Molecule.setup()
    timer.start(timer_period)
end

function on.paint(gc)
    stopwatch.paint:start()

    clearWindow(gc)
    checkDeviceModeChange()

    for i, m in ipairs(molecules) do
        m:paint(gc)
    end

    stopwatch.paint:stop()


    gc:setFont("sansserif", "r", 10)
    gc:setColorRGB(0, 0, 0)
--[[
    local count, min, max, mean, std = stopwatch.update.stats:stats()
    gc:drawString(string.format("Update (%d, %g, %g, %g, %g)", count, min, max, mean, std), 0, 0, "top")

    count, min, max, mean, std = stopwatch.paint.stats:stats()
    gc:drawString(string.format("Paint (%d, %g, %g, %g, %g)", count, min, max, mean, std), 0, 20, "top")

    -- gc:drawString("memory usage=" .. tostring(collectgarbage("count")*1024) .. " bytes", 10, 10, "top")
]]
end

function on.timer()
    update()
    platform.window:invalidate()
end




------------------------------------------------------ Molecule class


Molecule = class()

function Molecule:init()

    -- Random radius
    self.rad    = math.random(5, 20)
    self.mass   = 4/3 * math.pi * self.rad^3

    -- Random location
    self.x = math.random(self.rad, platform.window:width() - self.rad)
    self.y = math.random(self.rad, platform.window:height() - self.rad)

    -- Random velocity
    self.vx = math.random(-2, 2)
    self.vy = math.random(-2, 2)
end


Molecule.radius_multiplier = 0.5 -- Use 1 when displaying on large screen
function Molecule:radius()
    return self.rad * Molecule.radius_multiplier
end


-- The color of a molecule depends on its speed. A slow molecule
-- is blue. A fast one is red.
function Molecule:color()
    -- Start with color HSV model.
    --    Hue = 240        is blue
    --          360 (or 0) is red
    --    Saturation and Value are 100%
    local speed = math.sqrt(self.vx^2 + self.vy^2)
    local hue
    if speed <= 2 then
        hue = 240 -- blue
    elseif speed >= 22 then
        hue = 0 -- red
    else
        hue = (speed - 2)*6 + 240
    end

    -- Convert to RGB color model
    local i, f = math.modf(hue/60)
    local p = 0
    local q = math.floor((1 - f)*256)
    local t = math.floor(f*256)

    local r, g, b
    if        i == 0 then r = 255; g = t;   b = p
    elseif    i == 1 then r = q;   g = 255; b = p
    elseif    i == 2 then r = p;   g = 255; b = t
    elseif    i == 3 then r = p;   g = q;   b = 255
    elseif    i == 4 then r = t;   g = p;   b = 255
    else                  r = 255; g = p;   b = q
    end
    return r, g, b
end


function Molecule:paint(gc)
    local r = self:radius()
    local d = r * 2
    gc:setColorRGB(self:color())
    gc:fillArc(self.x - r, self.y - r, d, d, 0, 360)
end


-- Updates location of molecule based on current velocity
function Molecule:move()
    local maxx = platform.window:width()
    local maxy = platform.window:height()
    local rad  = self:radius()

    self.vy = self.vy + 0.1 -- gravity

    self.x = self.x + self.vx
    self.y = self.y + self.vy
    if self.x > maxx - rad then
        self.vx = -0.9 * math.abs(self.vx) -- loose 10% of its energy to the wall
        self.x = maxx - rad
    elseif self.x < rad then
        self.vx = 0.9 * math.abs(self.vx)
    end
    if self.y > maxy - rad then
        local h = heat()                    -- pick up energy from the bottom wall
        local angle = math.random() * math.pi/2 + math.pi/4 -- perturb 45 to 135 degrees
        self.vy = -0.9 * math.abs(self.vy) - h * math.sin(angle)
        self.vx = self.vx - h * math.cos(angle)
        self.y = maxy - rad
    elseif self.y < rad then
        self.vy = 0.9 * math.abs(self.vy)
    end
end


function Molecule:distanceto(other)
    local dx = other.x - self.x
    local dy = other.y - self.y
    return math.sqrt(dx*dx + dy*dy)
end


-- Elastic collision. Transfer energy from one molecular to another depending
-- on the angle of incidence and relative mass.
function Molecule:collision(other)
    if self:distanceto(other) <= self:radius() + other:radius() then
        local m21 = other.mass / self.mass
        local x21 = other.x - self.x
        local y21 = other.y - self.y
        local vx21 = other.vx - self.vx
        local vy21 = other.vy - self.vy
   
        if vx21 * x21 + vy21 * y21 >= 0 then
            return
        end
   
        -- avoid division by zero
        local fy21 = 1.0e-12 * math.abs(y21);
        if math.abs(x21) < fy21 then
            if x21 < 0 then
                x21 = -fy21
            else
                x21 = fy21
            end
        end
   
        local a = y21 / x21;
        local dvx2 = -2*(vx21 + a*vy21) / ((1+a*a)*(1+m21))
        other.vx = other.vx + dvx2
        other.vy = other.vy + a*dvx2
        self.vx  = self.vx - m21*dvx2
        self.vy  = self.vy - a*m21*dvx2
    end
end


-- Creates a bunch of molecules
function Molecule.setup()
    molecules = {}
    for i = 1, TotalMolecules do
        molecules[i] = Molecule()
    end
end


------------------------------------------------------ Utility functions


Stopwatch = class()

function Stopwatch:init()
    self.stats = Statistics()
end


local msc = timer.getMilliSecCounter

function Stopwatch:start()
    self.t0 = msc()
end


function Stopwatch:stop()
    local diff = msc() - self.t0
    if diff < 0 then
        diff = diff + 2^32
    end
    self.stats:accum(diff)
    return diff
end



Statistics = class()

function Statistics:init()
    self.count = 0
    self.sum   = 0
    self.sumsq = 0
    self.max   = -math.huge
    self.min   = math.huge
end


function Statistics:accum(x)
    self.count = self.count + 1
    self.sum   = self.sum + x
    self.sumsq = self.sumsq + x*x
    if x > self.max then self.max = x end
    if x < self.min then self.min = x end
end


-- Returns the count, minimum, maximum, mean, and standard deviation
function Statistics:stats()
    local  n = self.count
    if n < 2 then
        return 0, 0, 0, 0, 0
    end
    return n, self.min, self.max, self.sum/n, math.sqrt(self.sumsq/(n-1) - (self.sum/(n-1))^2)
end




-- Create some stopwatches
stopwatch = {
    update = Stopwatch(),
    paint  = Stopwatch(),
}


-- Read Vernier temperature sensor to determine energy imparted to molecules.
function heat()
    local energy = ((var.recall("meter.temperature") or 22) - 22) / 5
    if energy > 10 then
        energy = 10
    elseif energy < 0 then
        energy = 0
    end
    return energy
end


-- Move all the molecules one step.
function update()
    stopwatch.update:start()
    for _, m in ipairs(molecules) do
        m:move(w)
    end

    -- Check for collisions
    for i = 1, #molecules-1 do
        for j = i + 1, #molecules do
            molecules[i]:collision(molecules[j])
        end
    end
    stopwatch.update:stop()
end


function clearWindow(gc)
    gc:setColorRGB(255, 255, 255)
    gc:fillRect(0, 0, platform.window:width(), platform.window:height())
end


currentMode       = true  -- true = rendering in device B&W
timer_period      = 1/4
function checkDeviceModeChange()
    local newMode = platform.isDeviceModeRendering()
    if currentMode ~= newMode then
        if newMode then
            timer_period = 1/4                -- 4 frames per second
            Molecule.radius_multiplier = 0.5
        else
            timer_period = 1/20               -- 20 frames per second
            Molecule.radius_multiplier = 1
        end
        currentMode = newMode
        timer.stop()
        timer.start(timer_period)
    end
end


On pourra noter que ce script prévoit la prise en charge d'un capteur de température...
(mais il peut fonctionner sans).
Invité
 

Re: Un premier outil de développement LUA disponible !

Messagepar maestroarte le 10 Juin 2011, 12:12

Merci Philippe.
Petite question toute bête.... pour transférer un fichier sur notre Nspire, l'ordinateur a t-il forcément besoin de pouvoir lire le fichier? Car je ne peux pas ouvrir un fichier avec l'extension tns.... et je ne sais pas si c'est pénalisant pour le transfert....
Merci à vous =D
Maestro
maestroarte
 
Messages: 65
Inscrit le: 08 Avr 2011, 23:05

Re: Un premier outil de développement LUA disponible !

Messagepar Levak92 le 10 Juin 2011, 18:19

pf a écrit:On pourra noter que ce script prévoit la prise en charge d'un capteur de température...
(mais il peut fonctionner sans).


Où ça ? J'ai lu le code, et rien ne m'a fait pensé à ça.
La "température" ne résulte que te l'excitation de chaque molécule, c'est à dire le nombre de collisions. C'est le facteur "energy".
Levak92
 
Messages: 321
Inscrit le: 02 Juin 2010, 23:03
Localisation: France

Re: Un premier outil de développement LUA disponible !

Messagepar Invité le 10 Juin 2011, 20:53

Code: Tout sélectionner
-- Read Vernier temperature sensor to determine energy imparted to molecules.
function heat()
    local energy = ((var.recall("meter.temperature") or 22) - 22) / 5
    if energy > 10 then
        energy = 10
    elseif energy < 0 then
        energy = 0
    end
    return energy
end
Invité
 

Re: Un premier outil de développement LUA disponible !

Messagepar Invité le 10 Juin 2011, 21:59

maestroarte a écrit:Merci Philippe.
Petite question toute bête.... pour transférer un fichier sur notre Nspire, l'ordinateur a t-il forcément besoin de pouvoir lire le fichier? Car je ne peux pas ouvrir un fichier avec l'extension tns.... et je ne sais pas si c'est pénalisant pour le transfert....
Merci à vous =D
Maestro

Pour transférer un fichier, on peut utiliser le TI-Nspire Computer Link (gratuit) ou le TI-Nspire Software (vendu séparément à une certaine époque, mais livré systématiquement depuis quelques temps avec les calculatrices).
Dans le premier cas, on ne peut pas utiliser le fichier sur l'ordinateur, mais tout se passera bien une fois que le fichier aura été transféré sur la calculatrice. Dans le second cas, on peut au choix utiliser le fichier sur l'ordinateur ou la calculatrice. C'est bien sûr la situation la plus intéressante.
(Le TI-Nspire Computer Link devrait être appelé à disparaitre progressivement, il n'était utile qu'à l'époque où le logiciel complet n'était pas fourni systématiquement).
Dernière édition par Invité le 10 Juin 2011, 22:02, édité 1 fois au total.
Invité
 

Re: Un premier outil de développement LUA disponible !

Messagepar maestroarte le 10 Juin 2011, 22:01

Très bien. Donc, le logiciel livré avec les calculatrices permet de lire le "tns" en quelque sorte. :)
maestroarte
 
Messages: 65
Inscrit le: 08 Avr 2011, 23:05

Re: Un premier outil de développement LUA disponible !

Messagepar Boris le 11 Juin 2011, 08:12

Oui tout à fait, mais il fait plus encore ! C'est un émulateur de la calculatrice. Tu retrouves avec le logiciel toutes les fonctionnalités de la calculatrice TInspire avec en plus le confort de la souris, un écran beaucoup plus grand, etc...
Boris
 
Messages: 324
Inscrit le: 24 Oct 2008, 06:11

Re: Un premier outil de développement LUA disponible !

Messagepar Levak92 le 11 Juin 2011, 11:01

Boris a écrit:Oui tout à fait, mais il fait plus encore ! C'est un émulateur de la calculatrice. Tu retrouves avec le logiciel toutes les fonctionnalités de la calculatrice TInspire avec en plus le confort de la souris, un écran beaucoup plus grand, etc...

S'il y a plus de confort, et plus de fonctionnalités, ce n'est donc pas un émulateur. Et il en existe un gratuit et libre qui peut vraiment être considéré comme étant un émulateur, puisqu'il a permis de faire pleins de tests matériels virtuellement.

TI-Nspire Computer Software est un logiciel compatible technologie Nspire. La preuve, les fichiers générés par ce dernier ne sont pas identiques à ceux générés par la calculatrice. Si on ré-enregistre ce même fichier, sa taille diminue de 30%.
Levak92
 
Messages: 321
Inscrit le: 02 Juin 2010, 23:03
Localisation: France

Re: Un premier outil de développement LUA disponible !

Messagepar Boris le 11 Juin 2011, 20:23

Merci pour cette précision qui m'a échappé^^
Boris
 
Messages: 324
Inscrit le: 24 Oct 2008, 06:11

Précédent

Retourner vers Discussions générales sur le développement



Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 2 invités

cron

© Copyright 2008 - Tous droits réservés.