Si le molestan casos excepcionales de otros métodos, aquí hay un método a prueba de balas que da como resultado una línea:
- cuyos pixeles siempre se tocan durante toda la longitud de la línea (píxeles son 8-vecinos entre sí),
- densidad de la línea es no depende de la parámetro adicional, pero se determina de manera flexible para dar cabida a garantía desde el primer punto
Entradas (conveniente para hacer la función de este código):
img
- matriz que contiene la imagen,
x1
, y1
, x2
, y2
- coordenadas de los puntos extremos de la línea que se dibujará.
Código:
% distances according to both axes
xn = abs(x2-x1);
yn = abs(y2-y1);
% interpolate against axis with greater distance between points;
% this guarantees statement in the under the first point!
if (xn > yn)
xc = x1 : sign(x2-x1) : x2;
yc = round(interp1([x1 x2], [y1 y2], xc, 'linear'));
else
yc = y1 : sign(y2-y1) : y2;
xc = round(interp1([y1 y2], [x1 x2], yc, 'linear'));
end
% 2-D indexes of line are saved in (xc, yc), and
% 1-D indexes are calculated here:
ind = sub2ind(size(img), yc, xc);
% draw line on the image (change value of '255' to one that you need)
img(ind) = 255;
Aquí está la imagen de ejemplo con tres líneas dibujadas en él:
Esto funciona perfectamente para una línea diagonal, pero puede agregar píxeles no deseados para una línea más plana. Si no te importan los píxeles adicionales, te sugiero que elijas la solución de gnovices porque es rápida y sencilla. – Jonas
@Jonas: He actualizado el algoritmo para calcular mejor la línea, lo que elimina algunos píxeles innecesarios. – gnovice
¡Gracias por mejorar mi respuesta! – Jonas