Si tengo una forma arbitraria, me gustaría llenar sólo con $45-45-90$ los triángulos.
El objetivo es conseguir un Tangram de look, así que es relativa a esta cuestión.
Comenzando con $45-45-90$ triángulos sería un comienzo increíble. Después de la forma si se llena me imagino que podría elegir triángulos adyacentes, ya sea $2$ o $4$ y dibujar cuadrados y paralelogramos en su lugar, pero sólo llegar el esquema estimado con pic $45-45-90$ triángulos sería genial.
¿Cómo puedo empezar ?
EDITAR @J. M. comentario de hace perfecto sentido, lo que significa que primero debe asegurarse de que mi forma es apropiada para ello. He aquí un dibujo que hice para ilustrar esto:
El negro de la forma es la "forma arbitraria", el azul camino es el camino que debe ser llenado.
Hasta ahora, veo que el primer paso es "estimar" arbitraria trazados con líneas a la derecha o en ángulos de 45 grados. El segundo paso sería la pregunta inicial, embalaje 45-45-90 triángulos en la forma.
Sugerencias para la estimación de azar ángulos de las líneas con 45/90 grados de ángulo de las líneas o 45-45-90 triángulo de embalaje ?
UPDATE2
He ido por delante con un enfoque ingenuo para calcular una ruta arbitraria(esquema) usando sólo el recto o en diagonal(45 grados) líneas.
function estimate45(points:Vector.<Point>):Vector.<Point> {
var result:Vector.<Point> = new Vector.<Point>();
var pNum:int = points.length,angle:Number,pi:Number = 3.141592653589793,qpi:Number = pi*.25,d:Number = 0;
for(var i:int = 0 ; i < pNum ; i++){
if(i == 0) angle = Math.atan2(points[i].y,points[i].x);
else {
angle = Math.atan2(points[i].y-points[i-1].y,points[i].x-points[i-1].x);
d = Math.sqrt((points[i].x-points[i-1].x)*(points[i].x-points[i-1].x)+(points[i].y-points[i-1].y)*(points[i].y-points[i-1].y))
}
//constraint to 45 (1. scale to values between 0,1 (/qpi) 2. round, 3. do whatever(convert to degrees/radians as needed)
angle = (Math.round(angle/qpi)) * 45 / 57.2957795;
if(i == 0) result.push(new Point(Math.cos(angle)*d,Math.s(angle)*d));
else result.push(new Point(result[i-1].x+Math.cos(angle)*d,result[i-1].y+Math.s(angle)*d));
}
return result;
}
Yo bucle a través de la ruta de acceso (una lista ordenada de puntos) y tengo que calcular el ángulo y el radio de cada línea(cartesianas a polares creo). Entonces me ronda " el ángulo de 45 grados, y dibujar una línea a 45 grados limitada versión de la original de ángulo, y mantener la misma longitud de la línea.
Esto no es de muy buena forma de hacerlo, especialmente para líneas consecutivas con similar ángulos.
He aquí algunas pruebas:
El rojo atenuado es el original, el verde es el de la estimación.
@Américo Tavares sugerencia es grande, aunque. Yo podría usar este método para gráficos de mapa de bits, no solo de gráficos vectoriales.
Si me gustaría ir con este enfoque, me imagino que me gustaría hacer algo como:
obtener un mosaico(crear una red de cajas para cubrir el tamaño de la forma).
boxes_xnum = floor(w/box_size)
boxes_ynum = floor(h/box_size)
for(y to boxes_ynum):
for(x to boxes_xnum):
grid.addBitmap(copyPixels(source,x*box_size,y*box_size,box_size,box_size));//copypixels(source,x,y,width,height)
for box in grid:
if(box.nonAlphaPixels/box.totalPixels > .75): fullBox
else:
checkDiagonalType()//is it like this / or like this \
checkFillSide()//which of the two sides should be filled
//which means I should check for something constrained to 45 degrees angles \| or _\ or |/ or /_
//in the case of halfs go for random diagonal ?
Si pienso sobre esto mejor,
cuando me bucle a pesar de los píxeles de una caja, mantener un número de píxeles por cuadro 'cuadrante" (parte superior izquierda).
Si no los píxeles transparentes en un cuadrante en más de .5 o .75 es marcado como usado.
Se basa en cuántos y cuáles de los 4 cuadrantes se utilizan en una caja, una diagonal con la dirección se utiliza.
¿Tienen sentido, o me estoy complicando más de esto ?