Re: How to get the intersection point coordinate between polygon and segment
- From: "Matt" <mjacobson.removethis@xxxxxxxxxxxxx>
- Date: Sat, 13 Dec 2008 16:24:02 +0000 (UTC)
"zedong
" <zdongwu@xxxxxxxxx> wrote in message <gi0epq$lk3$1@xxxxxxxxxxxxxxxxxx>...
How to get the intersection point coordinate between polygon and segment;
for example(a is a triangle a(i,:) is the ith coordinate of the triangle.b is an segment,b(i,:) is the side point coordinate):
I believe the function below does the job. It employs vert2con from the FEX
I also tested its speed on 10000 successive triangles using both a for loop and cellfun()
a=[0 0;1 0;0 1]; b=[0.4 0.4;1 1];
A=cell(1,10000);B=A; A(:)={a}; B(:)={b};
Elapsed time is 11.256645 seconds.tic, C=cellfun(@cutpoints,A,B,'UniformOutput',false); toc
Elapsed time is 11.231848 seconds.tic, for ii=1:10000, c=cutpoints(a,b); end,toc
Not much difference, so I guess you'll have to be the judge of whether it's fast enough.
function c=cutpoints(a,b)
%find intersection points of line segment with polytope
%
% c=cutpoints(a,b)
%
%Rows of a define polytope vertices
%Rows of b are line segment end points
%Rows of c are intersection points
c=nan(2);
xx=b(1,:).';
yy=b(2,:).';
dd=yy-xx;
[AA,bb]=vert2con(a);
CC=AA*dd; qq=bb-AA*xx;
db=(CC==0);
if any(qq(db)<0) %ray does not intersect polytope
return
end
%%%Max lower bound
lb=zeros(size(CC));
ii=CC<0; lb(ii)=qq(ii)./CC(ii);
tmin=max(max(lb),0);
%%%Min upper bound
ub=ones(size(CC));
ii=CC>0; ub(ii)=qq(ii)./CC(ii);
tmax=min(min(ub),1);
c(1,:)=(xx+tmin*dd).';
c(2,:)=(xx+tmax*dd).';
.
- Follow-Ups:
- Prev by Date: Re: bwlabel for arbitrary neighbourhoods
- Next by Date: Re: bwlabel for arbitrary neighbourhoods
- Previous by thread: Re: How to get the intersection point coordinate between polygon and segment
- Next by thread: Re: How to get the intersection point coordinate between polygon and segment
- Index(es):
Relevant Pages
|