Páginas (2): 1 2   
Shordi   27-03-2025, 21:01
#1
Para una cosita que estoy haciendo necesito conseguir un array de colores, es decir un array de integer, de longitud indeterminada. Quiero decir que sólo en tiempo de ejecución se sabe cuántos. Deberían ser distintos... y bonitos. es cierto que tomando números al azar salen colores... pero son terribles.

¿Alguien tiene alguna idea?

Saludos

No podemos regresar
tincho   27-03-2025, 22:58
#2
podes usar una lista de colores agradables, yo tengo una lista que puede servir, la busco y te la paso

mira aca:
https://thecolorsmeaning.com/ral-colors/
https://en.wikipedia.org/wiki/List_of_RAL_colours
Última modificación: 27-03-2025, 23:13 por tincho.

1 Saludo.
Grandamakulo   28-03-2025, 16:29
#3
Hola, no sé si esto servirá. Genera una matriz de tamaño definido por una variable de pares de colores legibles de tinta y papel. También añado una función que busca color contrastante a partir de uno dado —es decir, busca un par que sea legible con el primero para conseguir parejas papel tinta, eso, legibles—. Por supuesto, con mi estilo barrocofarragosolioso:

Código:
Public Function aiBuscaParColor(iNum As Integer, iOpcion As Integer) As Integer[]
'' === gb.image.Color.HSV''
'***** Obtener iNum pares de color de Papel y Tinta aleatorios según las'
'      posibles opciones.'
'>>>>> iNum, número total de pares de color, primero Papel y luego Tinta.'
'>>>>> iOpcion:'
        '0: Colores pastel (papel claro, tinta mismo tono oscuro)'
        '1: Suave (papel oscuro, tinta mismo tono claro)'
        '2: Alto contraste (papel negro, tinta brillante)'
        '3: Resaltado (papel brillante, tinta negra)'
        '4: Al azar con colores contrastantes'
'<<<<< Una matriz con iNum pares de color [Papel, Tinta], según especifica'
'      iOpcion.'
 
  If iNum = 0 Then Return
  Dim aiRes As New Integer[iNum, 2]  ' Resultado [Papel, Tinta]'
  Dim iPapelH, iPapelS, iPapelV As Byte
  Dim iTintaH, iTintaS, iTintaV As Byte
  Dim i As Integer
  Dim iGiro As Byte = CByte(150 / 360 * 256)
 
  Select Case iOpcion
    Case iPastel
      For i = 0 To iNum - 1
        iPapelH = CByte(Rnd(0, 255))
        iPapelS = 128
        iPapelV = 255
        iTintaH = iPapelH
        iTintaS = 255
        iTintaV = 128
        aiRes[i, 0] = Color.HSV(iPapelH, iPapelS, iPapelV)
        aiRes[i, 1] = Color.HSV(iTintaH, iTintaS, iTintaV)
      Next
    Case iInvPastel
      For i = 0 To iNum - 1
        iPapelH = CByte(Rnd(0, 255))
        iPapelS = 255
        iPapelV = 128
        iTintaH = iPapelH
        iTintaS = 128
        iTintaV = 255
        aiRes[i, 0] = Color.HSV(iPapelH, iPapelS, iPapelV)
        aiRes[i, 1] = Color.HSV(iTintaH, iTintaS, iTintaV)
      Next
    Case iContraste
      For i = 0 To iNum - 1
        iTintaH = CByte(Rnd(0, 255))
        iTintaS = 255
        iTintaV = 255
        aiRes[i, 0] = Color.HSV(0, 0, 0)
        aiRes[i, 1] = Color.HSV(iTintaH, iTintaS, iTintaV)
      Next
    Case iResaltado
      For i = 0 To iNum - 1
        iPapelH = CByte(Rnd(0, 255))
        iPapelS = 255
        iPapelV = 255
        aiRes[i, 0] = Color.HSV(iPapelH, iPapelS, iPapelV)
        aiRes[i, 1] = Color.HSV(0, 0, 0)
      Next
    Case iAzar
      For i = 0 To iNum - 1
        iPapelH = CByte(Rnd(0, 255))
        iPapelS = CByte(Rnd(0, 255))
        iPapelV = CByte(Rnd(0, 255))
        If iPapelH > 255 - iGiro Then
            iTintaH = iGiro - (255 - iPapelH)
          Else
            iTintaH = iGiro + iPapelH
        Endif
        If iPapelS > 255 - iGiro Then
            iTintaS = iGiro - (255 - iPapelS)
          Else
            iTintaS = iGiro + iPapelS
        Endif
        If iPapelV > 255 - iGiro Then
            iTintaV = iGiro - (255 - iPapelV)
          Else
            iTintaV = iGiro + iPapelV
        Endif
        aiRes[i, 0] = Color.HSV(iPapelH, iPapelS, iPapelV)
        aiRes[i, 1] = Color.HSV(iTintaH, iTintaS, iTintaV)
      Next
  End Select

  Return aiRes

