Le deal à ne pas rater :
Réassort du coffret Pokémon 151 Électhor-ex : où l’acheter ?
Voir le deal

Aller en bas
RPG-man
RPG-man
Membre

Nombre de messages : 55
Age : 30
Distinction : aucune
Date d'inscription : 16/03/2009

Tracer des cercles et des disques Empty Tracer des cercles et des disques

Mar 31 Mar 2009 - 20:13
Ceci est un script contenant 2 algorithmes : un pour les disques, l'autre pour les cercles. Je préviens desuite c'est un script pour les rubystes!
Pour les connaisseurs je l'ai créé sur la base de celui de Andres.
Il marche impec! Seul problème, un peu lent pour les disques (100ms pour un rayon de 100px). Sinon, les cercles ça va vite...
Bon, ben voilà, je vous donne le code :


Code:
#================================================================
# * Draw_disc et Draw_cercle
#---------------------------------------------
# Par RPG-man sur la base de l'algorythme de Andres
# Crée un cercle sur un bitmap
# Spécifier
#  - rayon : le rayon du cercle
#  - x_centre : l'abscisse du centre du cercle (sur le bitmap)
#  - y_centre : l'ordonnée du centre du cercle (sur le bitmap)
# Exemple d'utilisation
#-------------------------------
# sprite = Sprite.new
# sprite.bitmap = Bitmap.new(100, 100)
# sprite.bitmap.draw_disc(50)
#-------------------------------
#================================================================

#================================================================
# Classe Bitmap
#-------------------------------------
#================================================================


class Bitmap
#================================================================
# * draw_disc
#================================================================
  def draw_disc(rayon=20, x_centre=nil, y_centre=nil)

#-------------------------------------------
# Si le centre est indéterminé, c'est le centre du bitmap
#-------------------------------------------
    if x_centre == nil
      x_centre = self.width/2
    end
    if y_centre == nil
      y_centre = self.height/2
    end

#-------------------------------------------
# Couleur : c'est du blanc mais on peut changer
#(suffit de rajouter un argument)
#-------------------------------------------
    color = Color.new(255, 255, 255, 255)

    x = 0
    y = rayon
    m = 5-4*rayon
    for i in 0..rayon
# Hop, on remet les variables à 0 !
    x = 0
    y = i
    m = 5-4*i
#------------------------------------------------
    while x <= y
      for i in 0..1
      self.set_pixel(x+x_centre, y+y_centre+i, color)
      self.set_pixel(y+x_centre, x+y_centre+i, color)
      self.set_pixel(-x + x_centre, y + y_centre+i, color)
      self.set_pixel(-y+x_centre, x+y_centre+i, color)
      self.set_pixel(x+x_centre, -y+y_centre+i, color)
      self.set_pixel(y+x_centre, -x+y_centre+i, color)
      self.set_pixel(-x+x_centre, -y + y_centre+i, color)
      self.set_pixel(-y+x_centre, -x+y_centre+i, color)
    end

      if m > 0
        y = y-1
        m = m-8*y
      end
      x = x+1
      m = m + 8*x + 4
    end
  end
 
  end
 
 
#================================================================
# * draw_circle
# Bon, je vais pas me répéter!
#================================================================
def draw_circle(rayon=20, x_centre=nil, y_centre=nil)
    if x_centre == nil
      x_centre = self.width/2
    end
    if y_centre == nil
      y_centre = self.height/2
    end
    color = Color.new(255, 255, 255, 255)
    x = 0
    y = rayon
    m = 5-4*rayon
    while x <= y
      self.set_pixel(x+x_centre, y+y_centre, color)
      self.set_pixel(y+x_centre, x+y_centre, color)
      self.set_pixel(-x + x_centre, y + y_centre, color)
      self.set_pixel(-y+x_centre, x+y_centre, color)
      self.set_pixel(x+x_centre, -y+y_centre, color)
      self.set_pixel(y+x_centre, -x+y_centre, color)
      self.set_pixel(-x+x_centre, -y + y_centre, color)
      self.set_pixel(-y+x_centre, -x+y_centre, color)
      if m > 0
        y = y-1
        m = m-8*y
      end
      x = x+1
      m = m + 8*x + 4
    end
  end
end



Et voilà une modif pour dessiner un disque dont l'opacité diminue au fur et à mesure qu'on s'approche du bord:
Tracer des cercles et des disques Screen07-cf9b98
Code:
class Bitmap
  #============================
  # * Dessine un disque flou (25)
  #============================
    def draw_flou(rayon=25, x_centre=nil, y_centre=nil, color=Color.new(255, 255, 255, 255))
    if x_centre == nil
      x_centre = self.width/2
    end
    if y_centre == nil
      y_centre = self.height/2
    end
    bitmap = Bitmap.new(self.width, self.height)
    @color = color.clone
    #rayon = 25
    @int = 255.0/rayon.to_f
    x = 0
    y = rayon
    m = 5-4*rayon
    for i in 0..rayon

    @color.alpha -= @int
    x = 0
    y = i

    m = 5-4*i
    while x <= y
     
      #----------------------
      #@color.alpha -= 1 if a%@int <= 1
      #if @color.alpha <= 0
      #@color.alpha = @color2.alpha
      #end
      #a+=1
      #----------------------
      for i in 0..1
      bitmap.set_pixel(x+x_centre, y+y_centre+i, @color)
      bitmap.set_pixel(y+x_centre, x+y_centre+i, @color)
      bitmap.set_pixel(-x + x_centre, y + y_centre+i, @color)
      bitmap.set_pixel(-y+x_centre, x+y_centre+i, @color)
      bitmap.set_pixel(x+x_centre, -y+y_centre+i, @color)
      bitmap.set_pixel(y+x_centre, -x+y_centre+i, @color)
      bitmap.set_pixel(-x+x_centre, -y + y_centre+i, @color)
      bitmap.set_pixel(-y+x_centre, -x+y_centre+i, @color)
    end
   
      if m > 0
        y = y-1
        m = m-8*y
      end
      x = x+1
      m = m + 8*x + 4
    end
  end
  self.blt(0, 0, bitmap, bitmap.rect, 50) #Choisir l'opacité
