Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#3171
.NET (C#, VB.NET, ASP) / Re: Calcular porcentaje
21 Agosto 2017, 13:47 PM
La barra de progreso, siempre va desde el valor mínimo al valor máximo.

Para que vaya del 0 al 100, esos deben ser los valores límites.

Si necesitas que se ajuste a esos límites, una de dos, o pones esos límites y trabajas con los que hay o pones los que hay y formateas esos límites (sin embargo, no tenemos control sobre la presentación, el redibujado del valor, así que exigiría crear tu propio control. y prograsmar un evento 'Changed' (o ValueChanged), que es donde redibujamos el valor y con la ayuda de una propiedad "AjustarSiemprealTantoPorCiento" = TRUE
Como dudo que vayas a crear un control de usuario solo para eso, me remito a la solución sobre el progressbar...

- Puesto el control del 0 al 100: Supongamos que vas a leer 63147 bytes... desde un bucle,
   Float PorCiento1

   // pgbProgreso, aquíes un control ProgressBar
   pgbProgreso.Min = 0
   pgbProgreso.Max = 100 // en realidad solo llegaremos al 99, pero dejamos 1 más por si los decimales alcanzan el 100, para que no 'cante' error...

   PorCiento1 = (63147 / 100)
   Bucle para k desde 0 a 63146
      // cosas por hacer
      pgbProgreso.Value = (porciento1 * k)
      // otras cosas por hacer
   Fin Bucle


p.d.: No había visto la imagen (hasta enviar la respuesta) y que no usas un control progressbar, si no que muestras el resultado en un simple label... modifico el pseudocódigo previo:

   Float PorCiento1

   //lblProgreso, sería aquí un label
   PorCiento1 = (63147 / 100)
   Bucle para k desde 0 a 63146
      // cosas por hacer
      // Damos formato al valor para que tenga al menos 2 decimales.
       // OJO:
       //     La barra "\" es una división entera.
       //     INT es una función de conversión donde se elimina los decimales.
       //     ToString, no deja lugar a dudas....
      lblProgreso.Text = (Int((porciento1 * k) * 100) \ 100).ToString & "%"
      // otras cosas por hacer
   Fin Bucle
#3172
Bien, vas avanzando... pero te daré algunas ideas...

1 - Es preferible no considerar el punto central como el punto de cruce entre las líneas que unen los puntos verticales y horizontales, sino, como muestor en el siguiente dibujo, el punto medio entre la distancia que separa los puntos horizontales, e ídem de los puntos verticales, de modo, que con ese centro es equidistante a ambos lados, pudiéndose trazar (si fuera el caso), un círculo o elipse que pase por ellos.
No es del todo obligatorio, pero reduce la cantidad de píxeles a visitar...
Se expone en la siguiente imagen (he desplazado los puntos para que no vengan a coincidir enfrente uno de otro y quede más claro la idea...


2 - Con los 4 puntos, se elige uno como inicio y una dirección (pongamos el de arriba y girando en sentido de las agujas del reloj, ahora nos centramso solo ne ese cuadrante. (son 4 bucles uno de trás de otro, que corresponden a cada cuadrante). Se lanza una línea entre los dos que limitan ese cuadrante... ¿por qué?. ahora vemos con una imagen porqué.
En la imagen se ven 6 variacones de la misma figura. Mira la última, si no corta la figura, implica que esa es la línea que encierra la figura, luego esa sería la solución para ese cuadrante.
Pero miremos a la figura 1, si recorremos los píxeles de la línea, podemos contar cuantas veces corta la figura (recordemos que la figura la tenemos en negro y el exterior en blanco, yo para que se vean con claridad los detalles, he conservado solo el contorno. en la imagen 1, la línea de contorno es interceptada 4 veces, una siempre sale otra que entra, luego podemos deducir que como mínimo hay 2 'picos' salientes. Bien si ahora te fijas en a imagen marcada como 3, verás que el controno se intercepta 10 veces, es decir hay al menos 5 'picos' salientes, se puedne contar bien, he puesto un trazado amarillo en cada saliente.
Pueden ser más pícos que el número dividido entre 2 (la marcada como 4 tiene el propósito de demostrar eso), pero nunca menos.
La 1 la 2, son la misma, en la 1 simplemente he trazado las 4 líneas que unen los 4 puntos, como idea general...
La imagen 5 redunda en lo mismo, ver que aunque el contorno sea retorcido siempre una intercepción entra en la figura y la siguiente sale.
Esos puntos de intercepción del contorno son útiles... nos sirven para saber cuantos picos cabe encontrar como mínimo.



En la siguiente imagen, vamos a analizar más en profundidad la importancia de los puntos de interceción de  contornos. Si miras con detenimiento la siguiente imagen, podrás ver que cada vez que la línea azul, corta el contorno, las veces impares, entra dentro de la figura y las veces pares sale de la figura , esto sucede siempre, da igual lo enrevesado que sea la imagen. De hecho esta característica es la base de rellenar figuras encerradas (o lo opuesto rellenar el exterior) con un color o un patrón, solo recorriendo línea a línea...


Ahora vamos al siguiente paso importante... se muestra en las siguientes imágenes...
Hemos empezado a detectar los picos, para ello se generan dos bucles, uno de recorrido vertical y otro horizontal ... por supuesto son dos bucles anidados, uno de recorrer líneas y el interno para recorrer los píxeles de cada línea.
En el horizontal vamos detectando el borde saliente, cada vez que una línea encuentre lo más a la derecha un contorno, y, en la siguientes líneas (el bucle interno anidado) empezamos (como mínimo) en esa posición, no volvemos cada vez al origen (centro de cordenadas). Esto se muestra en el trazo azul. Si recorriéramos todo, empezaríamos el bucle horizontal siempre desde la línea roja, sin embargo eso solo sucede en la primera línea. Cuando llega al pico 1(ver la marca rosada), ya empieza las siguientes líneas en ese punto. Esto acelera la búsqueda...


Se puede ver también que he trazado unas líneas rojas.... Una vez detectados los puntos salientes, desde el punto final del cuadrante (o desde el punto origen), se trazan líneas a cada uno de esos puntos recién obtenidos.
De entre todas esas líneas, aquella que arroja el ángulo más grande respecto de la línea que trazamos entre ambos puntos originales, es el punto más saliente.
De nuevo desde ese punto, trazamos líneas (la primera al punto de origen del cuadrante) y al resto de puntos obtenidos (más arriba en el eje 'Y', que la posición 'y' que ocupa éste punto), y de nuevo aquella línea que marca el ángulo mayor con respecto a la línea trazada hacia el punto del cuadrante, determina el punto más saliente....
Siguiendo el procedimiento, se obtiene todos esos puntos salientes que encierran la figura en ese cuadrante.
Es trivial, dibujar las líneas de los siguientes (saturaría la vista tantas líneas), se observa fácilmente que desde el punto final del cuadrante, marcado como 0, la línea irá al 1, luego al 3, luego al 5 y finalmente al de origen marcado como 6.


En esta otra imagen, más de  lo mismo. Tiene trabajo, pero es un modo seguro. Zonas redondeadas, pueden dar, líneas muy cortas y próximas entre sí, que pueden 'falsear' luego los ángulos. Pueden 'resumirse'...
Un detalle (en la esquina superior izquierda de la imagen) es ver como en el bucle de recorrido horizontal, se empieza siempre desde la línea del eje, (en este cuadrante desde ahí hacia la derecha).
En azul claro, el trazado necesario para detectar los picos con sus puntos. Hay que notar que el procedimiento descrito solo se 'visitan' desde los bucles (el bucle interno) los píxeles de la zona marcado en ese color cyan, no todos los del cuadrante, ya que el iniio del bucle interno, va fijandose con un valor mayor cada vez que en una línea se detecta uno más saliente.


El resto de cuadrantes es aplicar el mismo sistema, con los cambios que proceden o recurrir a senos y cosenos...

Si te queda alguna duda o las explicaciones no te parecen suficientemente claras, avisa... se puede hacer un pseudocodigo...

Cuando avances más te comento algo sobre los atractores gravitatorios... que resultan muy útiles para detectar similitud de formas con flexibilidad en contornos y en la propia forma.
#3173
Ni siquiera ensamblador.

La fuerza bruta está ahí, solo para entender, para aprender las cosas, no para ser aplicada como recurso. La excepción es cuando se sabe a fé cierta que un sistema tiene una baja tasa combinatoria (como los 4 dígitos de las tarjetas de crédito) y el sistema no tiene alertas de intrusión.
#3174
Cita de: MCKSys Argentina en 20 Agosto 2017, 06:33 AM
Sólo en el mes de agosto atentados en: Barcelona, Afganistán, Camerún, Egipto, Filipinas, India, Iraq, Kenya, Nigeria, Pakistán, Siria, Somalia, Yemen, Burkina Faso, Tailandia, Mali, Arabia Saudí, Myanmar y Libia.

El terrorismo no es problema exclusivo de occidente...
Seguramente no sea tu intención, pero suena a algo así como: "Joderos y aguantaros que hay más países donde se asesina sin motivos".
Lo cierto es que todos esos países son páises de conflictos religiosos, y salvo La India, todos los demás son de mayoría absoluta musulmana. ¿Casualidad?. No, simplemente se trata de gente demente.
Occidente no es de mayoría musulmana, ni siquiera de minoría musulmana, son de tradición católica, la presencia musulmana es exclusivamente por la inmigración.

Luego cabe admitir que los atentados terroristas (en occidente) de esta gente es totalmente inadmisible. No hay aquí políticas que excluyan a minorías sectarias de musulmanes como pueda suceder en todos esos otros países, ni se aplican persecuciones ni matanzas, ni nada que se le parezca. No hay razón que justifiquen esos actos, ni siquiera 'venganza', porque no hay en origern ninguna causa... otra que la demencia de quienes lo llevna a cabo.

Yo también soy partidario de un extricto control del flujo migratorio, especialmente por Europa por parte de no ya sólo de indocumentados, si no de todos aquellos cuyo origen hasta segundos ancestros no se aprecisamente Europa. La libre circulación por europa es algo bueno y grande pero debería quedar recluído a los propios europeos (o los del tratado Exchengen), y para los no serle exigible un visado tal y como sería lo correcto si vinieran desde sus p`ropios países de origen. Si un egipcio entra en Francia, se le exige un visado y debería ser exclusivo para Francia, no para todo el territorio europeo, si luego quiere ir a Alemania o España, se le deberá exigir igualmente el visado tal y como si viniera desde Egipto. No es admisible que una vez entrado en Europa se 'paseen' por ella...
Si un ciudadano europeo va a Egipto, dudo que pueda por las buenas recorrer toda África sin los debidos visados y control de fornteras ante cada país. Que en europa hayamos llegadoa ciertos acuerdos, deberían quedar limitados para poblaciones cuyas razones de 'movilización' no se satisfacen...
#3175
Como te dice Randomize.

Judios y árabes escriben así...

De todos modos en los IDE de Microsoft, los 'textbox y label, suelen tener una propiedad para eso...

Y en cualquier caso, escribir en esa dirección es simplemente posicionar el siguiente carácter en la escritura. Si vas a escribir la palabra "Hola", empiezas con la h en la posición 0, sumas el ancho de la 'H'a, + el espacio entre caracteres y escribes la 'o', sumas el espacio de la 'o' + el espacio entre caracteres y escribes la 'l', etc... la 'a'.
Para escribir a derecha, empiezas al final de la línea (en vez de en la posición 0), - el ancho de la 'H', y escribes la 'H', luego restas el ancho de la 'H', - el de la 'o' - el espacio entre caracteres y escribes la 'o', restas el espacio de la 'o', el de la 'l' y el espacio entre caracteres y escribes la 'l'....

Como ves es solo cuestión de posicionar horizontalemtne el puntero de escritura...
#3176
Dudas Generales / Re: ¿Internet, qué es?
19 Agosto 2017, 07:20 AM
De entrada hay unos protocolos que definen como ha de funcionar todo, precisamente para que funcione y no sea un caos.

Los ISP, vienen a ser como las 'empresas constructoras de carreteras'. Tiran cables por las ciudades, fibra óptica, colocan antenas o incluso lanzan satélites, o por qué no, colocar estaciones wifi, cada x espacio. Su beneficio principal es la de sus clientes. Los ISP 1 vienen a ser como los gobienros que contratan a las empresas para construir las carreteras. a fin de cuentas internert es una infraestructrua como otroa cualquiera. en cada pási, puede ser muy diferente, en algunos serán empresas privadas que tuvieron su monopolio (telefónica, por ejemplo en España), y en otros serán el gobierno, universidades, o más empresas.

Aunque no te interese la historia, lo cierto es que la mayoría de respuestas están ahí, en la historia... por ejemplo la falta de seguridad de la que adolece internet, parte del diseño inicial pensado para los militares. La idea era que si vas por x sitio y el 'enemigo' te para los pies, no puedes avanzar, o bien si vas por aqwuí, por allí y luego por allá saben que vas a tal sitio o que vbiniste de tal otro. Era requisito del diseño, que ante un 'tapón' pudiera tomarse otro camino, tal como haces tu en una ciudad si una calle está cortada por una avería de las tuverías del agua, por ejemplo. Todo eso favorecía el anonimato, que los espías (informadores), no fueran cazados...

Se utiliza el mismo protocolo, porque ya hemos vivido algunos siglos donde cada ppaís tiene su idioma y es de sobra conocido el problema de no usar un lenguaje común. Si existe un solo 'internet' todos podrmeos hablar el mismo lenguaje y entendernos.
Pero esto no es del todo cierto. al comienzo, había multitud de redes muy diferentes, de hecho a comienzos de los 90, uno de los grande sproblemas es que muchas universidades habína implementado sus propias redes y eran incompatibles con los del resto del planeta... poco a poco se fueron uniendo y dejando hacia dentro la red 'particular', de hecho las LAN, nacieron así... al principio eran la parte de la infraestructura que proveía sus propios protocolos, y donde más allá no se podía llegar. Esto duró hasta poco más o menos mediados de los 90...

Aún hoy puedes estar seguro que debe haber muchos más protoclos de red, restringidos a determinados intereses/gobiernos, etc...  y que tengan su salida a internet, pero que como antaño, de ahí hacia adentro sea una incógnita.
Desde el momento en que los router se universalizaron (ganando unas patentes sobre otras), los protocolos fueron cada vez más adoptados que los sistemas operativos, implementaron... luego quien compraba un sistema informático, ya tenía soluciones y si eran empresas ya tenían esa infraestructura o debían adaptarla si no era compatible...

La 'magia' de los Wan (los ISP), como tu dices reside en unos algoritmos de grafos, para encontrar los caminos entre el origen y el destino. Las IPs, son como las ciudades, el origen y el destino de los datos, la WAN tiene un mapa de qué IPs pertenecen a qué proveedor y dónde se encuentran. Fíjate que incluso podría ser un mapa ciego, del tipo: 'toma esto para tí, pásalo al siguiente', y que te responda 'no, eso queda en la otra dirección' . Si estás pongamos en Noruega y envías una imagen a Sudáfrica, cuando un paquete sale de tu equipo, en un momento dado puede haber varias copias circulando por la red, 3 en Italia, 2 en Marruecos, 5 e turquía incluso puede que 2 en China y 1 en Brasil... cuando llegan a Sudáfrica (los que no se pierdan, que a veces puede ser así), se queda con el primero (correcto) que llega y descarta los siguientes. Y no, no necesariamente la línea recta es la más corta, la densidad del tráfico, es clave, igual que si tu vas a tu casa y hay una manifestación puede que llegues antes si das un rodeo de 1 kilómetro que tratar de recorrer 200 metros contracorriente de la manifestación...

Los ISP, tienes que verlos como empresas de paquetería y mensajería... cuando llega al ISP de destino, es como cuando un paquete o una carta llega a la oficina de tu barrio, el cartero local, conoce los nombres de las calles del barrio y sabe repartirlas. en la distancia, solo importa la 'parte alta' de las IPs... el ISP, es quien conoce bien el destino de la 'parte baja' de las IPs, bajo su concesión.
#3177
No hay mucho de donde mejorarla. Técnicamente es correcta. Aunque es cierto que algo si se puede.

Te comento. Tu estás considerando siempre dos áreas, pero vamos a hacernos una imagen mental, para que sea más fácil entender donde quiero ir a parar.

imagina que tienes una espda y luchas contra otro que también tiene una espada. El área de cada uno, entonces es uno mismo y las dimensiones de la propia espada. es fácil de entender, verdad?

Bien, entonces la cuestión es... a quién le importa, tu espalda o 'su' espalda?. quiero decir, que la intercepción se basará en un punto, y no es preciso un área.

Supongamos que 'el jugador' es This (tu, yo, el que lo lea que se ponga en primera persona) y que el 'enemigo' es el área (rect).... con esto y lo dicho previamente pasemos al pseudocódigo...

Clase cThis
     entero X, Y, Width, Height
     entero Right, Bottom

     // Asignación de todos los datos del área (se reposiciona y redimensiona)
     Funcion MoverYDimensionar(rect Area) // puedes pasar valores individuales, (x,y,Width,Height) o incluso solo dos puntos de la diagonal principal '\' y calcular como proceda, o bien sobrecargar la función si se usan más que solo una.
         This.x = Area.X
         This.y = Area.Y
         This.Width = Area.Width
         This.Height = Area.Height

         This.Right = (This.X + This.Width)
         This.Bottom = (This.Y + This.Height)
     Fin Funcion

     // Cuando se desplaza (pero mantiene el tamaño):
     //       ('Inc'remento indica si los valores son relativos o absolutos)
     Funcion Mover(entero X, entero Y, buleano Inc)
         Si (Inc = FALSE)
             This.X = X
             This.Y = Y
         Sino
             This.X += X
             This.Y += Y
         Fin si

         This.Right = (This.X + This.Width)
         This.Bottom = (This.Y + This.Height)
     Fin funcion
   
     // Cuando se cambia de tamaño (pero mantiene su posición):
     //       ('Inc'remento indica si los valores son relativos o absolutos)
     Funcion Dimensionar(entero Witdth, entero Height, buleano Inc)
         Si (Inc = FALSE)
             This.Width = Width
             This.Height = Height
         Sino
             This.Width += Width
             This.Height += Height
         Fin si

         This.Right = (This.X + This.Width)
         This.Bottom = (This.Y + This.Height)
     Fin Funcion

// y por fin la detección de la colisión.
     // El detector de colisión, ahora exige menos matemáticas.
     Buleano = Funcion ColisionaCon(cThis cT)
          // si de entrada se aleja horizontalmente, no perdemos tiempo en comprobaciones verticales
         Si ( cT.Rigth > This.X) y (cT.X < This.Right) luego              
             Devolver ( cT.Bottom > This.Y) y (cT.Y < This.Bottom)
         Sino
             Devolver FALSE
         Fin si
     Fin Funcion
Fin clase



Tanto 'nosotros' (player) como el 'enemigo' seríamos instancias de cThis, y se llamaría así:
Si Player.ColisionaCon(Enemigo) luego
    ...


Funciona y es más rápido, porque:
A - Se calcula una única vez, el valor 'Right y Botton', y se guardan, en lo sucesivo ya no se calculan. Por tanto cada vez que haya que hacer la detección de colisión, nos ahorramos 4 sumas.
B - También contribuye a la velocidad que la comparación la dividimos en dos pasos, primero horizontal y luego vertical, (no importa si fuera al revés, de hecho si fuere más frecuente los movimientos verticales, sería mejor poner delante la comprobación vertical). al dividirlo en dos pasos no forzamos una posterior comprobación si la previa ya falló, pero incluso si es necesario la segunda comprobación también es ligera (no realiza sumas).

En Resumen, la detección ahora solo requiere:
   2 ó 4 comparaciones y 0 sumas
Antes requería:
   4 comparaciones y 4 sumas


Las sumas se hacen una sola vez cuando se establece/modifica el tamaño o se reposiciona, pero no con cada verificación de colisión.
Aunque al final viene a ser lo mismo, sin embargo el momento es diferente, al mover o redimensionar, no suele haber tanta carga de trabajo, luego... deja más tiempo para actualizar valores, en cambio cuando se exige detectar suele haber más trabajo 'pesado' en curso, entonces aligerar de ahí es adecuado.
En resumen, desplazamos la carga de trabajao a momentos menos activos, aligerando los momentos más activos. Aunque siempre va a depender de cada caso concreto...

...pero bueno, lo que pedías es posible...


---------------------
p.d.: Al publicar ya había más respuestas... te comento: asegúrate tras rehacer tu código que funciona en todos los casos... he aquí una imagen de los casos posibles (considera el cuadro rosado como el jugador y los azules como el enemigo), falta el caso de que el jugador esté completamente dentro del área del enemigo (el cuadro rosa dentro de uno azul), en las imágenes quedaba sobrecargado y se prestaba a confusión así que la he evitado.
#3178
Por eso es mejor responder con pseudocódigo. No pueden copiar y pegar sin más, tienen que leerlo sí o sí, y entenderlo... obligas a que se esfuercen...
#3179
Exacto...

Una vez con los 4 puntos y uno considerado como el 'centro geométrico', desde los 4 hay que buscar los puntos salientes que tocando a la figura logran encerrar por completo la figura.

La parte que puede parecer un poco confusa (espero que no), es la de considerar el ángulo convexo o cóncavo, ya que eso depende del cuadrante (en realidad ángulo de ambos puntos alrededor del eje).

Por último, aunque no se ha mencionado explicítamente si no que se ha dejado un poco al aire, es que consideramos similitud... porque puede tener diferentes interpretaciones según lo que busquemos:
Similitud en la forma, similitud en tamaño (área), etc...
Se ha asumido de forma genérica, pero los detalles dados permiten avanzar en la dirección que uno pretenda.

p.d.: No he mirado tu código aún... cuando avances algo más le hecho un vistazo.
Ten en cuenta que es fácil perderse, o desalientarse porque hay muchos pequeños detalles que mimar y ponder en orden. Pero bueno, cada función en pseudocódidigo está en grandes pasos (y escrito al vuelo), se puede pulir y detallar más llegado el caso.
#3180
Olvidaba decirte, que hay otra más sencilla y rápida, pero es aplicable solo cuando tengas la seguridad de que las imágenes tienenn todas la misma orientación y si no es así, deben antes ser rotadas, considerando los 4 puntos más sobresalientes de uno consderado centro.

Esto es, si hay que rotarlas, primero trazas un punto que inscriba por completo la figura, pero tocando en al menos 3 puntos el exterior del perímetro de la figura.
Luego buscas 3-4 puntos más alejados del centro.

Esos puntos te sirven para saber cuanto puede estar rotada una figura respecto d ela otra y si es preciso se rotan. También para saber si una está desplazada respecto de otra.

Recuerda que debemos tener imágenes donde el fondo es blanco y la figura (no solo el trazo que la encierra) es negro (o viceversa), pero si es transparente hay que considerar la transparencia del color opuesto a la tinta d ela figura (blanco o negro).

Finalmente solo cuando estés seguro que 'encajan' en el mismo centro.

Entonces se hace una operación xor entre los píxeles de ambas imágenes. El resultado será el siguiente:
255 xor 255 = 0
0 xor 0 = 0
255 xor 0 = 255
0 xor 255 = 255
Es decir, donde una imagen coincida (dentro y fuera de la figura) con la otra, dará un píxel negro en la imagen resultado, y blanco cuando sean distintas. Contando el número de blancos sabremos cuanto difiere (o contando los blancos sabremos cuanto es igual). Usa la tolerancia con diferentes valores, para ver qué resultados te da.

Esta solución, es la adecuada cuando no hay que ser muy extrictos y las formas son más o menos claras, del mismo tamaño, pequeñas y la velocidad es muy importante.

P.d.: Aquí no se ha considerado si la imagen están espejadas (que veo que tienes dos iguales pero espejadas entre sí). cuando cabe la posibilidad de que estén espejadas, hay que hacer 4 comparaciones (4 bucles idénticos), el primero tal cual (como si las dos estuvieren corrctas, en otra donde la segunda imagen esté invertida horizontalemente, la 3ª donde se considere invertida a la segunda figura verticalemtne y la 4º donde se consdiere invertida a la segunda figura tanto vertical como horizontalmente.
Con los reconocimientos en el mensaje anterior es fácil detectar si están invertidas, porque las  áreas, perímetros vendrán a coincidir y medidas y ángulos  conncidirán en orden inverso...