INTERSECTLINEPOLYGON3D Intersection point of a 3D line and a 3D polygon. INTER = intersectLinePolygon3d(LINE, POLY) Compute coordinates of intersection point between the 3D line LINE and the 3D polygon POLY. LINE is a 1-by-6 row vector containing origin and direction vector of the line, POLY is a Np-by-3 array containing coordinates of 3D polygon vertices. INTER is a 1-by-3 row vector containing coordinates of intersection point, or [NaN NaN NaN] if line and polygon do not intersect. INTERS = intersectLinePolygon3d(LINES, POLY) If LINES is a N-by-6 array representing several lines, the result INTERS is a N-by-3 array containing coordinates of intersection of each line with the polygon. [INTER INSIDE] = intersectLinePolygon3d(LINE, POLY) Also return a N-by-1 boolean array containing TRUE if the corresponding polygon contains the intersection point. Example % Compute intersection between a 3D line and a 3D triangle pts3d = [3 0 0; 0 6 0;0 0 9]; line1 = [0 0 0 3 6 9]; inter = intersectLinePolygon3d(line1, pts3d) inter = 1 2 3 % keep only valid intersections with several lines pts3d = [3 0 0; 0 6 0;0 0 9]; lines = [0 0 0 1 2 3;10 0 0 1 2 3]; [inter inside] = intersectLinePolygon3d(line1, pts3d); inter(inside, :) ans = 1 2 3 See Also intersectLinePolygon, intersectRayPolygon3d, intersectLinePlane
0001 function [inter, inside]= intersectLinePolygon3d(line, poly) 0002 %INTERSECTLINEPOLYGON3D Intersection point of a 3D line and a 3D polygon. 0003 % 0004 % INTER = intersectLinePolygon3d(LINE, POLY) 0005 % Compute coordinates of intersection point between the 3D line LINE and 0006 % the 3D polygon POLY. LINE is a 1-by-6 row vector containing origin and 0007 % direction vector of the line, POLY is a Np-by-3 array containing 0008 % coordinates of 3D polygon vertices. 0009 % INTER is a 1-by-3 row vector containing coordinates of intersection 0010 % point, or [NaN NaN NaN] if line and polygon do not intersect. 0011 % 0012 % INTERS = intersectLinePolygon3d(LINES, POLY) 0013 % If LINES is a N-by-6 array representing several lines, the result 0014 % INTERS is a N-by-3 array containing coordinates of intersection of each 0015 % line with the polygon. 0016 % 0017 % [INTER INSIDE] = intersectLinePolygon3d(LINE, POLY) 0018 % Also return a N-by-1 boolean array containing TRUE if the corresponding 0019 % polygon contains the intersection point. 0020 % 0021 % Example 0022 % % Compute intersection between a 3D line and a 3D triangle 0023 % pts3d = [3 0 0; 0 6 0;0 0 9]; 0024 % line1 = [0 0 0 3 6 9]; 0025 % inter = intersectLinePolygon3d(line1, pts3d) 0026 % inter = 0027 % 1 2 3 0028 % 0029 % % keep only valid intersections with several lines 0030 % pts3d = [3 0 0; 0 6 0;0 0 9]; 0031 % lines = [0 0 0 1 2 3;10 0 0 1 2 3]; 0032 % [inter inside] = intersectLinePolygon3d(line1, pts3d); 0033 % inter(inside, :) 0034 % ans = 0035 % 1 2 3 0036 % 0037 % See Also 0038 % intersectLinePolygon, intersectRayPolygon3d, intersectLinePlane 0039 % 0040 0041 % ------ 0042 % Author: David Legland 0043 % e-mail: david.legland@grignon.inra.fr 0044 % Created: 2011-05-22, using Matlab 7.9.0.529 (R2009b) 0045 % Copyright 2011 INRA - Cepia Software Platform. 0046 0047 % supporting plane of polygon vertices 0048 plane = createPlane(poly(1:3, :)); 0049 0050 % intersection of 3D line with the plane 0051 inter = intersectLinePlane(line, plane); 0052 0053 % project all points on reference plane 0054 pts2d = planePosition(poly, plane); 0055 pInt2d = planePosition(inter, plane); 0056 0057 % need to check polygon orientation 0058 inside = xor(isPointInPolygon(pInt2d, pts2d), polygonArea(pts2d) < 0); 0059 0060 % intersection points outside the polygon are set to NaN 0061 inter(~inside, :) = NaN;