<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">The tricky arc tracing step is now fully worked out for open meshes and seems to be doing the right thing in all cases, of which there are many. Like the simpler closed mesh problem, we know that if intersection arcs are extracted correctly, then using them to cut the mesh will always succeed. So this is a big step forward. The class of meshes that can now be handled is: all open and closed meshes. In other words, all meshes. And because all 3D objects can be represented by meshes, the class of objects that can be handled is all objects. It would be tough to do better than that.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">I did not immediately realize that an open arc does not necessarily end on the same surface it started on. The simplest example of this is two interlocking triangles. In general, if an arc begins and ends on a boundary of the same surface then it cuts a piece out of that surface, and it if ends on a different surface then the two surfaces just interpenetrate and neither completely cuts the other. This observation is bound to be important when  automatiing the process of recombining the cut up mesh pieces to form new solids.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">What do we mean by "different surface"? This question is more subtle than it seems. For one thing, an open or close mesh may intersect itself, and all the "different surface" logic just works correctly. That is because we do not actually rely on the idea of a face or edge belonging to any particular surface, but instead, only on the direction an edge penetrates a face, either in the same direction as the face normal ("positive" hit) or in the opposite direction ("negative" hit). Then we propagate that information along the intersection arc as we trace it out. In fact, we rely on knowing with "side" of the intersection we are on at each step in order to know where to look in the soup of edge/face intersections to find the next arc step, which must exist and must be unique (or we have a big problem, but that is another story).</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">To keep things interesting, the "side" flips for some types of edge/face intersection and not for others. The real determinant of whether or not an open arc cuts a surface completely is whether the "side" ends up the same as it started. One reward we get for dealing accurately with a local instead of global definition of sideness is, self intersections just work, whereas in all the published algorithms I have seen, self intersection has been a separate algorithm. Boolean combination of a surface with itself would then be done in two steps: 1) intersect the surface with itself 2) combine the resulting separate surfaces. We can do it in one step, simply because we do not actually rely on any notion of separate surface.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">I am sure that this is far from the only benefit of adopting a local definition of sideness. What we are doing is extracting value from the concept of "oriented manifold", the topological entity defined by a half edge mesh, a deep and powerful notion.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Now it is time to add the ability to cut meshes with open arcs as opposed to closed arcs, which already work. After that there is only a modest amount of work remaining to press this new boolean modeling technique into service.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Regards,</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Daniel</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p></body></html>