0
$\begingroup$

Greetings,

We have a horn-shaped 3d body, which is represented as a list of vertices and faces. Each face is a triangle represented by 3 vertices. The body is positioned along the Z-axis (height). We would like to make several cuts at certain heights. Each cut (a plane perpendicular to the Z- axis) may create one or more cross-sections with the body (the body may split to several branches). The question is how to find those cross-sections.

Another question: how to find (efficiently) the maximum width of the body, i.e. 2 points (not necessarily from the list of vertices) on the surface of the body with the same z-coordinate, and maximum distance between them?

Thank you

$\endgroup$
1
  • 1
    $\begingroup$ This isn't the right forum for this question. $\endgroup$
    – Peter Shor
    Dec 28, 2010 at 14:27

2 Answers 2

0
$\begingroup$

These are applied computational geometry questions, not really mathematics research questions.

http://en.wikipedia.org/wiki/Computational_geometry

Maybe try asking on stackoverflow or on a blender or CAD forum or something.

http://www.blender.org/

$\endgroup$
2
  • 1
    $\begingroup$ The above should be a comment, not an answer. $\endgroup$ Dec 28, 2010 at 15:41
  • 1
    $\begingroup$ But the poster didn't have enough reputation for a comment. $\endgroup$
    – Peter Shor
    Dec 28, 2010 at 19:02
1
$\begingroup$

how to find those cross-sections?

  • Find/write a function which intersects a triangle and a plane (e.g. Dave Eberly's wild magic library). Provided that you need to intersect only with plane perpendicular to the Z axis, you may optimize it.
  • Intersect all triangles with the plane. You will obtain a list of segments (some of them may be of null length) - let's call it the raw list.
  • Make a list of lists (I will name them section-lists), like this: Take one segment. Search through the others which segment has a vertex in common with yours. Make sure to makle the comparison within a tolerance. Whenever you move one segment to a section-list, remove it from the raw list. When you complete section-list by adding to it a complete polygon, start a new section-list and fill it starting with the next segment (repeat).
  • Now you have a list of polygons which are the cross-section. The cross-section may be disconnected, that is, you have more elements in your list.
  • You can try to optimize it by BSP.

how to find (efficiently) the maximum width of the body

  • It is enough to intersect with planes having Z=Z of the vertices in your mesh.
  • To optimize, calculate just the AABB's for each Z, and make a list sorted descending by the diagonal of the AABB.
  • Take the first element, and find the maximum diameter (say "current_width") (it is enough to do this for the vertices of the cross-section polygon)
  • From the diagonal-sorted list, keep only those with the diagonal greater than the current_width (you just need an iterator, will call it "bookmark")
  • Move to the next element of the list, find the new current_width, and if it is greater, replace the old one and remove again from the list the elements with smaller diagonal (or update the bookmark).
  • Do this until you reach the end of the list (or the bookmark)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.