triang.cpp 5.23 KB
Newer Older
Kirill Terekhov's avatar
Kirill Terekhov committed
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <math.h>
#include "triang.h"


double trieps = 1.0e-8;

void set_eps(double new_eps)
{
	trieps = new_eps;
}


int compare(XYZ a , XYZ b)
{
	if( fabs(a.x - b.x) < trieps && fabs(a.y-b.y) < trieps && fabs(a.z-b.z) < trieps )
		return 1;
	return 0;
}




double DistTriPoint (TRIANGLE tr, XYZ p)
{
	double A, B, C, D, t, h, k, l;
	XYZ P, Q1, Q2, Q3;
	A = (tr.p[1].y - tr.p[0].y) * (tr.p[2].z - tr.p[0].z) - (tr.p[1].z - tr.p[0].z) * (tr.p[2].y - tr.p[0].y);
	B = (tr.p[1].z - tr.p[0].z) * (tr.p[2].x - tr.p[0].x) - (tr.p[1].x - tr.p[0].x) * (tr.p[2].z - tr.p[0].z);
	C = (tr.p[1].x - tr.p[0].x) * (tr.p[2].y - tr.p[0].y) - (tr.p[1].y - tr.p[0].y) * (tr.p[2].x - tr.p[0].x);
	D = - (A * tr.p[0].x + B * tr.p[0].y + C * tr.p[0].z);
	
	t = ((tr.p[0].x - p.x) * A + (tr.p[0].y - p.y) * B + (tr.p[0].z - p.z) * C) / (A * A + B * B + C * C);
	
	P.x = p.x + t * A;
	P.y = p.y + t * B;
	P.z = p.z + t * C;
	
	Q1.x = (P.y - tr.p[0].y) * (P.z - tr.p[1].z) - (P.y - tr.p[1].y) * (P.z - tr.p[0].z);
	Q1.y = (P.z - tr.p[0].z) * (P.x - tr.p[1].x) - (P.z - tr.p[1].z) * (P.x - tr.p[0].x);
	Q1.z = (P.x - tr.p[0].x) * (P.y - tr.p[1].y) - (P.x - tr.p[1].x) * (P.y - tr.p[0].y);
		
	Q2.x = (P.y - tr.p[1].y) * (P.z - tr.p[2].z) - (P.y - tr.p[2].y) * (P.z - tr.p[1].z);
	Q2.y = (P.z - tr.p[1].z) * (P.x - tr.p[2].x) - (P.z - tr.p[2].z) * (P.x - tr.p[1].x);
	Q2.z = (P.x - tr.p[1].x) * (P.y - tr.p[2].y) - (P.x - tr.p[2].x) * (P.y - tr.p[1].y);
	
	Q3.x = (P.y - tr.p[2].y) * (P.z - tr.p[0].z) - (P.y - tr.p[0].y) * (P.z - tr.p[2].z);
	Q3.y = (P.z - tr.p[2].z) * (P.x - tr.p[0].x) - (P.z - tr.p[0].z) * (P.x - tr.p[2].x);
	Q3.z = (P.x - tr.p[2].x) * (P.y - tr.p[0].y) - (P.x - tr.p[0].x) * (P.y - tr.p[2].y);
	
	if (Q1.x * Q2.x + Q1.y * Q2.y + Q1.z * Q2.z >= 0 &&
	    Q2.x * Q3.x + Q2.y * Q3.y + Q2.z * Q3.z >= 0 &&
	    Q1.x * Q3.x + Q1.y * Q3.y + Q1.z * Q3.z >= 0)
		return fabs ((A * p.x + B * p.y + C * p.z + D) / sqrt (A * A + B * B + C * C));


	t = ((tr.p[1].x - tr.p[0].x) * (p.x - tr.p[0].x) + 
	     (tr.p[1].y - tr.p[0].y) * (p.y - tr.p[0].y) + 
	     (tr.p[1].z - tr.p[0].z) * (p.z - tr.p[0].z)) / 
	    ((tr.p[1].x - tr.p[0].x) * (tr.p[1].x - tr.p[0].x) + 
	     (tr.p[1].y - tr.p[0].y) * (tr.p[1].y - tr.p[0].y) + 
	     (tr.p[1].z - tr.p[0].z) * (tr.p[1].z - tr.p[0].z));
	
	if (t >= 0.0 && t <= 1.0)
		h = sqrt ((tr.p[0].x - p.x + t * (tr.p[1].x - tr.p[0].x)) * (tr.p[0].x - p.x + t * (tr.p[1].x - tr.p[0].x))
			+ (tr.p[0].y - p.y + t * (tr.p[1].y - tr.p[0].y)) * (tr.p[0].y - p.y + t * (tr.p[1].y - tr.p[0].y))
			+ (tr.p[0].z - p.z + t * (tr.p[1].z - tr.p[0].z)) * (tr.p[0].z - p.z + t * (tr.p[1].z - tr.p[0].z)));
	else if (t < 0.0)
		h = sqrt ((tr.p[0].x - p.x) * (tr.p[0].x - p.x)
			+ (tr.p[0].y - p.y) * (tr.p[0].y - p.y)
			+ (tr.p[0].z - p.z) * (tr.p[0].z - p.z));
	else
		h = sqrt ((tr.p[1].x - p.x) * (tr.p[1].x - p.x)
			+ (tr.p[1].y - p.y) * (tr.p[1].y - p.y)
			+ (tr.p[1].z - p.z) * (tr.p[1].z - p.z));
	
	t = ((tr.p[2].x - tr.p[0].x) * (p.x - tr.p[0].x) + 
	     (tr.p[2].y - tr.p[0].y) * (p.y - tr.p[0].y) + 
	     (tr.p[2].z - tr.p[0].z) * (p.z - tr.p[0].z)) / 
	    ((tr.p[2].x - tr.p[0].x) * (tr.p[2].x - tr.p[0].x) + 
	     (tr.p[2].y - tr.p[0].y) * (tr.p[2].y - tr.p[0].y) + 
	     (tr.p[2].z - tr.p[0].z) * (tr.p[2].z - tr.p[0].z));
		
	if (t >= 0.0 && t <= 1.0)
		k = sqrt ((tr.p[0].x - p.x + t * (tr.p[2].x - tr.p[0].x)) * (tr.p[0].x - p.x + t * (tr.p[2].x - tr.p[0].x))
			+ (tr.p[0].y - p.y + t * (tr.p[2].y - tr.p[0].y)) * (tr.p[0].y - p.y + t * (tr.p[2].y - tr.p[0].y))
			+ (tr.p[0].z - p.z + t * (tr.p[2].z - tr.p[0].z)) * (tr.p[0].z - p.z + t * (tr.p[2].z - tr.p[0].z)));
	else if (t < 0.0)
		k = sqrt ((tr.p[0].x - p.x) * (tr.p[0].x - p.x)
			+ (tr.p[0].y - p.y) * (tr.p[0].y - p.y)
			+ (tr.p[0].z - p.z) * (tr.p[0].z - p.z));
	else
		k = sqrt ((tr.p[2].x - p.x) * (tr.p[2].x - p.x)
			+ (tr.p[2].y - p.y) * (tr.p[2].y - p.y)
			+ (tr.p[2].z - p.z) * (tr.p[2].z - p.z));
	
	t = ((tr.p[2].x - tr.p[1].x) * (p.x - tr.p[1].x) + 
	     (tr.p[2].y - tr.p[1].y) * (p.y - tr.p[1].y) + 
	     (tr.p[2].z - tr.p[1].z) * (p.z - tr.p[1].z)) / 
	    ((tr.p[2].x - tr.p[1].x) * (tr.p[2].x - tr.p[1].x) + 
	     (tr.p[2].y - tr.p[1].y) * (tr.p[2].y - tr.p[1].y) + 
	     (tr.p[2].z - tr.p[1].z) * (tr.p[2].z - tr.p[1].z));	
		
	if (t >= 0.0 && t <= 1.0)
		l = sqrt ((tr.p[1].x - p.x + t * (tr.p[2].x - tr.p[1].x)) * (tr.p[1].x - p.x + t * (tr.p[2].x - tr.p[1].x))
			+ (tr.p[1].y - p.y + t * (tr.p[2].y - tr.p[1].y)) * (tr.p[1].y - p.y + t * (tr.p[2].y - tr.p[1].y))
			+ (tr.p[1].z - p.z + t * (tr.p[2].z - tr.p[1].z)) * (tr.p[1].z - p.z + t * (tr.p[2].z - tr.p[1].z)));
	else if (t < 0.0)
		l = sqrt ((tr.p[1].x - p.x) * (tr.p[1].x - p.x)
			+ (tr.p[1].y - p.y) * (tr.p[1].y - p.y)
			+ (tr.p[1].z - p.z) * (tr.p[1].z - p.z));
	else
		l = sqrt ((tr.p[2].x - p.x) * (tr.p[2].x - p.x)
			+ (tr.p[2].y - p.y) * (tr.p[2].y - p.y)
			+ (tr.p[2].z - p.z) * (tr.p[2].z - p.z));

	if (h <= k && h <= l)
		return h;
		
	if (k <= h && k <= l)
		return k;
		
	return l;
}
#define SQR(x) ((double)(x)*(x))

double DistPointPoint(XYZ p1, XYZ p2)
{
	return sqrt(SQR(p1.x-p2.x)+SQR(p1.y-p2.y)+SQR(p1.z-p2.z));
}

double TriArea(TRIANGLE tr)
{
	double a,b,c,s;
    a = DistPointPoint(tr.p[0],tr.p[1]);
    b = DistPointPoint(tr.p[1],tr.p[2]);
    c = DistPointPoint(tr.p[2],tr.p[0]);
    s = (a+b+c)/2.0f;
    return sqrt(s*(s-a)*(s-b)*(s-c));
}