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


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Hacer una línea, pintar los puntos intermedios de 2 puntos.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Hacer una línea, pintar los puntos intermedios de 2 puntos.  (Leído 1,227 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.759


Hackentifiko!


Ver Perfil
Hacer una línea, pintar los puntos intermedios de 2 puntos.
« en: 5 Mayo 2026, 01:34 am »

No estoy pudiendo resolverlo.

Véase la imagen.


Si se quiere unir el punto o casillero A con el 2, como está marcado con verde, puede hacerse algo así:
XDelCasilleroaPintar = 0
Repetir
   YDelCasilleroaPintar = XDelCasilleroaPintar
   Pintar casillero ubicado en XDelCasilleroaPintar, YDelCasilleroaPintar
   XDelCasilleroaPintar++
Mientras XDelCasilleroaPintar<3

Columnas (X) y filas (Y) fue contado desde 0.

Hay una relación entre Columna y Fila, una muy simple.

Si en cambio queremos unir el casillero B con el 2, debemos averiguar la relación entre fila y columna, algo así:
Fila y Columna
0 y 1
2 y 2
Nótese que estoy usando fila de base en vez de columna porque incluye más puntos en posiciones enteras.
En fin, sé que debo hacer esto:
YDelCasilleroaPintar = 0
Repetir
   XDelCasilleroaPintar = 1+YDelCasilleroaPintar/2
   Pintar casillero ubicado en XDelCasilleroaPintar, YDelCasilleroaPintar
   YDelCasilleroaPintar++
Mientras YDelCasilleroaPintar<=YDelCasillero2

Pero necesito la fórmula para obtener todos esos números.

¿Por qué ese 1?
Asumo que porque el YDeB-XDeB=1. O sea el Y del punto B es 1 y el X es 0. Está en la columna 1, fila 0.

¿Por qué +YDelCasilleroaPintar/2?

Además hay otros casos en que cuando una cosa (fila o columna, pintándose) aumenta la otra disminuye, como que son reglas de 3 negativas, no sé.

En definitiva el programa debe poder señalar 2 puntos al azar y determinar cuales intermedios debe pintar.

Son casilleros en realidad, pero es más o menos lo mismo.

Cuando un casillero tenga una ubicación decimal, se la redondería. No hay una respuesta correcta sobre hacia dónde cuando sea .5, ni importa en mi caso.


En línea

Mr.Byte


Desconectado Desconectado

Mensajes: 454



Ver Perfil
Re: Hacer una línea, pintar los puntos intermedios de 2 puntos.
« Respuesta #1 en: 6 Mayo 2026, 08:50 am »

Quizas tendrias de adaptar el algoritmo de Bresenham


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.759


Hackentifiko!


Ver Perfil
Re: Hacer una línea, pintar los puntos intermedios de 2 puntos.
« Respuesta #2 en: 6 Mayo 2026, 20:05 pm »

De momento se me hizo complicado de entender, como mucho en Wikipedia, seguiré intentando.
En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.759


Hackentifiko!


Ver Perfil
Re: Hacer una línea, pintar los puntos intermedios de 2 puntos.
« Respuesta #3 en: 8 Junio 2026, 08:00 am »

Intenté hacer un código con ayuda pero también se me hace muy complicado.

Lo mejor que logré sería esto:
Código
  1. function GenerarLineas () {
  2. // Pintar cuadraditos de modo que se forme una línea:
  3. // Elegir un color distinto al color del cuadro:
  4. do {
  5. ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
  6. } while (ColorDelCuadro == ColorDeImagen);
  7. // Determinar ubicación del punto 1,
  8. // llamado Punto en vez de Cuadradito porque...
  9. // ese nombre puede que se esté usando en otra cosa:
  10. FilaDePunto1 = random(CuadraditosPorFila);
  11. ColumnaDePunto1 = random(CuadraditosPorFila);
  12. trace("FilaDePunto1: "+FilaDePunto1);
  13. trace("ColumnaDePunto1: "+ColumnaDePunto1);
  14. // Averiguar qué cuadradito es y pintarlo:
  15. // NroDelCuadraditoaPintar = FilaDePunto1*CuadraditosPorFila+ColumnaDePunto1;
  16. // ParaColorDeCuadradito = new Color(Cuadro_pCuadradito+NroDelCuadraditoaPintar);
  17. // ParaColorDeCuadradito.setRGB(ColorDeImagen);
  18. // Punto 2 asegurando que no sea igual:
  19. do {
  20. ColumnaDePunto2 = random(CuadraditosPorFila);
  21. FilaDePunto2 = random(CuadraditosPorFila);
  22. } while (ColumnaDePunto1 == ColumnaDePunto2 && FilaDePunto1 == FilaDePunto2);
  23. trace("FilaDePunto2: "+FilaDePunto2);
  24. trace("ColumnaDePunto2: "+ColumnaDePunto2);
  25. // Para cálculos con regla de 3:
  26. FilasDeDistancia = FilaDePunto2-FilaDePunto1;
  27. ColumnasDeDistancia = ColumnaDePunto2-ColumnaDePunto1;
  28. trace("FilasDeDistancia: "+FilasDeDistancia);
  29. trace("ColumnasDeDistancia: "+ColumnasDeDistancia);
  30. // Averiguar la distancia mayor y graficar en función de ella:
  31. if (Math.abs(ColumnasDeDistancia) >= Math.abs(FilasDeDistancia)) {
  32. RelacionFilasColumnas = FilasDeDistancia/ColumnasDeDistancia;
  33. trace("RelacionFilasColumnas: "+RelacionFilasColumnas);
  34. ColumnaBase = ColumnaDePunto1;
  35. // Averiguar si avanzar hacia la derecha (+1) o la izquierda (-1):
  36. if (ColumnasDeDistancia >= 0) {
  37. Paso = 1;
  38. } else {
  39. Paso = -1;
  40. }
  41. do {
  42. trace("ColumnaBase: " + ColumnaBase);
  43. DistanciaRecorrida = ColumnaBase - ColumnaDePunto1;
  44. FilaCorrespondiente = Math.round(DistanciaRecorrida * RelacionFilasColumnas + FilaDePunto1);
  45. trace("FilaCorrespondiente: " + FilaCorrespondiente);
  46. NroDelCuadraditoaPintar = FilaCorrespondiente * CuadraditosPorFila + ColumnaBase;
  47. ParaColorDeCuadradito = new Color(Cuadro_pCuadradito + NroDelCuadraditoaPintar);
  48. ParaColorDeCuadradito.setRGB(ColorDeImagen);
  49. // Avanzar o retroceder según corresponda:
  50. ColumnaBase = ColumnaBase + Paso;
  51. // El bucle se detiene cuando pasamos el Punto 2 (usamos Paso para evaluar correctamente la dirección):
  52. } while ((Paso == 1 && ColumnaBase <= ColumnaDePunto2) || (Paso == -1 && ColumnaBase >= ColumnaDePunto2));
  53. } else {
  54. RelacionFilasColumnas = ColumnasDeDistancia/FilasDeDistancia;
  55. FilaBase = FilaDePunto1;
  56. if (FilasDeDistancia >= 0) {
  57. Paso = 1;
  58. } else {
  59. Paso = -1;
  60. }
  61. do {
  62. DistanciaRecorrida = FilaBase - FilaDePunto1;
  63. ColumnaCorrespondiente = Math.round(DistanciaRecorrida * RelacionFilasColumnas + ColumnaDePunto1);
  64. NroDelCuadraditoaPintar = FilaBase * CuadraditosPorFila + ColumnaCorrespondiente;
  65. ParaColorDeCuadradito = new Color(Cuadro_pCuadradito + NroDelCuadraditoaPintar);
  66. ParaColorDeCuadradito.setRGB(ColorDeImagen);
  67. // Avanzar o retroceder según corresponda:
  68. FilaBase = FilaBase + Paso;
  69. // El bucle se detiene cuando pasamos el Punto 2 (usamos Paso para evaluar correctamente la dirección):
  70. } while ((Paso == 1 && FilaBase <= FilaDePunto2) || (Paso == -1 && FilaBase >= FilaDePunto2));
  71. }
  72. }

Ejemplo de salida:

Las marcadas con circulo parecen mal, me cuesta ver, parece que tienen 2 puntos en una columna, 4 en otra y 2 en otra. Debería ser 3 en cada una.

Y pueden ocurrir casos como este:

Que es de 2, 4, 3 parece.

Acá se ve el motivo:


En la coiumna 0 dice que la fila debe ser 0.
En la columna 1, fila 0.25, se redondea, es 0.
Columna 2, fila 0.5, al redondear queda 1.
Y así sucesivamente.

Intentando corregir eso hice esto:
Código
  1. function GenerarLineas () {
  2. (...)
  3. if (Math.abs(ColumnasDeDistancia) >= Math.abs(FilasDeDistancia)) {
  4. PuntosPorFila = Math.floor(ColumnasDeDistancia/FilasDeDistancia);
  5. trace("PuntosPorFila: "+PuntosPorFila);
  6. // Puntos que no se pudieron repartir equitativamente...
  7. // entre las filas:
  8. Resto = ColumnasDeDistancia%FilasDeDistancia;
  9. trace("Resto: "+Resto);
  10. // Para repartirlos estéticamente:
  11. DistanciaDeExtras = ColumnasDeDistancia/(Resto+1);
  12. trace("DistanciaDeExtras: "+DistanciaDeExtras);
  13. ExtraaColocar = 1
  14. FilaDeExtra = DistanciaDeExtras

Pueden probar explicarme el algoritmo que mencionaron o corregir y continuar el que puse. Algo que veo es que no debo dividir entre las distancias sino que tengo filas y columnas a repartir, o sea, la distancia entre la fila de los puntos puede ser 2 por ejemplo, pero eso significa que son 3 filas, que la línea tendrá 3 filas.
Probé aplicar esto a mi código anterior pero me salen líneas cortadas, tendré que pensarlo mejor.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
sistema de puntos
Sugerencias y dudas sobre el Foro
chopy1989 4 3,929 Último mensaje 20 Octubre 2009, 04:00 am
por sirdarckcat
Puntos visuales
Diseño Gráfico
nichihack 9 7,859 Último mensaje 8 Mayo 2011, 08:43 am
por flacc
Dos Puntos de Acceso en una red
Materiales y equipos
XxTheCochixX 1 3,307 Último mensaje 8 Febrero 2013, 22:35 pm
por Sh4k4
Como hacer sistema de puntos por php y mysql? « 1 2 »
PHP
Brian1511 18 12,861 Último mensaje 23 Julio 2013, 21:23 pm
por 1mpuls0
PUNTOS DE RESTAURACION.
Windows
stifhen 7 6,498 Último mensaje 6 Julio 2014, 21:57 pm
por stifhen
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines