New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Retriangulate surface from intersection pattern of two completely periodic directions #290
Comments
There was some related discussion a while back at https://sagemath.zulipchat.com/#narrow/stream/271193-polygon/topic/.281.2C.203.2C.206.29. (How to find intersection points of two cylinders.) |
The hard part of this is: Given two cylinders, produce their intersection points such that they can be ordered along their circumferences. This can be reduced to: Given two saddle connections, produce their intersection points such that they can be ordered along the saddle connections. (i.e., given a couple of such points on a saddle connection, coming from different intersections, order them.) |
About naming, I guess we could have: std::vector<SaddleConnectionIntersection> SaddleConnection::intersections(const SaddleConnection&) const;
std::vector<PathIntersection> Path::intersections(const Path&) const;
std::vector<FlowComponentIntersection> FlowComponent::intersections(const FlowComponent&) const;
std::vector<FlowComponentIntersection> FlowDecomposition::intersections(const FlowDecomposition&) const; Each of these should allow to create the corresponding object on the other SaddleConnection/Path/FlowComponent, i.e., there should be: SaddleConnection SaddleConnectionIntersection::saddleConnection() const;
SaddleConnectionIntersection SaddleConnectionIntersection::other() const; Not sure whether This makes We probably don't want to expose the final application of producing the requested permutations in libflatsurf then and only implement this in sage-flatsurf. It should be quite trivial then if I am not missing anything. Note that there is already |
Should it be - std::vector<FlowComponentIntersection> FlowDecomposition::intersections(const FlowDecomposition&) const;
+ std::vector<FlowDecompositionIntersection> FlowDecomposition::intersections(const FlowDecomposition&) const; |
If each intersection has to hold a copy of the path it is indeed annoying. Would it make sense to have a mutability flag on them and hold a reference to an immutable path ? |
Also, I think that the intersection of non-tighten path does not make much sense as you want the size of |
Also, for paths you would have to be careful with the fact that two paths might share a common saddle connection. What is the meaning of intersection there ? If we want geometric intersection the meaning is clear but the position of the intersection point is not well defined. Maybe, when there is indeed a geometric intersection, the middle of the saddle connection ? |
No. But I forget why exactly. |
We can just hold a shared pointer instead actually. So that's not an issue. |
It does not make much sense but we should probably still allow it. |
We don't have to return a point. The |
We would like to expose a Deformation that, given two flow decompositions into cylinders, rewrites a surface like a Thurston-Veech surface.
The main ingredient for this is to be able to understand the intersection pattern between all the cylinders in the decompositions.
The information we need to build this is only the intersection points of the cylinders and the order in which they show up on the intersecting cylinders, i.e., we need to be able to map an intersection point's (cylinder, order) to the (crossing cylinder, order there.)
It is acceptable that we only implement this when the underlying ring has division.
It might help with some of the geometry to make the flow directions perpendicular first, recompute the surface there, and then deform back to the original directions.
original issue below:
In order to automatize the search for Thurston-Veech constructions it would be convenient to have the following function.
INPUT: two
FlowDecomposition
D0
andD1
of a FlatTriangulation into cylinders (no minimal, no unknown)We consider the circumferences of all the cylinders in
D0
andD1
(oriented in the directions of the vectorD0.vertical()
andD1.vertical()
). They intersect a certain number of times, let sayn
. We label these intersections arbitrarily with the integers{0, 1, ..., n-1}
. One can then build two permutationsp0
andp1
on{0, 1, ..., n-1}
which corresponds to either follow the cylinders inD0
or following the ones inD1
. The cycles in the cycle decomposition ofp0
andp1
are respectively in bijection with the cylinders inD0
andD1
.OUTPUT: the permutations
p0
andp1
together with the correspondence : cycles ofp0
<-> cylinders inD0
, cycles ofp1
<-> cylinders inD1
.The text was updated successfully, but these errors were encountered: