elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 436
21  Foros Generales / Dudas Generales / Re: Archivos de 2005 pero el contenido dice 2006. en: 14 Junio 2024, 16:35 pm
La fecha 0, es 1980 conforme a ciertos sistemas (UNIX) y a partir de ahí empiezan a contar (proceden de usar valores en octal 0-7 para guardarlas)...
Recuerdo por ejemplo que versiones antiguas de Winrar, si no indicabas fecha, al extraerlos te asignaba la fecha 0, que según en que sistema lo descomprimieras te asignaba la fecha 0, que constare para ese sistema.

Por otro lado, que tengas ficheros de un año y tu jures que son de otro... primero deberías fijarte que fecha es la que estás mirando, ya que suele estar más presente la fecha de la 'ultima modificación' que la de creación. Si es la de creación, pues no hay forma de decirte que haya pasado en tu equipo, quizás tuvieras mal la fecha (año del equipo) cuando el fichero fue creado, pero si no lo sabes tú, no lo va a saber nadie...

...y no, eso del efecto 2000 era y fue una tontería que solo se daba en diseños muy específicos, en PCs no se daba y era fácil comprobarlo porque la fecha se podía y puede modificar avanzándola hasta el límite que permite el sistema y verás que si lo dejas... al día siguiente 'retorna a 0'.
Entonces, salvo que haya algo programado para que se ejecute con fecha 0, ó para que no se ejecute si es fecha 0, no pasa absolutamente nada a pesar de que tal salto suponga un cambio no solo de año, si no de mes y día de la semana.

En general cuando se programan cosas se programan para x hora, todos los días o para x día de la semana (es decir que se ejecute a intervalos de x tiempo) y esos suponiendo que no tenga un contador individual que es lo preferible, ya que la fecha y la hora se puede cambiar, no puedes arriesgarte a depender de la fecha y hora si es algo crítico tan crítico que puede causar algo 'catastrófico' y por tanto usas un contador propio que no pueda ser cambiado por un usuario medio atontado que no sabe lo que hace en su puesto de trabajo...
22  Programación / Programación Visual Basic / Re: Problema de array en: 14 Junio 2024, 16:16 pm
...eran 4 tonterías que deberías ser capaz de corregir...

En cualquier caso aquí el código corregido...

El control de la interfaz...
Código
  1. Private Sub Form_Load()
  2.    With HScroll1
  3.        .Min = 18   ' 15
  4.        .Max = 20   ' 25
  5.        .Value = 19
  6.    End With
  7. End Sub
  8.  
  9. Private Sub HScroll1_Change()
  10.    Label2.Caption = CStr(HScroll1.Value) & " Elementos en juego"
  11. End Sub
  12.  
  13. Private Sub Command1_Click()
  14.    Me.MousePointer = vbHourglass
  15.    Call CombinacionesDe6(HScroll1.Value)
  16.    Me.MousePointer = vbDefault
  17. End Sub
  18.  

