📄 bresenham_line3d.m
字号:
From: <由 Windows Internet Explorer 7 保存>
Subject:
Date: Thu, 14 Aug 2008 22:33:28 +0800
MIME-Version: 1.0
Content-Type: text/html;
charset="gb2312"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.mathworks.com/matlabcentral/files/21057/bresenham_line3d.m
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dgb2312">
<META content=3D"MSHTML 6.00.6000.16674" name=3DGENERATOR></HEAD>
<BODY><PRE>% Perform 3D Bresenham's algorithm to draw a line between =
Point1
% and Point2.
%
% Usage: [X Y Z] =3D bresenham_line3d(P1, P2);
%
% P1 - vector for Point1, where P1 =3D [x1 y1 z1]
% (x1 y1 z1 can only be integer)
%
% P2 - vector for Point2, where P2 =3D [x2 y2 z2]
% (x2 y2 z2 can only be integer)
%
% X - a set of x coordinates on Bresenham's line
% Y - a set of y coordinates on Bresenham's line
% Z - a set of z coordinates on Bresenham's line
%
% All points in XYZ set (i.e. P(i) =3D [X(i) Y(i) Z(i)]) will =
constitute
% the Bresenham's line.
%
% Example:
% P1 =3D [12 37 6];
% P2 =3D [46 3 35];
% [X Y Z] =3D bresenham_line3d(P1, P2);
% figure; plot3(X,Y,Z,'s','markerface','b');
%
% This program is ported to MATLAB from:
% B.Pendleton. line3d - 3D Bresenham's (a 3D line drawing algorithm)
% ftp://ftp.isc.org/pub/usenet/comp.sources.unix/volume26/line3d, 1992
%
% Which is referenced by:
% Fischer, J., A. del Rio (2004). A Fast Method for Applying Rigid
% Transformations to Volume Data, WSCG2004 Conference.
% http://wscg.zcu.cz/wscg2004/Papers_2004_Short/M19.pdf
%
% - Jimmy Shen (jimmy@rotman-baycrest.on.ca)
%
function [X,Y,Z] =3D bresenham_line3d(P1, P2)
x1 =3D P1(1);
y1 =3D P1(2);
z1 =3D P1(3);
x2 =3D P2(1);
y2 =3D P2(2);
z2 =3D P2(3);
dx =3D x2 - x1;
dy =3D y2 - y1;
dz =3D z2 - z1;
ax =3D abs(dx)*2;
ay =3D abs(dy)*2;
az =3D abs(dz)*2;
sx =3D sign(dx);
sy =3D sign(dy);
sz =3D sign(dz);
x =3D x1;
y =3D y1;
z =3D z1;
idx =3D 1;
if(ax>=3Dmax(ay,az)) % x dominant
yd =3D ay - ax/2;
zd =3D az - ax/2;
while(1)
X(idx) =3D x;
Y(idx) =3D y;
Z(idx) =3D z;
idx =3D idx + 1;
if(x =3D=3D x2) % end
break;
end
if(yd >=3D 0) % move along y
y =3D y + sy;
yd =3D yd - ax;
end
if(zd >=3D 0) % move along z
z =3D z + sz;
zd =3D zd - ax;
end
x =3D x + sx; % move along x
yd =3D yd + ay;
zd =3D zd + az;
end
elseif(ay>=3Dmax(ax,az)) % y dominant
xd =3D ax - ay/2;
zd =3D az - ay/2;
while(1)
X(idx) =3D x;
Y(idx) =3D y;
Z(idx) =3D z;
idx =3D idx + 1;
if(y =3D=3D y2) % end
break;
end
if(xd >=3D 0) % move along x
x =3D x + sx;
xd =3D xd - ay;
end
if(zd >=3D 0) % move along z
z =3D z + sz;
zd =3D zd - ay;
end
y =3D y + sy; % move along y
xd =3D xd + ax;
zd =3D zd + az;
end
elseif(az>=3Dmax(ax,ay)) % z dominant
xd =3D ax - az/2;
yd =3D ay - az/2;
while(1)
X(idx) =3D x;
Y(idx) =3D y;
Z(idx) =3D z;
idx =3D idx + 1;
if(z =3D=3D z2) % end
break;
end
if(xd >=3D 0) % move along x
x =3D x + sx;
xd =3D xd - az;
end
if(yd >=3D 0) % move along y
y =3D y + sy;
yd =3D yd - az;
end
z =3D z + sz; % move along z
xd =3D xd + ax;
yd =3D yd + ay;
end
end
return; % bresenham_line3d
</PRE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -