Logré que funcione con 3 y 4 filas, con 5 me falla:

Agrega unos extras que no debe al final, intento averiguar por qué pero he podido.
function GenerarLineas () {
// Pintar cuadraditos de modo que se forme una línea:
// Elegir un color distinto al color del cuadro:
do {
ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
} while (ColorDelCuadro == ColorDeImagen);
// Determinar ubicación del punto 1,
// llamado Punto en vez de Cuadradito porque...
// ese nombre puede que se esté usando en otra cosa:
FilaDePunto1 = 0;
ColumnaDePunto1 = 0;
// trace("FilaDePunto1: "+FilaDePunto1);
// trace("ColumnaDePunto1: "+ColumnaDePunto1);
// Punto 2 asegurando que no sea igual:
do {
ColumnaDePunto2 = NroDelCuadroaColocar+4;
FilaDePunto2 = 4;
} while (ColumnaDePunto1 == ColumnaDePunto2 && FilaDePunto1 == FilaDePunto2);
// trace("FilaDePunto2: "+FilaDePunto2);
// trace("ColumnaDePunto2: "+ColumnaDePunto2);
// Para cálculos:
FilasDeDistancia = FilaDePunto2-FilaDePunto1;
FilasDeLinea = FilasDeDistancia+1;
ColumnasDeDistancia = ColumnaDePunto2-ColumnaDePunto1;
ColumnasDeLinea = ColumnasDeDistancia+1;
// trace("FilasDeDistancia: "+FilasDeDistancia);
// trace("ColumnasDeDistancia: "+ColumnasDeDistancia);
// 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)) {
PuntosRequeridosPorFila = Math.floor(ColumnasDeLinea/FilasDeLinea);
trace("PuntosRequeridosPorFila: "+PuntosRequeridosPorFila);
// Puntos que no se pudieron repartir equitativamente...
// entre las filas:
PuntosExtraRequeridos = ColumnasDeLinea%FilasDeLinea;
trace("PuntosExtraRequeridos: "+PuntosExtraRequeridos);
// Para repartirlos estéticamente:
FilaCentralDeLinea = FilasDeDistancia/2;
trace("FilaCentralDeLinea: "+FilaCentralDeLinea);
ExtraaAgregar = 1;
// Si sólo se requiere 1 extra, irá en el medio:
if (PuntosExtraRequeridos == 1) {
// En caso de no haber medio se pone en la izquierda o...
// derecha, de él, decidido por azar:
if (random(2) == 0) {
SiguienteFilaConExtra = Math.floor(FilaCentralDeLinea);
} else {
SiguienteFilaConExtra = Math.ceil(FilaCentralDeLinea);
}
// Para evitar que se ponga otro extra:
DistanciaDeExtras = FilaDePunto2+1;
trace("PuntosExtraRequeridos es 1");
trace("DistanciaDeExtras (enorme): "+DistanciaDeExtras);
trace("SiguienteFilaConExtra (centro): "+SiguienteFilaConExtra);
} else if (PuntosExtraRequeridos > 1) {
DistanciaDeExtras = FilasDeDistancia/(PuntosExtraRequeridos+1);
SiguienteFilaConExtra = Math.floor(DistanciaDeExtras);
trace("PuntosExtraRequeridos es > 1");
trace("DistanciaDeExtras (normal): "+DistanciaDeExtras);
trace("SiguienteFilaConExtra (normal): "+SiguienteFilaConExtra);
if (DistanciaDeExtras == 1 && FilasDeDistancia > 2) {
// Para evitar que en este caso los extras se acumulen en el medio:
SiguienteFilaConExtra = Math.max(0, SiguienteFilaConExtra-1);
trace("Caso especial, SiguienteFilaConExtra se redujo: "+SiguienteFilaConExtra);
}
} else {
// Para evitar que se ponga un punto extra...
// en la fila 0:
// DistanciaDeExtras es irrelevante aquí?
DistanciaDeExtras = FilaDePunto2+1;
SiguienteFilaConExtra = FilaDePunto2+1;
// trace("PuntosExtraRequeridos es 0");
// trace("DistanciaDeExtras (enorme): "+DistanciaDeExtras);
// trace("SiguienteFilaConExtra (afuera): "+SiguienteFilaConExtra);
}
ColumnasCompletadas = 0;
FilaCompletandose = FilaDePunto1;
// Mientras haya columnas que agregar:
while (ColumnasCompletadas < ColumnasDeLinea) {
trace("Aún no se insertaron todas las columnas, van "+ColumnasCompletadas);
PuntosEnFila = 0;
// Mientras se deba agregar puntos en la fila:
while (PuntosEnFila < PuntosRequeridosPorFila) {
trace("Aún no se insertaron los puntos de esta fila, van "+PuntosEnFila);
NroDelCuadraditoaPintar = FilaCompletandose * CuadraditosPorFila + ColumnaDePunto1 + ColumnasCompletadas;
ParaColorDeCuadradito = new Color(Cuadro_pCuadradito + NroDelCuadraditoaPintar);
ParaColorDeCuadradito.setRGB(ColorDeImagen);
ColumnasCompletadas++;
trace("Se pintó un punto. ColumnasCompletadas: "+ColumnasCompletadas);
PuntosEnFila++;
trace("PuntosEnFila: "+PuntosEnFila);
}
// Si en esta fila debe agregarse un extra:
if (FilaCompletandose == SiguienteFilaConExtra) {
trace("Agregando extra");
NroDelCuadraditoaPintar = FilaCompletandose * CuadraditosPorFila + ColumnaDePunto1 + ColumnasCompletadas;
ColumnasCompletadas++;
trace("ColumnasCompletadas: "+ColumnasCompletadas);
ParaColorDeCuadradito = new Color(Cuadro_pCuadradito + NroDelCuadraditoaPintar);
ParaColorDeCuadradito.setRGB(ColorDeImagen);
ExtraaAgregar++;
SiguienteFilaConExtra = DistanciaDeExtras*ExtraaAgregar;
trace("SiguienteFilaConExtra: "+SiguienteFilaConExtra);
// Si el extra iría en una posición con decimales,
// se pone en la entera anterior, siguiente o...
// una de ellas al azar según el caso:
if (SiguienteFilaConExtra < FilaCentralDeLinea) {
SiguienteFilaConExtra = Math.floor(SiguienteFilaConExtra);
if (DistanciaDeExtras == 1 && FilasDeDistancia > 2) {
// Para evitar que en este caso los extras se acumulen en el medio:
SiguienteFilaConExtra = Math.max(0, SiguienteFilaConExtra-1);
}
trace("SiguienteFilaConExtra es anterior a la fila central, se le hace floor: "+SiguienteFilaConExtra);
} else if (SiguienteFilaConExtra > FilaCentralDeLinea) {
SiguienteFilaConExtra = Math.ceil(SiguienteFilaConExtra);
if (DistanciaDeExtras == 1 && FilasDeDistancia > 2) {
// Para evitar que en este caso los extras se acumulen en el medio:
// SiguienteFilaConExtra = Math.min(FilaDePunto2, SiguienteFilaConExtra+1);
SiguienteFilaConExtra++;
}
trace("SiguienteFilaConExtra es posterior a la fila central, se le hace ceil: "+SiguienteFilaConExtra);
} else if (random(2) == 0) {
SiguienteFilaConExtra = Math.floor(SiguienteFilaConExtra);
trace("SiguienteFilaConExtra es en la fila central, se eligió hacerle floor: "+SiguienteFilaConExtra);
} else {
SiguienteFilaConExtra = Math.ceil(SiguienteFilaConExtra);
trace("SiguienteFilaConExtra es en la fila central, se eligió hacerle ceil: "+SiguienteFilaConExtra);
}
}
FilaCompletandose++;
trace("FilaCompletandose: "+FilaCompletandose);
}
// OJO QUE QUIZÁ SE AGREGA UN PUNTO AL FINAL INCLUSO CON PuntosExtraRequeridos 0 PORQUE ES DISTANCIA/(PuntosExtraRequeridos+1)
} else {
}
}Esto es sobre el cuadro de arriba derecha:
NroDelCuadroaColocar: 2
PuntosRequeridosPorFila: 1
PuntosExtraRequeridos: 2
FilaCentralDeLinea: 2
PuntosExtraRequeridos es > 1
DistanciaDeExtras (normal): 1.33333333333333
SiguienteFilaConExtra (normal): 1
Aún no se insertaron todas las columnas, van 0
Aún no se insertaron los puntos de esta fila, van 0
Se pintó un punto. ColumnasCompletadas: 1
PuntosEnFila: 1
FilaCompletandose: 1
Aún no se insertaron todas las columnas, van 1
Aún no se insertaron los puntos de esta fila, van 0
Se pintó un punto. ColumnasCompletadas: 2
PuntosEnFila: 1
Agregando extra
ColumnasCompletadas: 3
SiguienteFilaConExtra: 2.66666666666667
SiguienteFilaConExtra es posterior a la fila central, se le hace ceil: 3FilaCompletandose: 2
Aún no se insertaron todas las columnas, van 3
Aún no se insertaron los puntos de esta fila, van 0
Se pintó un punto. ColumnasCompletadas: 4
PuntosEnFila: 1
FilaCompletandose: 3
Aún no se insertaron todas las columnas, van 4
Aún no se insertaron los puntos de esta fila, van 0
Se pintó un punto. ColumnasCompletadas: 5
PuntosEnFila: 1
Agregando extra
ColumnasCompletadas: 6
SiguienteFilaConExtra: 4
SiguienteFilaConExtra es posterior a la fila central, se le hace ceil: 4FilaCompletandose: 4
Aún no se insertaron todas las columnas, van 6
Aún no se insertaron los puntos de esta fila, van 0
Se pintó un punto. ColumnasCompletadas: 7
PuntosEnFila: 1
Agregando extra
ColumnasCompletadas: 8
SiguienteFilaConExtra: 5.33333333333333
SiguienteFilaConExtra es posterior a la fila central, se le hace ceil: 6FilaCompletandose: 5
Luego de resolver esa duda creo que voy a abandonar esto hasta fecha desconocida o para siempre, en vez de intentar hacer líneas "perfectas" intentaré que sean caminos al azar, como para ser contornos de un dibujo. Pensé que hacer líneas más normales sería más fácil, pero teniendo que cumplir tantos requisitos se ve que no.
EDIT: Parece que ya lo logré:

Simplemente tenía que poner un if para que si ya había agregado todos los extras, no agregue otro. Pero creo que no debería ser necesario, mi código está mal hecho, aunque funcione xP
En la imagen puede verse gran variedad de tamaños de líneas. Los cuadros que no tienen es porque en ellos la cantidad de filas es mayor que la de columnas y aún no hice eso, sería el mismo código pero con algunas cosas al revés.
También me faltaría generar líneas de este estilo / pero noooo, paso, paso.