End

Código:
Public Function iTintaxContraste(Colorfondo As Integer, booTotal As Boolean) As Integer
'' === gb.image.Color''
'***** Devuelve un color de tinta que sea contrastante con un color de fondo —o viceversa— y que resulte legible. '
'>>>>> Colorfondo: El color sobre el que hay que escribir'
'>>>>> booTotal  : Si: devuelve blanco o negro, según la luminancia'
'                  No: devuelve un color con el matiz girado 60º en la rueda cromática.'
'<<<<< Color de tinta adecuado para ese fondo  —o viceversa—'

  Dim ci As ColorInfo
  Dim bMatiz As Byte
  Dim bSatur As Byte
  Dim bValor As Byte
  Dim bLumin As Byte

  ci = Color[Colorfondo]
  If booTotal = Si Then
    bLumin = ci.Luminance
' El límite de contraste está entre 128 y 150 sobre 256 según varios autores'
    If bLumin > 128 Then
      Return Color.Black
    Else
      Return Color.White
    Endif
  Else
    bMatiz = ci.Hue
    bSatur = ci.Saturation
    bValor = ci.Value

    ' 60 / 360 * 256 = 43, esto gira 60º el color en la rueda de matiz'
    ' Si pasa de 255, auntomáticamente se reinicia, por lo que no es necesario'
    ' control de exceso.'
    bMatiz = bMatiz + 43
    bValor = bValor + 85

    Return Color.HSV(bMatiz, bSatur, bValor)
  Endif

End
¿Te vale?

También se pueden hacer escalas sobre determinado tono a elegir o una serie de colores temáticos, p.e. complementarios —los complementarios están a 180º, pero se puede dividir en tantos intervalos como se quiera—. En fin, ya dirás.
Edito para poner ejemplos de las cinco opciones que tiene:
[Imagen: 2eLGn8hl.png][Imagen: CpslFdyl.png][Imagen: cTloeUZl.png][Imagen: GKmyDLll.png][Imagen: Kj7mXXNl.png]
Última modificación: 28-03-2025, 19:01 por Grandamakulo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Grandamakulo   28-03-2025, 18:56
#4
Ejemplo a partir de un violeta. se pueden obtener tonos «sombra» —bien con HSV o con Darker / Lighter—, o también tonos del círculo de colores. Si me dices qué necesitas exactamente, lo vemos.
[Imagen: lK2CyQ1l.png][Imagen: 5XCOlPpl.png]

—Ejemplos de https://colorizer.org/
Última modificación: 28-03-2025, 18:57 por Grandamakulo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Shordi   28-03-2025, 21:17
#5
Gracias Tincho.
Grandamakulo me ha dado la solución. La función que me genera colores aleatorios queda así:

Código:
Public Function genColors(iNum As Integer) As Integer[]

  Dim aiRes, acolorH As New Integer[iNum]
  Dim iColorH, iColorS, iColorV As Byte
  Dim i, salto As Integer

  If iNum = 0 Then Return
  For i = 0 To iNum - 1
    iColorH = CByte(Rnd(0, 255))
    iColorS = 128
    iColorV = 255
    aiRes[i] = Color.HSV(iColorH, iColorS, iColorV)
  Next
  Return aiRes

End

Pero no es oro todo lo que reluce. Después de darle muchas vueltas no he encontrado la manera de que los colores que se generen no sean parecidos unos a otros. Al final he recurrido un poco a la cuenta de la vieja y en última instancia a la función de arriba.
Lo que he hecho ha sido:

1.- Generar manualmente un array de 25 colores distintos (en realidad los que tiene la clase Color descartando los Dark* que no me valen para lo que quiero.
2.- Si el número de colores es mayor de 25, se incrementa el array con los colores resultantes de mezclar cada color con el color blanco en una proporción de 0.7.
3.- Si aún así el número de colores que se solicita es mayor de 50, se recurre a la función citada más arriba hasta que se complete el array.

El objetivo de esta función es generar barras de colores aleatorios para un control que genera gráficas para estadísticas, por lo que será difícil, en principio llegar al punto 3 de que haya más de 50 barras en la gráfica.

Os adjunto un pequeño proyecto de demo por si a alguien le interesa.

Saludos
Archivos adjuntos
.gz
colores-0.0.1.tar.gz (Tamaño: 9.45 KB Descargas: 2)

No podemos regresar
tincho   28-03-2025, 22:05
#6
si es para graficas tambien pueden jugar un papel los degradados o patrones de dibujo, lineas etc.

1 Saludo.
Shell   29-03-2025, 01:04
#7
Entendí que quieres colores al azar, pero que sean bonitos y sobre gustos ya me pierdo.
He creado un ejemplo que recuerda algo que hice ya tiempo.

[Imagen: uQnG23pl.png]

Aprovecha el evento move dentro del DrawingArea y donde se pose muestra la gama de colores.
Cada vez que se le da a Dibujar Cuadrados, generará un nuevo grupo de cuadrados coloreados.
Aunque los colores se puedan parecer no hay dos iguales.

Se puede jugar con las constantes para cambiar el número de cuadrados, el margen de separación y el tamaño del lado.
Pero claro sin pasarse. Smile

Se pueden hacer más cosas con los colores, pero por ahora solo pude hacer esto.

Saludos
Archivos adjuntos
.gz
ColoresAlAzar-0.0.2.tar.gz (Tamaño: 10.67 KB Descargas: 1)

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   29-03-2025, 11:20
#8
Así quedan más chulos.
[Imagen: ptPkUw6l.png]

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   29-03-2025, 11:34
#9
Gracias Shell, tu solución también sirve... pero adolece del mismo problema: puede que no sean iguales pero se generan colores indistinguibles con números de rojo, verde y azul muy dispares.
Al final usaré la solución que subí más arriba y en lugar de obtenerlos al azar los obtendré en secuencia, de manera que la primera columna siempre tendrá el mismo color, la segunda igual, etc.... y sólo si son más de 50 variarán los colores.

Saludos

No podemos regresar
Shell   29-03-2025, 12:22
#10
Shordi:

¿ Cómo deben ser los colores que quieres ?. Solo generé colores al azar.
¿ Podrías mostrar un ejemplo gráficamente y describirlo ?
Es que cuando dijiste colores chulos, me quedé un poco a cuadros. ¿ Y cuáles son esos ?. Rolleyes

Desde luego encontrar una buena combinación de colores que no dañe los ojos, es complicado.


Este es un ejemplo imitando los colores RAL;

FMain:

Código:
Public Sub Form_Open()

  'Aplicar color RAL a la etiqueta
  lblTexto.ForeGround = RAL.colores["RAL_3001_ROJO_SENAL"]
  lblTexto.BackGround = RAL.colores["RAL_1023_AMARILLO_TRAFICO"]

  ' Establecer un color de fondo inicial para el formulario
  Me.BackGround = RAL.colores["RAL_9010_BLANCO_PURO"]

End

Public Sub btnFondo_Click()
  'Definición de más colores RAL para el botón

  'Cambiar el color de fondo del formulario al hacer clic en el botón
  If Me.BackGround = RAL.colores["RAL_9010_BLANCO_PURO"] Then
    Me.BackGround = RAL.colores["RAL_5015_AZUL_CELESTE"]
    btnFondo.BackGround = RAL.colores["RAL_7016_GRIS_ANTRACITA"]
    btnFondo.ForeGround = RAL.colores["RAL_9010_BLANCO_PURO"]
  Else
    Me.BackGround = RAL.colores["RAL_9010_BLANCO_PURO"]
    btnFondo.BackGround = RAL.colores["RAL_2004_NARANJA_PURO"]
    btnFondo.ForeGround = RAL.colores["RAL_7016_GRIS_ANTRACITA"]
  End If

End


Modulo RAL:
Código:
'Definición de constantes para algunos colores RAL (con sus equivalentes RGB)

Public colores As Collection = [
  "RAL_1023_AMARILLO_TRAFICO": Color.RGB(255, 215, 0),
  "RAL_3001_ROJO_SENAL": Color.RGB(255, 0, 0),
  "RAL_6024_VERDE_TRAFICO": Color.RGB(0, 153, 102),
  "RAL_5015_AZUL_CELESTE": Color.RGB(0, 142, 214),
  "RAL_9010_BLANCO_PURO": Color.RGB(255, 255, 255),
  "RAL_7016_GRIS_ANTRACITA": Color.RGB(47, 54, 64),
  "RAL_2004_NARANJA_PURO": Color.RGB(255, 102, 0)
]

'RAL_1023_AMARILLO_TRAFICO Amarillo tráfico
'RAL_3001_ROJO_SENAL Rojo señal
'RAL_6024_VERDE_TRAFICO Verde tráfico
'RAL_5015_AZUL_CELESTE Azul celeste
'RAL_9010_BLANCO_PURO Blanco puro
'RAL_7016_GRIS_ANTRACITA Gris antracita
'RAL_2004_NARANJA_PURO Naranja puro



Saludos
Archivos adjuntos
.gz
EjemploConColoresSimilaresARal-0.0.1.tar.gz (Tamaño: 9.22 KB Descargas: 0)
Última modificación: 29-03-2025, 12:23 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.