Transpiled version (11403L) is out of date.
1 | // For users of this class: Don't fill the maps directly, call |
2 | // mapAnchor + mapCurve. |
3 | |
4 | srecord noeq G22MeshMapping(G22Mesh mesh1, G22Mesh mesh2) { |
5 | delegate Anchor, Curve to G22Mesh. |
6 | |
7 | // A mapping of a curve to another curve may be "flipped" |
8 | // (start becomes end and end becomes start) |
9 | srecord MappedCurve(Curve curve, bool flipped) { |
10 | Curve get() { ret curve; } |
11 | |
12 | Anchor start() { ret curve.anchor(flipped); } |
13 | Anchor end() { ret curve.anchor(!flipped); } |
14 | } |
15 | |
16 | // For both maps: keys are from mesh1, values are from mesh2 |
17 | BijectiveMap<Anchor> anchorMap = new BijectiveMap(true); |
18 | |
19 | // forward (mesh1 -> mesh2) and backward (mesh2 -> mesh1) |
20 | new LinkedHashMap<Curve, MappedCurve> curveMap; |
21 | new LinkedHashMap<Curve, MappedCurve> curveBackwardMap; |
22 | |
23 | // General validity check that should cover all bases |
24 | |
25 | void validityCheck() { |
26 | if (mesh1 == mesh2) |
27 | fail("Mesh1 and mesh2 must not be the same object"); |
28 | |
29 | // For anchors, we only need to check that they come from the |
30 | // right meshes. Bijectiveness is ensured by anchorMap itself. |
31 | |
32 | for (a1, a2 : anchorMap) { |
33 | assertAnchorInMesh(a1, +mesh1); |
34 | assertAnchorInMesh(a2, +mesh2); |
35 | } |
36 | |
37 | for (c1, c2 : curveMap) { |
38 | assertTrue(c1 + " is in mesh1", mesh1.containsCurve(c1)); |
39 | assertTrue(c2 + " is in mesh2", mesh2.containsCurve(c2!)); |
40 | |
41 | // Check compatibility with anchor mappings |
42 | |
43 | assertEquals("Start point", c2.start(), getAnchorMapping(c1.start)); |
44 | assertEquals("End point", c2.end(), getAnchorMapping(c1.end)); |
45 | } |
46 | } |
47 | |
48 | S validityError() { |
49 | try { |
50 | validityCheck(); |
51 | null; |
52 | } catch e { |
53 | ret "Validity error: " + e.getMessage(); |
54 | } |
55 | } |
56 | |
57 | bool isValid() { ret validityError() == null; } |
58 | |
59 | // A mapping is complete iff all anchors and curves from both |
60 | // meshes are covered. |
61 | |
62 | bool isComplete() { |
63 | ret allEq(l(anchorMap), l(mesh1.anchors()), l(mesh2.anchors())) |
64 | && allEq(l(curveMap), l(mesh1.curves()), l(mesh2.curves())); |
65 | } |
66 | |
67 | void assertAnchorInMesh(Anchor a, S meshName, G22Mesh mesh) { |
68 | assertTrue(a + " is in " + meshName, mesh.containsAnchor(a)); |
69 | } |
70 | |
71 | AutoCloseable tempMapAnchor(Anchor a1, Anchor a2) { |
72 | assertAnchorInMesh(a1, +mesh1); |
73 | assertAnchorInMesh(a2, +mesh2); |
74 | ret tempMapPut(anchorMap, a1, a2); |
75 | } |
76 | |
77 | void mapAnchor(Anchor a1, Anchor a2) { |
78 | assertAnchorInMesh(a1, +mesh1); |
79 | assertAnchorInMesh(a2, +mesh2); |
80 | anchorMap.put(a1, a2); |
81 | } |
82 | |
83 | // Note: doesn't remove the curve mappings |
84 | void unmapAnchor(Anchor a1) { |
85 | anchorMap.remove(a1); |
86 | } |
87 | |
88 | AutoCloseable tempMapCurve(Curve c1, Curve c2, bool flipped) { |
89 | new L<AutoCloseable> closers; |
90 | |
91 | var forwardMapping = new MappedCurve(c2, flipped); |
92 | var backwardMapping = new MappedCurve(c1, flipped); |
93 | closers.add(tempMapPut(curveMap, c1, forwardMapping)); |
94 | closers.add(tempMapPut(curveBackwardMap, c2, backwardMapping)); |
95 | |
96 | // Automatically map the anchors |
97 | closers.add(tempMapAnchor(c1.start, forwardMapping.start()); |
98 | closers.add(tempMapAnchor(c1.end, forwardMapping.end()); |
99 | ret combineAutoCloseables(closers); |
100 | } |
101 | |
102 | void mapCurve(Curve c1, Curve c2, bool flipped) { |
103 | var forwardMapping = new MappedCurve(c2, flipped); |
104 | var backwardMapping = new MappedCurve(c1, flipped); |
105 | curveMap.put(c1, forwardMapping); |
106 | curveBackwardMap.put(c2, backwardMapping); |
107 | |
108 | // Automatically map the anchors |
109 | mapAnchor(c1.start, forwardMapping.start()); |
110 | mapAnchor(c1.end, forwardMapping.end()); |
111 | } |
112 | |
113 | // The following functions take anchors and curves from either mesh |
114 | |
115 | Anchor getAnchorMapping aka get(Anchor a) { |
116 | try object anchorMap.get(a); |
117 | ret anchorMap.inverseGet(a); |
118 | } |
119 | |
120 | MappedCurve getCurveMapping aka get(Curve c) { |
121 | try object curveMap.get(c); |
122 | ret curveBackwardMap.get(c); |
123 | } |
124 | |
125 | bool isMapped(Anchor a) { |
126 | ret get(a) != null; |
127 | } |
128 | |
129 | bool isMapped(Curve c) { |
130 | ret get(c) != null; |
131 | } |
132 | |
133 | L<Int> anchorMappingIndices() { |
134 | var idx = mapItemsToListIndex(mesh2.anchorList()); |
135 | ret map(mesh1.anchorList(), a -> idx.get(get(a))); |
136 | } |
137 | |
138 | L<Int> curveMappingIndices() { |
139 | var idx = mapItemsToListIndex(mesh2.curveList()); |
140 | ret map(mesh1.curveList(), a -> { |
141 | var c = get(a); |
142 | ret c == null ?: idx.get(c!); |
143 | }); |
144 | } |
145 | |
146 | toString { |
147 | ret "Mapped anchors: " + anchorMappingIndices() |
148 | + ", mapped curves: " + curveMappingIndices(); |
149 | } |
150 | |
151 | void drawMappedPartOfMesh1(Graphics2D g) { |
152 | for (anchor : keys(anchorMap)) |
153 | new G22VisualizeMeshes().drawAnchor(g, anchor.pt); |
154 | for (curve : keys(curveMap)) |
155 | new G22VisualizeMeshes().drawCurve(g, curve); |
156 | } |
157 | |
158 | void drawMappedPartOfMesh2(Graphics2D g) { |
159 | for (anchor : values(anchorMap)) |
160 | new G22VisualizeMeshes().drawAnchor(g, anchor.pt); |
161 | for (curve : values(curveMap)) { |
162 | new G22VisualizeMeshes vm; |
163 | if (curve.flipped) |
164 | vm.curveColor(Color.green); |
165 | vm.drawCurve(g, curve!); |
166 | } |
167 | } |
168 | } |
download show line numbers debug dex old transpilations
Travelled to 4 computer(s): bhatertpkbcr, ekrmjmnbrukm, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1035062 |
Snippet name: | G22MeshMapping - map one mesh to another one (bijectively mapping anchors and curves) |
Eternal ID of this version: | #1035062/39 |
Text MD5: | 21f1d489130e875e86744cc54c2229d5 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-05-06 20:44:00 |
Source code size: | 5170 bytes / 168 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 228 / 453 |
Version history: | 38 change(s) |
Referenced in: | [show references] |