summaryrefslogtreecommitdiff
path: root/content/geometry/formulas3d.cpp
blob: 63de2ce340c6269a812fce71c0e6d53aa611972a (plain)
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
// Skalarprodukt
auto operator|(pt3 a, pt3 b) {
	return a.x * b.x + a.y*b.y + a.z*b.z;
}
auto dot(pt3 a, pt3 b) {return a|b;}

// Kreuzprodukt
pt3 operator*(pt3 a, pt3 b) {return {a.y*b.z - a.z*b.y,
                                     a.z*b.x - a.x*b.z,
                                     a.x*b.y - a.y*b.x};}
pt3 cross(pt3 a, pt3 b) {return a*b;}

// Länge von a
double abs(pt3 a) {return sqrt(dot(a, a));}
double abs(pt3 a, pt3 b) {return abs(b - a);}

// Mixedprodukt
auto mixed(pt3 a, pt3 b, pt3 c) {return a*b|c;};

// orientierung von p zu der Ebene durch a, b, c
// -1 => gegen den Uhrzeigersinn,
//  0 => kolliniear,
//  1 => im Uhrzeigersinn.
int ccw(pt3 a, pt3 b, pt3 c, pt3 p) {
	auto orien = mixed(b - a, c - a, p - a);
	return (orien > EPS) - (orien < -EPS);
}

// Entfernung von Punkt p zur Ebene a, b, c.
double distToPlane(pt3 a, pt3 b, pt3 c, pt3 p) {
	pt3 n = cross(b - a, c - a);
	return abs(dot(n, a - p)) / abs(n);
}

// Liegt p in der Ebene a, b, c?
bool pointOnPlane(pt3 a, pt3 b, pt3 c, pt3 p) {
	return ccw(a, b, c, p) == 0;
}

// Schnittpunkt von der Grade a-b und der Ebene c, d, e
// die Grade darf nicht parallel zu der Ebene sein!
pt3 linePlaneIntersection(pt3 a, pt3 b, pt3 c, pt3 d, pt3 e) {
	pt3 n = cross(d - c, e - c);
	pt3 dir = b - a;
	return a + dir * dot(n, c - a) / dot(n, dir);
}

// Abstand zwischen der Grade a-b und c-d
double lineLineDist(pt3 a, pt3 b, pt3 c, pt3 d) {
	pt3 n = cross(b - a, d - c);
	if (abs(n) < EPS) return distToLine(a, b, c);
	return abs(dot(a - c, n)) / abs(n);
}