El código previo y corregido...
Código
  1. Private Sub CombinacionesDe6(ByVal Cantidad As Byte)
  2.    Dim Max As Integer, Total As Long, combinacion   As String
  3.    Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer
  4.    Dim ci As String, cj As String, ck As String, cl As String, cm As String, cn As String
  5.  
  6.    Valores = GetArrayDeValores(Cantidad)
  7.    If (SizeArray > 0) Then
  8.        List1.Clear
  9.        List1.Visible = False   ' Esto hará que el añadido sea mucho más rápido
  10.        Max = UBound(Valores)
  11.  
  12.        For i = 0 To Max - 5
  13.            ci = Format2Digitos(CStr(Valores(i)))
  14.            For j = i + 1 To Max - 4
  15.                cj = ci & Format2Digitos(CStr(Valores(j)))
  16.                For k = j + 1 To Max - 3
  17.                    ck = cj & Format2Digitos(CStr(Valores(k)))
  18.                    For l = k + 1 To Max - 2
  19.                        cl = ck & Format2Digitos(CStr(Valores(l)))
  20.                        For m = l + 1 To Max - 1
  21.                            cm = cl & Format2Digitos(CStr(Valores(m)))
  22.                            For n = m + 1 To Max
  23.                                '.... lo que sea que vayas a hacer... por ejemplo añadirlos al listbox
  24.                                combinacion = cm & Format2Digitos(CStr(Valores(n)))
  25.                                'combinacion = ConcatValues(CStr(Valores(i)), CStr(Valores(j)), CStr(Valores(k)), CStr(Valores(l)), CStr(Valores(m)), CStr(Valores(n)))
  26.                                List1.AddItem combinacion
  27.                                Total = (Total + 1)
  28.                            Next
  29.                        Next
  30.                    Next
  31.                Next
  32.            Next
  33.        Next
  34.  
  35.        List1.Visible = True
  36.        Label1.Caption = "Total Combinaciones: " & CStr(Total)   ' el añadido es bastante rápido, no hace falta ponerlo más que al final, o en todo caso en un bucle previo (si fueran a meterse muchos miles)
  37.    End If
  38. End Sub
  39.  
  40. Private Function GetArrayDeValores(ByVal Cantidad As Byte) As Byte()
  41.    Dim V() As Byte, v18() As String
  42.    Const Val18 As String = "4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49"
  43.    Const Val19 As String = "33", Val20 As String = "11"
  44.  
  45.    If ((Cantidad < 18) Or (Cantidad > 20)) Then
  46.        MsgBox "No se ha contemplado el caso de un array con " & CStr(Cantidad) & " de ítems... " & vbCrLf & "Valores aceptados actualmente: 18-20"
  47.        SizeArray = 0
  48.    Else
  49.        v18 = Split(Val18, ", ")        ' pasamos la constante a un array de strings
  50.        ReDim V(0 To Cantidad)       ' dimensionamos el array en la cantidad deseada
  51.        For k = 0 To 18                 ' pasamos los 18 valores del array de strings al array de bytes
  52.            V(k) = CByte(v18(k))
  53.        Next
  54.  
  55.        If (Cantidad >= 19) Then
  56.            V(19) = CByte(Val19)  ' Si se solicitó 19 o 20 valores, pasamos el 19º
  57.            If (Cantidad = 20) Then V(20) = CByte(Val20)  ' ídem para el 20º
  58.        End If
  59.  
  60.        SizeArray = Cantidad
  61.        GetArrayDeValores = V   ' devolvemos el array al tamaño solicitado y con los valores asignados.
  62.    End If
  63. End Function
  64.  
  65.  
  66. 'Private Function ConcatValues(i As String, j As String, k As String, l As String, m As String, n As String) As String
  67. '    ConcatValues = Format2Digitos(i) & Format2Digitos(j) & Format2Digitos(k) & Format2Digitos(l) & Format2Digitos(m) & Format2Digitos(n)
  68. 'End Function
  69.  
  70. ' Formato: 2espacios + valor(2 dígitos) + espacio(s) + separador
  71. Private Function Format2Digitos(ByRef Valor As String, Optional ByVal Size As Byte = 8, Optional ByRef Separador As String = "|") As String
  72.    Dim Salida As String, k As Integer
  73.  
  74.    If (Len(Valor) = 1) Then
  75.        Salida = ("  0" & Valor)
  76.    Else
  77.        Salida = ("  " & Valor)
  78.    End If
  79.  
  80.    k = (Size - (Len(Salida) + Len(Separador)))
  81.    If (k > 0) Then Salida = (Salida & Space$(k))
  82.  
  83.    Format2Digitos = (Salida & Separador)
  84. End Function
  85.  

Y así se ve el resultado... (primera y yltima combinaciones para 20, usando los valores consiganos para 19 y 20.


p.d.: Nota que he cambiado el textbox por un label... (el valor de un resultado no debe poderse editar).
Los valores negativos de cuenta, sucede cuando superan el valor del tipo integer. Ya que es un tipo con signo, solo alcanza hasta los 32768 (0-32767). entonces cuando la lista añade más elementos, sigue sumando para ahora aparecen como negativos.
Puedes hacer los cálculos, pero si superas luego los 65536, seguirá cometiendo errores (culpa de utilizar como contador un tipo entero de 15 bits, pero permitir más añadidos que esa cantidad). El mejor modo de obviar ese problema es llevar tu propio contador.
23  Programación / Programación Visual Basic / Re: Problema de array en: 14 Junio 2024, 00:38 am
Rl código lo escribí al vuelo, hay que repasarlo a medida que se transcribe.

No obstante,  mañana lo reviso y lo pruebo y haré las correcciones que precisare.
24  Programación / Programación Visual Basic / Re: Problema de array en: 12 Junio 2024, 17:25 pm
La verdad es que usar  valores fijos, puede ser útil cuando uno considera que esos valores 'tienen algo especial', pero como esa idea suele resultar falsa, puede ser más interesante considerar utilizar valores aleatorios (no repetidos)...

...de paso variamos el rango de cantidad entre 15 y 25... solo por ilustrar el ejemplo.
Código
  1. private function GetArrayDeValores(byval Cantidad as byte) as byte()
  2.     dim V() as byte, v49(0 to 49) as byte
  3.     dim k as integer, j as integer, n as byte
  4.  
  5.     if ((Cantidad< 15) or (cantidad > 25)) then
  6.          case else: msgbox "No se ha contemplado el caso de un array con " & cstr(cantidad) & " de ítems... " & vbcrlf & "Valores aceptados actualmente: 15-25"
  7.          SizeArray = 0
  8.    else
  9.         for k= 0 to 49
  10.             v49(k)= k
  11.         next
  12.  
  13.         redim V(0 to cantidad-1)  ' dimensionamos el array en la cantidad deseada
  14.         for k= 0 to cantidad -1  
  15.             j = (49-k)    
  16.             n = Int(j  * Rnd + 1)  ' el +1 impide elegir el índice y valor 0 de v49 pues no se contempla en las loterías (creo).
  17.             V(k) = v49(n)
  18.  
  19.             v49(n) = v49(j): v49(j)= V(k)  ' el tomado se aparta al final, y ya no será elegible (su puesto es ocupado por el último elegible actualmente).
  20.         next
  21.  
  22.  
  23.         SizeArray = Cantidad
  24.         GetArrayDeValores = V   ' devolvemos el array al tamaño solicitado y con los valores asignados.
  25.    end if
  26. end function
  27.  
25  Programación / Programación Visual Basic / Re: Problema de array en: 12 Junio 2024, 16:49 pm
el array solo me acepta 19 numeros
¿como puedo hacer que el array me acepte 20 numeros o mas?
...
Citar

Private Sub Form_Load()
Text5.Text = Date
        Randomize
        Dim A() As Variant
        A = Array(4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49)
        MakeUniqueCombinationOfSix A
End Sub

Es broma, no?.
Tratas de decir que usas un lenguaje pero que no conoces siquiera como dimensionar arrays?.

En fin...
La forma en que está declarado es un array estático, tendrá tantos elementos como aquellos que se han contenido.
Esa no es la forma adecuada para inicializar arrays que se pretende tengan capacidades más dinámicas.

En un caso como el presente donde pudiera ser el caso de que tuviere diferentes cantidades y valores es preferible meter en una función la creación de cada caso, que además inicialice el array con los valores deseados.
Tampoco es muy util operar el array como de tipo variant, el variant es para otras cosas, como cuando deben contener cosas heterogéneas, si son todas del mismo tipo (numérico, string, fechas, etc...), entonces es preferible hacer que sea de ese tipo...

Código
  1. private SizeArray as interger
  2. private Valores()  as byte
  3.  
  4. private function GetArrayDeValores(byval Cantidad as byte) as byte()
  5.     dim V() as byte, v18() as string
  6.     const Val18 as string = "4, 6, 14, 18, 19, 20, 21, 24, 26, 27, 31, 32, 35, 36, 40, 41, 42, 47, 49"
  7.     const Val19 as string =  33
  8.     const Val20 as string = 11
  9.  
  10.     if ((Cantidad< 18) or (cantidad > 20)) then
  11.          case else: msgbox "No se ha contemplado el caso de un array con " & cstr(cantidad) & " de ítems... " & vbcrlf & "Valores aceptados actualmente: 18-20"
  12.          SizeArray = 0
  13.    else
  14.         v18 = split(Val18, ", ")   ' pasamos la constante a un array de strings
  15.         redim v(0 to cantidad-1)  ' dimsnesionamos el array en la cantidad deseada
  16.         for k= 0 to 18                ' pasamos los 18 valores del array de strings al array de bytes
  17.             v(k) = cbyte(v18(k))
  18.         next
  19.         if (cantidad >= 19) then v(18)= Val19   ' Si se solicitó 19 o 20 valores, pasamos el 19º
  20.         if (cantidad = 20) then v(19)= Val20   ' ídem para el 20º
  21.  
  22.         SizeArray = Cantidad
  23.         GetArrayDeValores = v   ' devolvemos el array al tamaño solicitado y con los valores asignados.
  24.    end if
  25. end function
  26.  

finalmente puedes hacer con el array devuelto lo que precises....
Código
  1. Private Sub CombinacionesDe6(byval Cantidad as byte)
  2.    dim Max as integer, combinacion as as string
  3.    dim i as integer, j as integer, k as integer, l as integer, m as integer, n as integer
  4.  
  5.    valores =  GetArrayDeValores(cantidad)
  6.    if (SizeArray >0) then
  7.         list1.clear
  8.         list1.visible = false   ' Esto hará que el añadido sea mucho más rápido
  9.         max = ubound(valores)
  10.  
  11.          for i = 0 to max-5
  12.              for j= i+1 to max-4
  13.                  for k= j+1 to max-3
  14.                      for l = k+1 to max-2
  15.                          for m= l+1 to max-1
  16.                              for n= m+1 to max
  17.                                  '.... lo que sea que vayas a hacer... por ejemplo añadirlos al listbox
  18.                                   combinacion =ConcatValues(cstr(valores(i)), cstr(valores(j)), cstr(valores(k)), cstr(valores(l)), cstr(valores(m)), cstr(valores(n)))
  19.                                   list1.additem combinacion
  20.                              next
  21.                          next
  22.                      next
  23.                  next
  24.              next
  25.          next
  26.  
  27.          list1.visible = true
  28.          Text1.Text = List1.ListCount  ' el añadido es bastante rápido, no hace falta ponerlo más que al final, o en todo caso en un bucle previo (si fueran a meterse muchos miles)
  29.    end if
  30. end function
  31.  

Unas funciones adicionales simplifican modificar el código en adelante... para que tenga otra apariencia en el listado, sin necesidad de tocar la función previa, solo las de formato.
Código
  1. private function ConcatValues(i as string,j as string,k as string, l as string, m as string, n as string) as string
  2.      ConcatValues= Format2Digitos(i) & Format2Digitos(j) & Format2Digitos(k) & Format2Digitos(l) & Format2Digitos(m) & Format2Digitos(n)
  3. end function
  4.  
  5. ' Formato: 2espacios + valor(2 dígitos) + espacio(s) + separador
  6. private function Format2Digitos(byref Valor as string, optional byval Size as byte = 8, optional byref Separador as string = "|") as string
  7.    dim Salida as string, k as integer
  8.  
  9.    if (len(valor) = 1) then
  10.        salida = ("  0" & valor)
  11.    else
  12.        salida = ("  " & valor)
  13.    end if
  14.  
  15.    k= (len(salida) + len(separador) - Size)
  16.    if (k > 0) then salida = salida & Space$(k)
  17.  
  18.    ConcatValues = (Salida & separador)
  19. end function
  20.  

Puedes modificarlo para más valores que solo 18, 19 y 20... siguiendo el patrón o más complejo si es más ambicioso.
Nota que no se deben repetir valores entre las constantes de la función 'GetArrayDeValores'... al mismo tiempo, podrías disponer diferentes valores constantes cuando sean diferentes cantidades (yo en el ejemplo he optado por aceptar los previos e incrementar en uno cada vez).

No creo que haya que explicar nada más, es bastante simple y cualquiera que sepa un mímino de programación debería entenderlo todo sin más problemas. No obstante si tienes alguna laguna siéntente libre de preguntar.
26  Comunicaciones / Redes / Re: Porqué no descarga a toda la capacidad en: 6 Junio 2024, 16:02 pm
Porqué mi conexión utiliza 0.0977% del 100% que estoy pagando?
Por la misma razón que aunque tu puedas correr pongamos a 25km/h. no vas por la vida a 25km/h, vas caminas a 5km/h. y en alguna ocasión corres (un bajo porcentaje de tu máxima capacidad). Economía, gasto innecesario... considera además que no depende solo de la capactidad de tu  dispositivo, también de la del dispositivo que transmite los datos que recibes y todos por los que pasa.
27  Media / Diseño Gráfico / Re: Busco técnicas para dibujar muro: ¿Achicar una parte? en: 6 Junio 2024, 15:54 pm
Como veo que no respondes, no hay feedback, te abro otro hueco...

Cuando debes hacer ciertas modificaciones, en gráficos de imagen se suelen denominar transformaciones... hay transformaciones de sitio (mover, es decir desplazar una imagen, hacia cualquier posición, suele bastar con añadir los valores de desplazamiento (x,y) a la imagen... hay varias transformaciones simples (incluído la escala), sin mebargo la suma de todas ellas pueden ser aplicada de unsa sola vez en una sola operación que es la trandformación 3d, pues utiliza multiplicacion de matrices para conservar los datos y finalmente aplicarlo una sola vez, al final debe proyectarse (convertirse de vuelta a 2D), para volcarlo en la pantalla.

No obstante si es solo ese caso, esa transformación la que necesitas aplicar y ninguna más (sesgar la imagen), se puede acelerar el caso, ya que en sí no es más que una interpolación de un área de origen a otra área de destino (que toma forma de trapecio).
Es necesario sin embargo, rotar los 4 puntos de la esquina de la imagen original, para tener la posición (y límites) de la imagen final.
Entopnces por cada pixel en el área de destino, debes preguntar cual píxel de origen le corresponde (con o sin interpolación, pero inicialmente y para pruebas mejor toma el píxel más cercano, olvida interpolación lineal, bilineal, cúbica ni nada complejo, salvo que el resultado no resultare satisfactorio, aunque de entrada es bueno una interpolación del píxel más cercano).

Para calcular el píxel en origen, debes descubrir que transformación ha sufrido el pixel en destino (movimiento). Esto son simples matemáticas... si en origen la imagen media 800px de ancho y en destino mide 500, entonces hay un factor de desplazamiento horizontal para cada pixel en destino de 800/500, y verticalmente en cambio va en 'fuga' es decir debe actualizarse por cada distancia cuanto se ha visto afectado verticalmente... son simples cálculos de divisiones y multiplicaciones.
Pero como te digo, al menos para las 4 esquinas si deben calcularse rotacionalmente su destino, ya que delimitan el área de destino y por tanto las medidas que afectan la transformación.

En las API de win2, hay una que se llama 'world transform', al que se le pasan como parámetros la imagen, los puntos de las esquinas y las transformaciones a efectuar y te devuelve la imagen transformada. Desconozco si en tu lenguaje hay acceso a tales funciones directa o indirectamente (que sería una buena opción si quieres resultados sin complicarte en como lograrlo).
28  Seguridad Informática / Análisis y Diseño de Malware / Re: Ayuda para encontrar la clave privada BlackHunt 2.0 en: 6 Junio 2024, 15:26 pm
Código:
int32_t eax_1 = (__security_cookie ^ &__saved_ebp);
Usa una cookie de seguridad para proteger contra ataques que intenten modificar el stack.

Código:
if (data_479b08 != 0)
{
    sub_401d20(u"GenKey");
}
Comprueba si la variable 'data_479b08' está establecida, y en tal caso, invoca una función para generar una clave.

Código:
if (CryptGenKey(data_478108, 1, 0x8000001, &data_47a32c) == 0)
{
    // Error handling
    return 0;
}
Aquí genera una clave criptográfica utilizando la función 'CryptGenKey'.

Código:
BOOL eax_17 = CreateFileW(u"C:\ProgramData\#BlackHunt_Private.key", ...);
La clave privada y su ruta...

Código:
eax_18 = CryptEncrypt(data_47a328, 0, 1, 0, i, &var_c, 0x100);
Cifrando la clave privada...

Código:
HANDLE eax_24 = CreateFileW(u"C:\ProgramData\#BlackHunt_ID.txt", ...);
Id del ransnnware.
Nota que el id que te solicitó, no necesariamente esté ni necesite estar cifrado, quizás simplemente se use como key para localizar 'tus datos', al menos es lo que yo haría, no lo pondría tan simple.


Código:
if (CryptImportKey(data_478108, lpMem_1, i_11, 0, 0, &data_479b00) == 0)
{
    // Error handling
    return 0;
}
Aquí se importa la clave pública... más arriba había una exportación de la clave
Citar
if (CryptExportKey(data_47a32c, 0, 7, 0, i_1, &pdwDataLen) == 0)
{
    // Error handling
    return 0;
}

Al final libera recursos...

p.d.:
Por si te sirve, he aquí el pseudocódigo del código ofuscado:
Código:
Iniciar protección del stack
Si (data_479b08 != 0)
    Llamar a sub_401d20("GenKey")

Reservar memoria para una estructura

Generar una clave criptográfica
    Si falla
        Llamar a sub_401d20("CryptGenKey Faild!")
        Retornar 0

Exportar la clave criptográfica
    Si falla
        Llamar a sub_401d20("CryptExportPrivateKey1 Faild!")
        Retornar 0

Reservar memoria para la clave exportada

Exportar la clave criptográfica
    Si falla
        Llamar a sub_401d20("CryptExportPrivateKey2 Faild!")
        Retornar 0

Crear y escribir la clave privada en un archivo
    Si falla
        Llamar a sub_401d20("Cannot Create PrivKey File")
        Retornar 0

Cifrar la clave privada
    Si falla
        Llamar a sub_401d20("EncryptKey Faild!")
        Retornar 0

Escribir la clave privada cifrada en un archivo
    Si falla
        Llamar a sub_401d20("Cannot Write PrivKey To File!")
        Retornar 0

Crear y escribir la clave pública en un archivo
    Si falla
        Llamar a sub_401d20("Cannot Create PubKey File")
        Retornar 0

Escribir la clave pública en un archivo
    Si falla
        Llamar a sub_401d20("Cannot Write PubKey To File!")
        Retornar 0

Importar la clave pública
    Si falla
        Llamar a sub_401d20("Import PubKey failed!!")
        Retornar 0

Crear y escribir el ID del ransomware en un archivo
    Si falla
        Llamar a sub_401d20("Cannot Create ID File")
        Retornar 0

Liberar memoria y destruir claves
Finalizar protección del stack
Retornar resultado final

Suerte con tus pesquisas.... suele ser tedioso tener que operar con código ofuscado, pero si tienes suficientes conocimientos de programación algo podrías llegar a sacar...


p.d2.: Nota la llamada a las funciones de la API de criptografía de Win2: CryptGenKey, CryptExportKey, CryptEncrypt, CryptImportKey, CryptDestroyKey... estamos ante RSA.
29  Media / Diseño Gráfico / Re: Busco técnicas para dibujar muro: ¿Achicar una parte? en: 5 Junio 2024, 08:21 am
Creo que te confundiste, esto no es para un juego ni es animación...
No.

Tu respuesta sigue constando ahí. Simplemente si lo necesitas para otra cosa, sobran otros detalles.
...
Por otro lado, si lo que quieres es calcular la imagen de un muro sesgado Uun cuadrado que se vea como un rombo, por ejemplo), la ecuación es la de la rotación 3D, con o sin perspectiva. Suele partirse de la imagen con las cordenadas X,Y,Z = 0,  Escala=1, etc... el ángulo de la cámara, debe seguirse sea en cualquiera de las cordenadas 3D que interese (no necesariamente deben ser las 3, pero el cálculo si obliga a usar las 3).

Dichos cálculos son algo pesados pues requiere aplicarlo a cada píxel... hay algoritmos que previamente limitan la secuencia para calcular solo los planos que se verán de la escena ty de ellos todavía solo los píxeles del mismo que se verán aceerando así el cálculo limitando los que no se ven, determinar esto también consume tiempo, por lo que no es útil siempre si no solo en escenas pesadas y recargadas de objetos individuales y además cuando se pretende consdeguir cierto realismo. Dándose ciertas licencias, uno puede limitarlo a calcular solo determinadas cosas, por ejemplo los muros, que es donde la perspectiva se parecia grandemente su efecto y no por ejemplo en los personajes, que suele bastar con aplicarles escala si están más o menos cerca.
30  Programación / Programación General / Re: Contar cuántos cuadraditos pintados aislados hay en un dibujo. en: 4 Junio 2024, 18:36 pm
Hummm... otro de esos mensajes que da hasta pereza leerlo completo.

Veamos, un 'cuadradito' es de cualquier tamaño?. Al menos se puede rechazar el cuadrado de 1x1 píxel?.
Si un 'cuadradito', ya se contó, puede todavía formar parte de otro más grande?.
Si el color blanco refiere al fondo, entonces solo se forman cuadraditos de color negro, o hay más colores?....

Como ves faltan muchos detalles (y no quiero ser exhaustivo), para poder decirte algo concreto y directo.

No obstante si puedo decirte algo más simple y práctico, al menos para que puedas empezar a enforcarlo, indistintamente de las respuestas y lo que tengas en mente.

Considera una imagen (si en tu caso es en B/N, mejor), como una tabla de 'Ceros' y 'Unos'... al ser una tabla, quier decir que con filas por columnas...


Código:
funcion BuscarCandidatos(mapa, filas, columnas)
    For cada fila desde 0 hasta filas-2  
        Por cada columna desde 0 columnas-1
            Si mapa(fila, columna) = 0
                Si (Contiguos >1)  // Se asume que un cuadrado = al menos 2x2
                    si Llamada a función VerificarCuadrado(fila+1, columna-contiguos, contiguos)= true
                        Añadir cuadrado a la colecciónCuadrados.Add(fila, columna, contiguos)
                        o solo contarlos Cuadrados(contiguos) +=1  //contiguos denota el tamaño del lado.
                    fin si
                fin si

                contiguos =0
            en otro caso
                contiguos +=1
            fin si
        Siguiente
    siguiente


fin funcion

Un cuadrado será 'bueno', solo si está completamente delimitado por 'blancos a su alrededor (excepturando las 4 esquinas)...
NOTA: La primera fila se verifica en la función de arriba, aqquí el resto de filas de 11111.... y los perímetros de 0000...
Código:
buleano = Funcion Verificarcuadrado(filaY, columnaX, contiguos, filas, Columnas)
    // 1 revisamos que la columna encima sean todo 0.
    Si (filaY-2 > 0)    // si existe en el mapa
        por cada columna desde columnaX hasta ColumnaX + contiguos)
            Si mapa(filaY-2, columna) = 1 devolver false    // hay algo más adosado arriba del candidato...
        siguiente
    fin si

    // 2 Revisamos que pueda existir un cuadrado de 'contiguos*contiguos'
    por cada fila desde filaY hasta filaY+contiguos-1)
        Si (columna >0)    // 2a puede estar pegado a la pared izquierda el cuadrado
            Si mapa(fila, columna-1) = 1 devolver false // hay algo más adosado a la izquierda del candidato...
        fin si

        // 2b comprobar el cuadrado en la zona vertical...
        por cada columna desde columnaX hasta ColumnaX + contiguos-1)
            Si mapa(fila, columna) = 0 devolver false // no es un cuadrado
        siguiente

        Si (columna no es la última (columnas))  //2c puede estar pegado a la pared derecha el cuadrado
           Si mapa(fila, columnax+contiguos ) = 1 devolver false // hay algo más adosado a la derecha del candidato...
        fin si
    siguiente

    // 3 Revisamos que la columna debajo sean todo 0.
    Si (filaX+contiguos < filas)   //si la fila existe en el mapa
        por cada columna desde columnaX hasta ColumnaX + contiguos)
            Si mapa(filax+contiguos, columna) = 1 devolver false
        siguiente
    fin si

     // Si pasaron todas las pruebas, el candidato es un cuadrado.
    devolver true
fin funcion

Nota que trabajamos considerando una tabla, un mapa, un array bidimensional de valores 0-1, puede sustraerte de que son colores, así lo ves más sencillo, dibuja en un papel puntitos representando cada píxel negro, y como un valor 1, para comprender la sencillez del algoritmo...

Un cuadrado será bueno, solo si está completamente delimitado por 'blancos a su completo alrededor... pero esto puede no ser tan restrictivo según tus necesidades, no obstante esto es lo que considera el algoritmo, por eso cuando se verifica un candidato, no solo se verifica que el cuadrado esté con todos '1', también que permitrealmente sean 0... (excepto diagonalmente sobre las 4 esquinas).

NOTA: El algoritmo no está optimizado (ni considera cuadrados dentro de cuadrados), tras encontrar una 'cuadrado en una linea', las siguientes líneas de las que forma parte ese cuadrado se ven expuestas a ser buscadas de nuevo.   ...pero así el algoritmo es mucho más sencillo de entender, aunque tarde más en calcular.

Por último, te aclaro que esto es una aproximación genérica según los detalles que necesites (que no me he enterado bien, he tirado por lo lógico que uno puede aceptar como un 'cuadrado'), tendrás que modificarlo a tus necesidades.... y es fácil que a veces al escribir al vuelo se escape o falte un +1, -1... por algún lado.
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 436
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines