-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPointInTriangle.m
105 lines (91 loc) · 2.31 KB
/
PointInTriangle.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
function [ret] = PointInTriangle(p,tri, radius)
%% check whether point p lies in triangle tri of mesh
% Input:
% p: 1*3 vector.
% tri: 3*3 matrix. Each row is a point.
% Output:
% ret: 0-outside, 1-inside.
ret = 1;
%% v1v2
% k1 = ((tri(3,:)-tri(1,:))*(tri(2,:)-tri(1,:))')/((tri(2,:)-tri(1,:))*(tri(2,:)-tri(1,:))');
% k2 = ((p-tri(1,:))*(tri(2,:)-tri(1,:))')/((tri(2,:)-tri(1,:))*(tri(2,:)-tri(1,:))');
% if (tri(1,:)+k1*(tri(2,:)-tri(1,:)) - tri(3,:))*(tri(1,:)+k2*(tri(2,:)-tri(1,:)) - p)' < 0
% ret = 0;
% end
% e1 = tri(3,:)-tri(1,:);
% e1 = e1/norm(e1);
% e2 = (p-tri(1,:))*e1'*e1;
% if e1*e2'<0 && norm(e2)>radius
% ret = 0;
% end
n = tri(2,:)-tri(1,:);
n = n/norm(n);
e1 = tri(3,:)-tri(1,:);
e2 = p-tri(1,:);
p1 = e1*n';
p2 = e2*n';
p1 = tri(1,:)+p1*n;
p2 = tri(1,:)+p2*n;
e1 = tri(3,:)-p1;
e2 = p-p2;
if e1*e2'< 0 && norm(e2) > radius
ret = 0;
end
f1 = e1*e2';
%% v1v3
% k1 = ((tri(2,:)-tri(1,:))*(tri(3,:)-tri(1,:))')/((tri(3,:)-tri(1,:))*(tri(3,:)-tri(1,:))');
% k2 = ((p-tri(1,:))*(tri(3,:)-tri(1,:))')/((tri(3,:)-tri(1,:))*(tri(3,:)-tri(1,:))');
% if (tri(1,:)+k1*(tri(3,:)-tri(1,:)) - tri(2,:))*(tri(1,:)+k2*(tri(3,:)-tri(1,:)) - p)' < 0
% ret = 0;
% end
% e1 = tri(2,:)-tri(1,:);
% e1 = e1/norm(e1);
% e2 = (p-tri(1,:))*e1'*e1;
% if e1*e2'<0 && norm(e2)>radius
% ret = 0;
% end
n = tri(3,:)-tri(1,:);
n = n/norm(n);
e1 = tri(2,:)-tri(1,:);
e2 = p-tri(1,:);
p1 = e1*n';
p2 = e2*n';
p1 = tri(1,:)+p1*n;
p2 = tri(1,:)+p2*n;
e1 = tri(2,:)-p1;
e2 = p-p2;
if e1*e2'<0 && norm(e2)>radius
ret = 0;
end
f2 = e1*e2';
%% v2v3
% k1 = ((tri(1,:)-tri(2,:))*(tri(3,:)-tri(2,:))')/((tri(3,:)-tri(2,:))*(tri(3,:)-tri(2,:))');
% k2 = ((p-tri(2,:))*(tri(3,:)-tri(2,:))')/((tri(3,:)-tri(2,:))*(tri(3,:)-tri(2,:))');
% if (tri(2,:)+k1*(tri(3,:)-tri(2,:)) - tri(1,:))*(tri(2,:)+k2*(tri(3,:)-tri(2,:)) - p)' < 0
% ret = 0;
% end
% e1 = tri(1,:)-tri(2,:);
% e1 = e1/norm(e1);
% e2 = (p-tri(2,:))*e1'*e1;
% if e1*e2'<0 && norm(e2)>radius
% ret = 0;
n = tri(3,:)-tri(2,:);
n = n/norm(n);
e1 = tri(1,:)-tri(2,:);
e2 = p-tri(2,:);
p1 = e1*n';
p2 = e2*n';
p1 = tri(2,:)+p1*n;
p2 = tri(2,:)+p2*n;
e1 = tri(1,:)-p1;
e2 = p-p2;
if e1*e2'<0 && norm(e2)>radius
ret = 0;
end
f3 = e1*e2';
if f1<0 || f2<0 || f3<0
if norm(p-tri(1,:))>radius || norm(p-tri(2,:))>radius || norm(p-tri(3,:))>radius
ret = 0;
end
end
end