Algoritmo de apilamiento de mosaico (escalable)

Aquí está el problema. Tengo un lienzo rectangular que tiene un tamaño de 1. Por lo tanto, tiene un sistema de coordenadas de (0.0 ... 1.0 - x y 0.0 ... 1.0 - y).

También tengo algunos azulejos. Los azulejos también son rectángulos. Tienen diferentes tamaños y la cantidad de mosaicos es una variable.

Quieroapila azulejos en lienzo rectangular, de 0.0 a 1.0 de izquierda a derecha, de arriba a abajo):

1) las fichas tienen que caber en el lienzo (pero ocupan tanto espacio como podrían)

2) los mosaicos deben escalarse (si no encajan), cada mosaico debe escalarse en la misma cantidad (deben permanecer en las mismas proporciones).

3) imagina que tienes estas 'fichas' en tu mano y las colocas en este lienzo una tras otra

4) casi como "Algoritmo de TreeMap" but - la forma de los mosaicos debe ser la misma rectángulos) y no necesito llenar todo el espacio de lona

¿Hay alguien que pueda mostrarme un algoritmo en cualquier lenguaje C (C, C ++, Java, C #)?

* Probé esto.

1) calculé el área de mosaico, luego calculo una suma de las áreas de mosaico (por ejemplo: tengo dos mosaicos, uno tiene un área de 2, otro área de 1, es decir, tengo una suma total de 3)

2) luego calculo qué "proporción" tiene cada ficha en "suma total de áreas" (por ejemplo: 2/3 y 1/3)

3) luego calcule el tamaño del mosaico rectangular por Math.sqrt (x) (por ejemplo: Math.sqrt (2/3))

4) luego dibuje el mosaico uno por uno ...

Pero esto no siempre funciona. A veces me salen baldosas de la lona ... *

Respuestas a la pregunta(5)

Su respuesta a la pregunta