Autor Tema: ¿Cómo calculo en qué fila va el extra?

0 Usuarios y 1 Visitante están viendo este tema.

09 Agosto, 2026, 05:55 am
Leído 183 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,256
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Sigo intentando que se generen líneas "perfectas", en este caso quiero que siempre tengan 2 filas y estoy aumentando su cantidad de columnas, pero debido a errores no funciona como debe:


Explicaré el código:
Código: [Seleccionar]
// Determinar ubicación del punto 1:
FilaDePunto1 = 0;
ColumnaDePunto1 = 0;
// Punto 2:
FilaDePunto2 = 1;
ColumnaDePunto2 = NroDelCuadroaColocar+1;
Todas las líneas empiezan en el punto 0,0 de los cuadros (u hojas), tienen 2 filas (terminan en la fila 1, contando la 0 son 2) y en cada cuadro se intenta que tengan una columna más. La cantidad de columnas de las líneas en los cuadros sería así:
2 3 4
5 6 7
8 9 10

Código: [Seleccionar]
// Para cálculos:
FilasDeDistancia = FilaDePunto2-FilaDePunto1;
FilasDeLinea = FilasDeDistancia+1;
ColumnasDeDistancia = ColumnaDePunto2-ColumnaDePunto1;
ColumnasDeLinea = ColumnasDeDistancia+1;
// Averiguar la distancia mayor y graficar en función de ella:
// Si hay más columnas que filas o son igual cantidad:
if (Math.abs(ColumnasDeDistancia) >= Math.abs(FilasDeDistancia)) {
PuntosPorFila = Math.floor(ColumnasDeLinea/FilasDeLinea);
// Puntos que no se pudieron repartir equitativamente...
// entre las filas:
Resto = ColumnasDeLinea%FilasDeLinea;
// Para repartirlos estéticamente:
DistanciaDeExtras = (ColumnasDeDistancia+1)/(Resto+1)-1;
ExtraaAgregar = 1;
if (Resto != 0) {
SiguienteFilaConExtra = DistanciaDeExtras;
} else {
// Para evitar que se ponga un punto extra...
// en la fila 0:
SiguienteFilaConExtra = FilaDePunto2+1;
}
ColumnasCompletas = 0;
FilaActual = FilaDePunto1;
// Mientras haya columnas que agregar:
while (ColumnasCompletas < ColumnasDeLinea) {
trace("Aún no se insertaron todas las columnas, van "+ColumnasCompletas);
PuntosEnFila = 0;
// Mientras se deba agregar puntos en la fila:
while (PuntosEnFila < PuntosPorFila) {
trace("Aún no se insertaron los puntos de esta fila, van "+PuntosEnFila);
NroDelCuadraditoaPintar = FilaActual * CuadraditosPorFila + ColumnaDePunto1 + ColumnasCompletas;
ColumnasCompletas++;
PuntosEnFila++;
// Pintar el punto.
}
// Si en esta fila debe agregarse un extra:
if (FilaActual == SiguienteFilaConExtra) {
trace("Agregando extra");
NroDelCuadraditoaPintar = FilaActual * CuadraditosPorFila + ColumnaDePunto1 + ColumnasCompletas;
ColumnasCompletas++;
ParaColorDeCuadradito = new Color(Cuadro_pCuadradito + NroDelCuadraditoaPintar);
ParaColorDeCuadradito.setRGB(ColorDeImagen);
ExtraaAgregar++;
SiguienteFilaConExtra = DistanciaDeExtras*ExtraaAgregar;
}
FilaActual++;
}
// OJO QUE QUIZÁ SE AGREGA UN PUNTO AL FINAL INCLUSO CON RESTO 0 PORQUE ES DISTANCIA/(RESTO+1)
// FALTA FLOOR, CEIL Y TODO ESO
} else {
}
En los casos que intento hacer funcionar la cantidad de columnas es igual o mayor a la cantidad de filas así que no hay problema con el 1er if y con el else final vacío.

Con:
PuntosPorFila = Math.floor(ColumnasDeLinea/FilasDeLinea);
se está calculando cuántos puntos tendrá cada fila, sin contar el resto de la división en caso de que ColumnasDeLinea sea impar.

Se calcula el resto y lo siguiente es lo que falla:
Resto = ColumnasDeLinea%FilasDeLinea;
// Para repartirlos estéticamente:
DistanciaDeExtras = ColumnasDeLinea/(Resto+1)-1;

Más adelante sea hace:
Código: [Seleccionar]
if (Resto != 0) {
SiguienteFilaConExtra = DistanciaDeExtras;
O sea que cuando hay resto, el punto extra se agrega en donde indique DistanciaDeExtras.

Entonces...
Cuando hay 3 columnas, el resultado debería ser así
Código: [Seleccionar]
**
  *
o
Código: [Seleccionar]
*
 **
O sea el extra debería estar en la fila 0 o 1.
Yo hago
DistanciaDeExtras = ColumnasDeLinea/(Resto+1)-1;
O sea en este caso 3/2-1, da 0.5, tendría que quitar los decimales para que sea 0.

Cuando hay 5 columnas, debe haber 2 filas con 2 puntos cada una, pero una de las filas debe tener 1 extra. Es lo mismo, el extra debe ir en la 0 o 1.
5/2-1 = 1.5
Quitando los decimales sería 1.

Cuando hay 7 columnas, sería 7/2-1 = 2.5, ya no se arregla quitando los decimales.

En definitiva tengo algo como C/2 y necesito que siempre de 0 o 1, supongo que no es la fórmula correcta...
Claro, estoy calculando algo parecido a dónde está el centro de la línea, pero no necesito eso, o está mal esto
Código: [Seleccionar]
if (Resto != 0) {
SiguienteFilaConExtra = DistanciaDeExtras;
la fila con el extra no es igual a la columna central.

Aunque sepa que en estos casos siempre va a ser 0 o 1, necesito que la fórmula sirva para más casos.

¿Quizá DistanciaDeExtras debería ser en columnas?

Si tienen alguna duda sobre el problema pregunten.

11 Agosto, 2026, 03:36 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 3,897
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
necesito que la fórmula sirva para más casos.


Hola, creo que algo te lo explique en otro hilo.
veo que haz dividido la pantalla para mostrar mas ejemplos por pantalla, pero que en realidad no buscas que se represente cortado como parecería de los ejemplos mas largos.


veamos  definamos algo que despues tu lo usas como quieras , yo te presento la idea y tu la adaptas a tu programa.


una recta va a tener  L pixeles  en horizontal y H en vertical


tienes que buscar en tu lenguaje de programacion la funcion "redondear"  por lo general es round(x)


Código: [Seleccionar]
para x = 1 hasta L
    y = 1 + redondear( (x-1)*(H-1)/(L-1) )
    dibujar_pixel(x,y)
fin


 en la función redondear , si algo esta mas cerca del numero entero  superior toma el numero superior y si esta mas cerca del inferior toma el entero inferior


ejemplos
round(1.0)=1
round(1.2)=1
round(1.49)=1
round(1.5)=2
round(1.8)=2
Saludos  \(\mathbb {R}^3\)