This repository was archived by the owner on Oct 28, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtrilateral_map.js
97 lines (86 loc) · 2.95 KB
/
trilateral_map.js
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
import { Color } from "three";
import { BILATERAL_BUCKET_SIZE } from "../constants";
import { findBilateralMap } from "./bilateral_map";
export function findTrilateralMap({
geometry,
graph,
qType,
logger,
sourceVertexIndex,
target1VertexIndex,
target2VertexIndex,
}) {
const bucketSize = BILATERAL_BUCKET_SIZE;
const { vertices } = geometry;
const sourceVertex = vertices[sourceVertexIndex],
target1Vertex = vertices[target1VertexIndex],
target2Vertex = vertices[target2VertexIndex];
const { scalarField: scalarField1, faceMap: faceMap1, path: path1 } = findBilateralMap({
geometry: geometry,
graph,
qType,
p: vertices[target1VertexIndex],
q: vertices[sourceVertexIndex],
bucketSize,
logger,
});
const { scalarField: scalarField2, faceMap: faceMap2, path: path2 } = findBilateralMap({
geometry: geometry,
graph,
qType,
p: vertices[target2VertexIndex],
q: vertices[sourceVertexIndex],
bucketSize,
logger,
});
const bilateralMap = [];
geometry.faces.forEach((face) => {
const v1 = geometry.vertices[face.a],
v2 = geometry.vertices[face.b],
v3 = geometry.vertices[face.c];
const hue1 = faceMap1.get(face),
hue2 = faceMap2.get(face);
const color = new Color(0xcccccc);
if (
scalarField1.get(v1) !== Infinity &&
scalarField1.get(v2) !== Infinity &&
scalarField1.get(v3) !== Infinity &&
scalarField2.get(v1) !== Infinity &&
scalarField2.get(v2) !== Infinity &&
scalarField2.get(v3) !== Infinity &&
hue1 < bucketSize &&
hue2 < bucketSize
) {
let hex;
if (hue1 % 2 === hue2 % 2 && hue1 % 2 === 0) {
hex = "ff0000";
} else if (hue1 % 2 === hue2 % 2 && hue1 % 2 === 1) {
hex = "ccff00";
} else if (hue1 % 2 !== hue2 % 2 && hue1 % 2 === 0) {
hex = "00ff66";
} else if (hue1 % 2 !== hue2 % 2 && hue1 % 2 === 1) {
hex = "0066ff";
}
color.setHex(parseInt(`0x${hex}`));
// Calculate the area using Heron's formula
const e1 = v1.distanceTo(v2),
e2 = v2.distanceTo(v3),
e3 = v1.distanceTo(v3);
const s = (e1 + e2 + e3) / 2.0;
bilateralMap[hue1 * 1000 + hue2] = {
x: hue1,
y: hue2,
z:
((bilateralMap[hue1 * 1000 + hue2] && bilateralMap[hue1 * 1000 + hue2].z) ||
0) + Math.sqrt(s * (s - e1) * (s - e2) * (s - e3)),
fill: `#${hex}`,
};
}
face.color = color;
});
return {
bilateralMap,
paths: [path1, path2],
points: [sourceVertex, target1Vertex, target2Vertex],
};
}