end
end

Comme d'hab, si vous avez des critiques, optimisations à proposer Very Happy


Dernière édition par RPG-man le Jeu 2 Avr 2009 - 14:51, édité 1 fois
avatar
Naasmar
Membre

Nombre de messages : 185
Age : 28
Distinction : aucune
Date d'inscription : 15/03/2008

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Mer 1 Avr 2009 - 21:44
J'ai pas compris à quoi sa servait =\
RPG-man
RPG-man
Membre

Nombre de messages : 55
Age : 30
Distinction : aucune
Date d'inscription : 16/03/2009

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Jeu 2 Avr 2009 - 9:52
Shocked
Tu sais ce qu'est un cercle? Tu sais ce qu'est un disque? Et bien ce script sert à en créer sans besoin de ressources, et avec ça, on peut même créer un "point flou" d'un rayon donné en l'arrangeant un peu :

Code:
class Bitmap
  #============================
  # * Dessine un disque flou (25)
  #============================
    def draw_flou(rayon=25, x_centre=nil, y_centre=nil, color=Color.new(255, 255, 255, 255))
    if x_centre == nil
      x_centre = self.width/2
    end
    if y_centre == nil
      y_centre = self.height/2
    end
    bitmap = Bitmap.new(self.width, self.height)
    @color = color.clone
    #rayon = 25
    @int = 255.0/rayon.to_f
    x = 0
    y = rayon
    m = 5-4*rayon
    for i in 0..rayon

    @color.alpha -= @int
    x = 0
    y = i

    m = 5-4*i
    while x <= y
     
      #----------------------
      #@color.alpha -= 1 if a%@int <= 1
      #if @color.alpha <= 0
      #@color.alpha = @color2.alpha
      #end
      #a+=1
      #----------------------
      for i in 0..1
      bitmap.set_pixel(x+x_centre, y+y_centre+i, @color)
      bitmap.set_pixel(y+x_centre, x+y_centre+i, @color)
      bitmap.set_pixel(-x + x_centre, y + y_centre+i, @color)
      bitmap.set_pixel(-y+x_centre, x+y_centre+i, @color)
      bitmap.set_pixel(x+x_centre, -y+y_centre+i, @color)
      bitmap.set_pixel(y+x_centre, -x+y_centre+i, @color)
      bitmap.set_pixel(-x+x_centre, -y + y_centre+i, @color)
      bitmap.set_pixel(-y+x_centre, -x+y_centre+i, @color)
    end
   
      if m > 0
        y = y-1
        m = m-8*y
      end
      x = x+1
      m = m + 8*x + 4
    end
  end
  self.blt(0, 0, bitmap, bitmap.rect, 50) #Choisir l'opacité
end
end
Et voilà à quoi ça peut servir (exemple dans le logiciel de graphisme que je crée) :
Spoiler:
RPG-man
RPG-man
Membre

Nombre de messages : 55
Age : 30
Distinction : aucune
Date d'inscription : 16/03/2009

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Jeu 2 Avr 2009 - 14:53
Ben, y'a pas de quoi ^^

C'est vrai que pour les N00Bs ça paraît tout à fait anodin de créer un cercle mais ce n'est pas si facile que ça en fait quand on a pas la solution sous les yeux ^^
dricc
dricc
Membre

Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Mar 8 Sep 2009 - 11:06
C'est pour les scripteurs ...
certainement pas à mettre tel quel dans un jeu .

ça pourrait servir pour une lumiere par exemple . Ou un cercle plus ou moins grand en fonction des points de vie . seule l'imagination est la limite !
zoneneutre
zoneneutre
Membre

Nombre de messages : 129
Age : 36
Distinction : aucune
Date d'inscription : 17/03/2008

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Mar 8 Sep 2009 - 15:50
Ou par exemple un jeu avec des énigmes style tracer un cercle autour d'un personnage dans une pénombre..Bref un jeu d'enquête ^^
Skillo
Skillo
Staffeux retraité

Nombre de messages : 526
Age : 35
Localisation : Rennes
Distinction : J'aime ce gars :P
(by Coco')
Scripteur apprenti, futur Berka !
(par Tretian)
Membre anonyme de la communauté, caché derrière son PC
(???)
super prof de script
[Dudu']
Résident permanent de la Chat Box
[Autoproclamé]
Adepte du XDDD [Yak' Very Happy]
Fanatique hystérique de Raymond le français [Un connu]
Date d'inscription : 19/01/2008

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Mar 8 Sep 2009 - 18:10
dricc t'as fait un sacré nécro quand même et pour dire pas grand chose. Fait attention!!

berka: T'es modo ?
Edit: Non je ne fait que le signaler. Very Happy


Dernière édition par Skillo le Mer 9 Sep 2009 - 18:43, édité 1 fois
dricc
dricc
Membre

Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Mar 8 Sep 2009 - 18:20
... ben .. je comprends pas ... y'avait une réponse d'aujourd'hui meme ...
Je me suis fait piéger là , je crois . y'a quelqu'un qui a posté et qui supprimé son post aprés .

berka: A tous: Bon, c'est pas grave, pas besoin de poster plusieurs fois pour cet incident ! Inutile aussi de modérer, il y a des modos exprès pour ca ! Merci de ne pas recommencer.
Contenu sponsorisé

Tracer des cercles et des disques Empty Re: Tracer des cercles et des disques

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum