Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
(1) Sencillo por las pocas líneas... yo la verdad que me pierdo en interpretarlo
Pero eso es normal con c-Hack-All

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #2  
Antiguo 25-11-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
Cita:
Empezado por Lepe Ver Mensaje
Todavía me estoy preguntando cómo has puesto el código sin ninguna palabra, al menos el foro te obliga a escribir 10 letras.... Pero a lo que iba, tu código suele impresionar por su calidad, pero en este caso, es superado por la belleza del resultado.

Salud.
Cita:
Empezado por Lepe Ver Mensaje
Pero eso es normal con c-Hack-All

Saludos
La respuesta a tu pregunta la has dado tu mismo

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 26-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola de nuevo, y ya considerando el hilo resuelto : dejo aqui este codigo para ilustrar la idea de delphius de usar el 'cubo' RGB e ir rotando un vector de color en el.

Código Delphi [-]
procedure TForm1.FormPaint(Sender: TObject);
var
     phi,rho : double;
     m : integer;
     r,g,b : integer;
     x,y : integer;
begin
     m := TrackBar1.Position;
     phi := 0;
     while phi < PI/2 do
     begin
          rho := 0;
          while rho < PI/2 do
          begin
               r := Round(m*sin(phi));         // proyeccion del vector en r
               g := Round(m*cos(phi)*cos(rho));// proyeccion en g
               b := Round(m*cos(phi)*sin(rho));// proyeccion en b

               canvas.Pixels[20+Round(rho*100),20+Round(phi*100)] := r*$01 + g*$0100 + b*$010000;
               rho := rho + 0.01;
          end;
          phi := phi + 0.01;
     end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
     Paint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     doublebuffered := true;
     TrackBar1.Max := 255;
     TrackBar1.Min := 0;
end;

PD: tremendo el codigo, cHackAll
Responder Con Cita
  #4  
Antiguo 26-11-2008
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 20
JF Sebastian Va por buen camino
Muy buenas aportaciones, companeros.

Última edición por JF Sebastian fecha: 26-11-2008 a las 19:39:18.
Responder Con Cita
  #5  
Antiguo 26-11-2008
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 20
JF Sebastian Va por buen camino
Muy buenas aportaciones, companeros.

Os dejo otra solucion que encontre por ahi y que permite interpolar facilmente y obtener el color deseado...



implementation
{$R *.dfm}
uses math;
Código Delphi [-]
 
procedure TForm1.FormClick(Sender: TObject);
var i: integer; R,G,B: byte; cl:TColor;
begin
  for i := 400 to 750 do
  begin
    WavelengthToRGB(1.0*i,R,G,B);
    cl := rgb(r,g,b);
    Canvas.Pen.Color := cl;
    Canvas.Moveto(i-300,0);
    Canvas.LineTo(i-300,100);
  end;
end;
 
procedure TForm1.WavelengthToRGB(const Wavelength:  double; var R,G,B: byte);
const
  Gamma        =   0.80;
  IntensityMax = 255;
var
  Blue   :  double;
  factor :  double;
  Green  :  double;
  Red    :  double;
  function Adjust(const Color, Factor: double):integer;
  begin
    if   Color = 0.0
    then result := 0
    else result := round(IntensityMax * Power(Color * Factor, Gamma))
  end;
begin
  case trunc(Wavelength) OF
    380..439: begin
        Red   := -(Wavelength - 440) / (440 - 380);
        Green := 0.0;
        Blue  := 1.0
    end;
    440..489: begin
        Red   := 0.0;
        Green := (Wavelength - 440) / (490 - 440);
        Blue  := 1.0
    end;
    490..509: begin
        Red   := 0.0;
        Green := 1.0;
        Blue  := -(Wavelength - 510) / (510 - 490)
    end;
    510..579: begin
        Red   := (Wavelength - 510) / (580 - 510);
        Green := 1.0;
        Blue  := 0.0
    end;
    580..644: begin
        Red   := 1.0;
        Green := -(Wavelength - 645) / (645 - 580);
        Blue  := 0.0
    end;
    645..780: begin
        Red   := 1.0;
        Green := 0.0;
        Blue  := 0.0
    end;
    else
      Red   := 0.0;
      Green := 0.0;
      Blue  := 0.0
  end;
  case trunc(Wavelength) of
    380..419:  factor := 0.3 + 0.7*(Wavelength - 380) / (420 - 380);
    420..700:  factor := 1.0;
    701..780:  factor := 0.3 + 0.7*(780 - Wavelength) / (780 - 700)
    else       factor := 0.0
  end;
  R := Adjust(Red,   Factor);
  G := Adjust(Green, Factor);
  B := Adjust(Blue,  Factor)
end;
Responder Con Cita
  #6  
Antiguo 26-11-2008
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 20
JF Sebastian Va por buen camino
Que inutil soy
Responder Con Cita
  #7  
Antiguo 27-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Estuve pensando en mi idea, y me dije... ummm no se si sería muy vistoso el efecto conseguido.

Y bueno, hice un código... lo puse a prueba y la verdad es que los colores como que no eran los adecuados (tal vez estuve haciendo mal los cálculos con seno y coseno). Luego me dije... para ir de rojo al azul, manteniendo constante un tono de verde, lo más fácil y "vistoso" es simplemente una transformación lineal.

Y es así como me dije que si "x" es el valor del canal Red, "z" es el del canal Blue... entonces se puede ir decrementando el valor de x en una proporción constante "delta" y en la misma medida aumentar el valor de z. Básicamente es esto: (x,y,255 - x) para todo x = 255..0

Y bueno... fue así que se me ocurrió ponerlo a prueba. Me tomé unos minutos anoche y lo hice. He preparado una demostración un tantito chula de mi teoria... y la adjunto aqui.

Pero como hoy he estado ocupado todo el día, vengo y me encuentro esto... tal vez mi idea no sirva de mucho. Pero ya que estoy, y lo tengo... quiero compartilo.

Saludos,
Archivos Adjuntos
Tipo de Archivo: zip MuestraColor.zip (3,8 KB, 38 visitas)
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ampliar imagen o parte de ella - Interpolacion Lineal Delphius Gráficos 11 27-01-2007 04:00:45


La franja horaria es GMT +2. Ahora son las 11:34:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi