Tirrell,

Actually, I don't have a particular 3D printer that I am working with. I
was interested in the general problem of identifying points that are
contained inside a solid defined by a triangle mesh. I thought I could
learn a little more J by attempting to develop a program to find those
points. I hadn't even considered the issue of defining the print-head path
for the 3D printer.

I probably should have labeled my posts "Finding the points inside a solid
that fall on an intersecting plane" or some similar name, and not mentioned
a 3D printer at all. However, your links to the 3D printer information were
quite interesting, so I appreciate the post. I learned quite a bit about
that technology from them.

Skip

Skip

On Tue, Jun 26, 2012 at 5:23 PM, Tirrell, Jordan (Consultant) <
jtirr...@thomasnet.com> wrote:

> My understanding of 3D printers is that they need specific directions
> for the path that the print head takes. I know Solidoodle assumes you're
> starting with .stl (triangle mesh) files and recommends using Skeinforge
> to create the printer head path files
> (http://www.solidoodle.com/how-to-2/how-to-print/). It looks like .stl
> files are pretty standard for the 3D printing community
> (http://www.thingiverse.com/). I do have J code to create .stl files for
> the Platonic solids. Are you working with a specific printer and
> software that requires the binary 3D array format you describe?
>
>
> -----Original Message-----
> From: programming-boun...@jsoftware.com
> [mailto:programming-boun...@jsoftware.com] On Behalf Of Skip Cave
> Sent: Tuesday, June 26, 2012 4:03 AM
> To: Programming@jsoftware.com
> Subject: Re: [Jprogramming] The 3D printer problem
>
> For our 3D printer problem, we first look at how to create a data
> structure which will define a mesh of triangles, which in turn, defines
> a 3D solid.
> Then we can see about defining nouns that will compute the interior
> points in the solid, which would fall in each scanning plane.
>
> At first glance, it would seem that one could make a simple list of
> triples, where a triple is a vector with three numbers that represent
> the x, y, and z coordinates of a single vertex in the triangle mesh.
> This data structure would be a simple 3xN array where each triple
> represents one vertex in the triangle mesh. This seems quite efficient,
> except for the fact that with this data structure, discovering which
> verticies belong to which triangles is a non-trivial problem. The data
> structure needs to somehow indicate which vertices go with which
> triangles, to avoid any additional computational complexities.
>
> The obvious way to keep triangle data in the structure is to simply
> define a 3 by 3 by N matrix. Each three-element row vector in the matrix
> representing one point in 3D space and thus one vertex in the triangle
> mesh. Each 3x3 array represents three vertices, which defines exactly
> one triangle in the mesh, and the N 3x3 arrays then represent the N
> triangles in the mesh. Since all the triangles will be sharing vertices
> with other triangles, this scheme will be somewhat inefficient. This is
> because the same vertex may be in several triangles, and thus repeated
> in several different 3x3 matrices. However, this is probably the easiest
> data structure to deal with computationally, but its inefficiency may
> become problematic for large triangle meshes.
>
> Wikipedia presents additional proposals for triangle mesh data
> structures.
> The Wikipedia article "Triangle Mesh" (
> http://en.wikipedia.org/wiki/Triangle_mesh), defines two other triangle
> mesh data structures, including the "Triangle Strip" and the "Index
> Array"
> structures, both of which reduce the vertex redundancy from the general
> case I defined previously. However, with J, it is likely much easier to
> deal with the fully-redundant 3x3xN matrix, as that structure should
> keep extra data manipulation to a minimum.
>
>
> This now allows us to define our first solid, the right tetrahedron I
> described in my first post, using our new data structure.
>
>   t1 =. 4 3 3 $ 0 0 0 100 0 0 0 100 0 0 0 100
>   t1
>  0   0   0
> 100   0   0
>  0 100   0
>
>  0   0 100
>  0   0   0
> 100   0   0
>
>  0 100   0
>  0   0 100
>  0   0   0
>
> 100   0   0
>  0 100   0
>  0   0 100
>
> Where t1 is the data structure for our tetrahedron. Now we are ready to
> try to build the point classification algorithm, which will take some
> work, in order to convert Feito's algorithm to J. Any suggestions would
> be appreciated..
>
> Skip
>
>
> On Tue, Jun 26, 2012 at 1:40 AM, Skip Cave <s...@caveconsulting.com>
> wrote:
>
> > So far, no one has replied to my 3D printer problem post. Meanwhile, I
>
> > have been researching the problem, and I have found what looks like a
> > reasonable algorithm that could be applied to the solution. The
> > algorithm is described in a  paper by F.R. Feito and others, entitled
> > "An Efficient Point Classification Algorithm for Triangle Meshes".
> >
> > The paper is located at:  http://elliscave.com/cc/sfrto05.pdf.
> >
> > The C code implementing the algorithm is at:
> > http://wwwdi.ujaen.es/~gigjaen/recursos/inclusionmesh.htm
> >
> > This algorithm gives us a head start on the problem. We still need to
> > find the points in each of the 100 scan planes that fall within the
> solid.
> > However, one of the first steps will be to decide how to structure the
>
> > data for the triangle mesh in a "J" way, which will represent the
> > solid, and still lend itself to the coming computations. That will be
> > my next step in this problem space.
> >
> > Skip
> >
> >
> > On Mon, May 21, 2012 at 8:46 AM, Skip Cave
> <s...@caveconsulting.com>wrote:
> >
> >>  A key problem for all 3D printers is to convert a defined solid into
>
> >> a set of horizontal slices (planes) through the solid. Each slice
> >> will represent one scan-pass of the printer head for the 3D printer
> >> as it builds up the solid, one layer at a time.
> >>
> >>
> >> Each slice through the solid should be defined as a binary 2D surface
>
> >> array, with a binary one in the array indicating that specific point
> >> on the plane is inside the solid, and a binary zero in the array
> >> indicating that the point in the plane is outside the solid. A one in
>
> >> the scan plane array indicates that the printer should deposit some
> >> material at this point in the plane, and a zero indicates that the
> >> printer should not deposit any material at this point in the plane.
> >>
> >>
> >> For this problem, we will define a solid using a set of points in 3D
> >> space. The points define the vertices on the surface of the solid.
> >> The edges of the solid are defined as the lines between the points.
> >> The faces of the solid are defined by the set of points which are in
> the same plane.
> >> In the general case, the faces of the solid's surface can be made as
> >> numerous and as small as required, to form the required shape.
> >>
> >>
> >> Our solids will be defined in a 3 dimensional space, with points in
> >> the space represented by an x,y,z triple. Thus a solid tetrahedron
> >> can be represented by four points in the space.
> >>
> >>
> >> The four points 0,0,0 100,0,0 0,100,0 and 0,0,100 define a simple
> >> right tetrahedron. This will be the first solid that we want to print
>
> >> with our 3D printer.
> >>
> >>
> >> We define a horizontal scan surface for our printer as the plane
> >> defined by the three points 0,0,0 100,0,0 0,100,0.  There is no
> >> reason to define the scan surface array any larger than the solid
> >> itself, so the scan surface array can be a 100 x 100-point binary
> array.
> >>
> >>
> >> Each point in a scan-surface array must indicate whether it is inside
>
> >> or outside the solid shape. If the point is inside the solid, a
> >> binary one will tell the printer to deposit material at this point.
> >> If the point is outside the solid, a binary zero will tell the
> >> printer to not deposit any material there.
> >>
> >>
> >> For our 3D printer, we need to generate 100 of these binary scan
> >> surface arrays, one for each resolution step as the printer moves up
> >> through the solid space. These 100 scan surface arrays define where
> >> the 3D printer will deposit material on each layer, to form our
> >> tetrahedron. The 3D printer will start with the lowest layer of the
> >> scan arrays, and build the material up from there.
> >>
> >>
> >> The problem is to define a J verb that will generate the one hundred
> >> 100x100 2D binary arrays (essentially building a 100x100x100 3D
> >> binary matrix), which represents the 100 horizontal slices through
> >> the solid. That binary matrix will indicate to the 3D printer where
> >> to place the material to create the solid.
> >>
> >>
> >> Once you have generated the 100x100x100 binary array for the
> >> tetrahedron, test your function out by generating a similar scan
> >> surface array for the solid created by the intersection of two
> tetrahedrons:
> >>
> >>
> >> Tetrahedron 1:  50,0,0 0,50,0 50,50,0 25,25,100
> >>
> >> Tetrahedron2:  0,50,0 0,0,50 0,50,50 100,25,25
> >>
> >>
> >> For further challenges, see if your J function can generate the set
> >> of 3D printer scan surface arrays for the four other Platonic solids
> >> besides the tetrahedron. Here are the J definitions for all the
> Platonic solids:
> >>  http://tinyurl.com/bry2yxc  You probably will want to scale these
> >> solids up by a factor of 10 or so.
> >>
> >>
> >> In general, your J function should be able to generate binary scan
> >> surface arrays for a 3D printer given any arbitrary solid, defined by
>
> >> a set of points in 3-space. Actually, besides the points, for complex
>
> >> solids you may need a vector indicating which side of each surface or
>
> >> face is the inside of the solid.
> >>
> >>
> >> Skip
> >>
> >>
> >>
> >
> >
> > --
> > Skip Cave
> > Cave Consulting LLC
> > Phone: 214-460-4861
> >
> >
>
>
> --
> Skip Cave
> Cave Consulting LLC
> Phone: 214-460-4861
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>



-- 
Skip Cave
Cave Consulting LLC
Phone: 214-460-4861
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to