[Sidefx-houdini-list] Space filling circles

Ivan DeWolf ivan at martian-labs.com
Thu Aug 6 21:18:54 EDT 2009



there is a "compute dual" in the divide SOP, and a "triangulate 2d" sop.
the triangulate generates a delaunay triangulation, and the divide SOP  
can turn it into a vooronoi diagram...



Quoting herman <herman02 at netvigator.com>:

> this is something i wanna ask for a long time also for the circle packing,
> will take a look at the link n give it a try after my holidays!
>
> thanks
>
> ----- Original Message -----
> From: "Andrew D Lyons" <tstexture at gmail.com>
> To: <sidefx-houdini-list at sidefx.com>
> Sent: Friday, August 07, 2009 5:28 AM
> Subject: Re: [Sidefx-houdini-list] Space filling circles
>
>
> As an interesting side topic to this thread, you can get some pretty
> nice voronoi break-up patterns from a similar network to that which I
> posted above. Again it's based on voronoi patterns being the dual of
> delaunay triangulation:
>
> http://www.comp.lancs.ac.uk/~kristof/research/notes/voronoi/
>
> I've put an example in a second post here:
>
> http://www.sidefx.com/index.php?option=com_forum&Itemid=172&page=viewtopic&p=78063#78063
>
> It would be great if SESI, or someone could wrap some of these up in SOPs...
>
> Cheers
>
> 2009/8/6 Andrew D Lyons <tstexture at gmail.com>:
>> Yep - sorry about the line wrapping on that post. There is a more
>> succinct version of the script uploaded to here:
>>
>> http://www.sidefx.com/index.php?option=com_forum&Itemid=172&page=viewtopic&p=78063#78063
>>
>> Cheers
>>
>>
>> 2009/8/6 David Johnson <daveinengland at gmail.com>:
>>> I had to edit the example to fix the line wraps that the email put in,
>>> but
>>> after that it ran just fine. Maybe someone could put it on odforce or in
>>> the
>>> SideFX forum.
>>>
>>> Dave
>>>
>>> On Thu, Aug 6, 2009 at 6:58 AM, Steve Tucker <Steve.Tucker at starz.com>
>>> wrote:
>>>
>>>> Interesting. If I attempt to run this in a new file, it doesn't work.
>>>> Can't create the geo object. If I cd /obj and then try running it, I get
>>>> a
>>>> fatal exception error.
>>>>
>>>> - Steve
>>>>
>>>> Stephen Tucker, VFX Artist
>>>> p: 416.682.5200 x 5363 | f: 416.682.5209
>>>> Starz Media Canada Co. | 230 Richmond Street East | Toronto, ON M5A 1P4
>>>> www.starzanimation.com
>>>>
>>>>
>>>> -----Original Message-----
>>>> From: sidefx-houdini-list-bounces at sidefx.com [mailto:
>>>> sidefx-houdini-list-bounces at sidefx.com] On Behalf Of Andrew D Lyons
>>>> Sent: Wednesday, August 05, 2009 7:07 PM
>>>> To: sidefx-houdini-list at sidefx.com
>>>> Subject: Re: [Sidefx-houdini-list] Space filling circles
>>>>
>>>> That's an interesting problem. Not exactly circular - but close:
>>>>
>>>> Drop this in a textport:
>>>> #######################################################
>>>>
>>>> # Automatically generated script: Wednesday August 05, 16:06
>>>> \set noalias = 1
>>>> set saved_path = `execute("oppwf")`
>>>> opcf /obj
>>>>
>>>> # Node circle_cells (Object/geo)
>>>> opadd -n geo circle_cells
>>>> oplocate -x 12.6117 -y 2.05949 circle_cells
>>>> opspareds ' group { name "stdswitcher5" label "Transform"
>>>> parm
>>>> { name "keeppos" baseparm joinnext
>>>> export none }
>>>> parm { name "pre_xform" baseparm export
>>>> none } parm
>>>> { name "xOrd" baseparm joinnext export
>>>> none }
>>>> parm { name "rOrd" baseparm export none
>>>> } parm {
>>>> name "t" baseparm export all } parm {
>>>> name "r"
>>>> baseparm export all } parm { name "s"
>>>> baseparm
>>>> export none } parm { name "p" baseparm
>>>> export none }
>>>> parm { name "scale" baseparm export
>>>> none } parm {
>>>> name "lookatpath" baseparm export none } parm
>>>> {
>>>> name "lookup" baseparm export none }
>>>> parm {
>>>> name "pathobjpath" baseparm export none }
>>>> parm {
>>>> name "roll" baseparm export none } parm {
>>>> name "pos"
>>>> baseparm export none } parm { name
>>>> "uparmtype"
>>>> baseparm export none } parm { name
>>>> "pathorient"
>>>> baseparm export none } parm { name
>>>> "up" baseparm
>>>> export none } parm { name "bank" baseparm
>>>> export none
>>>> } } group { name "stdswitcher5_1" label
>>>> "Material" parm
>>>> { name "shop_materialpath" baseparm
>>>> joinnext
>>>> export none } parm { name "shop_materialopts"
>>>> baseparm
>>>> export none } } group { name "stdswitcher5_2"
>>>> label "Render" parm { name "tdisplay"
>>>> baseparm
>>>> export none } parm { name "display"
>>>> baseparm
>>>> export none } parm { name "vm_phantom" label
>>>> "Phantom"
>>>> type toggle default { "0" } range { 0 1 }
>>>> export none
>>>> parmtag { "spare_category" "Render" } } parm {
>>>> name "vm_renderable" label "Renderable" type
>>>> toggle
>>>> default { "1" } range { 0 1 } export
>>>> none parmtag {
>>>> "spare_category" "Render" } } group { name
>>>> "folder0"
>>>> label "Shading" parm { name "categories"
>>>> label "Categories"
>>>> type string default { "" } help "A
>>>> list of tags which can be
>>>> used to select the object" range { 0 1 }
>>>> export none parmtag {
>>>> "spare_category" "Shading" } } parm { name
>>>> "reflectmask"
>>>> label "Reflection Mask" type oplist
>>>> default { "*" } range { 0
>>>> 1 } export none parmtag { "oprelative" "/obj" }
>>>> parmtag {
>>>> "opfilter" "!!OBJ/GEOMETRY!!" } parmtag { "spare_category"
>>>> "Shading"
>>>> } parmtag { "opexpand" "1" } } parm {
>>>> name "lightmask"
>>>> label "Light Mask" type oplist
>>>> default { "*" } range { 0 1 }
>>>> export none parmtag { "oprelative" "/obj" }
>>>> parmtag { "opfilter"
>>>> "!!OBJ/LIGHT!!" } parmtag { "spare_category" "Shading" }
>>>> parmtag {
>>>> "opexpand" "1" } } parm { name
>>>> "vm_volumefilter"
>>>> label "Volume Filter" type string
>>>> default { "gaussian" }
>>>> menu { "box" "Box Filter"
>>>> "gaussian" "Gaussian"
>>>> "bartlett" "Bartlett (triangle)" "catrom"
>>>> "Catmull-Rom"
>>>> "hanning" "Hanning" "blackman" "Blackman"
>>>> "sinc" "Sinc
>>>> (sharpening)" } range { 0 1 }
>>>> export none parmtag {
>>>> "spare_category" "Shading" } } parm {
>>>> name "vm_volumefilterwidth" label "Volume
>>>> Filter Width"
>>>> type float default { "1.5" }
>>>> range { 0.001 5 } export none
>>>> parmtag { "spare_category" "Shading" } } parm {
>>>> name "vm_matte" label "Matte shading"
>>>> type toggle default {
>>>> "0" } range { 0 1 } export none
>>>> parmtag { "spare_category"
>>>> "Shading" } } } group { name "folder0_1"
>>>> label "Sampling" parm { name "geo_velocityblur"
>>>> label "Geometry Velocity Blur" type
>>>> toggle default { "0" }
>>>> range { 0 1 } export none
>>>> parmtag { "spare_category" "Sampling"
>>>> } } } group { name "folder0_2"
>>>> label "Dicing"
>>>> parm { name "vm_shadingquality" label "Shading
>>>> Quality"
>>>> type float default { "1" }
>>>> range { 0 10 } export none
>>>> parmtag { "spare_category" "Dicing" } } parm {
>>>> name "vm_rayshadingquality" label "Ray Shading
>>>> Quality"
>>>> type float default { "1" }
>>>> range { 0 10 } export none
>>>> parmtag { "spare_category" "Dicing" } } }
>>>> group {
>>>> name "folder0_3" label "Geometry" parm {
>>>> name "vm_rmbackface" label "Backface
>>>> Removal (Mantra)"
>>>> type toggle default { "0" }
>>>> range { 0 1 } export none
>>>> parmtag { "spare_category" "Geometry" } }
>>>> parm {
>>>> name "shop_geometrypath" label "Procedural
>>>> Shader" type oppath
>>>> default { "" } range { 0 1 }
>>>> export none parmtag {
>>>> "oprelative" "." } parmtag { "opfilter" "!!SHOP/GEOMETRY!!" }
>>>> parmtag { "spare_category" "Geometry" } }
>>>> parm {
>>>> name "vm_rendersubd" label "Polygons As
>>>> Subdivision (Mantra)"
>>>> type toggle default { "0" }
>>>> range { 0 1 } export none
>>>> parmtag { "spare_category" "Geometry" } }
>>>> parm {
>>>> name "vm_renderpoints" label "Render As
>>>> Points (Mantra)"
>>>> type toggle default { "0" }
>>>> range { 0 1 } export none
>>>> parmtag { "spare_category" "Geometry" } }
>>>> parm {
>>>> name "vm_metavolume" label "Metaballs
>>>> as Volume" type toggle
>>>> default { "0" } range { 0 1 }
>>>> export none parmtag {
>>>> "spare_category" "Geometry" } } parm { name
>>>> "vm_coving"
>>>> label "Coving" type integer
>>>> default { "1" } menu {
>>>> "0" "Disable Coving" "1" "Coving for
>>>> displacement/sub-d"
>>>> "2" "Coving for all primitives" } range { 0
>>>> 10 } export none
>>>> parmtag { "spare_category" "Geometry" } }
>>>> parm {
>>>> name "vm_computeN" label "Automatically
>>>> Compute Normals"
>>>> type toggle default { "1" }
>>>> range { 0 1 } export none
>>>> parmtag { "spare_category" "Geometry" } } }
>>>> } group
>>>> { name "stdswitcher5_3" label "Misc" parm {
>>>> name "use_dcolor"
>>>> baseparm export none } parm { name
>>>> "dcolor"
>>>> baseparm export none } parm { name
>>>> "picking" baseparm
>>>> export none } parm { name "pickscript"
>>>> baseparm
>>>> export none } parm { name "caching"
>>>> baseparm
>>>> export none } parm { name "vport_shadeopen"
>>>> baseparm
>>>> export none } parm { name "vport_displayassubdiv"
>>>> baseparm
>>>> invisible export none } } ' circle_cells
>>>> opset -S on circle_cells
>>>> opparm circle_cells use_dcolor ( off )
>>>> chautoscope circle_cells +tx +ty +tz +rx +ry +rz +sx +sy +sz
>>>> opset -d on -r off -h off -f off -y off -t off -l off -s off -u off -c
>>>> off -e on -b off -x off circle_cells
>>>> opexprlanguage -s hscript circle_cells
>>>> opcf circle_cells
>>>>
>>>> # Node circle1 (Sop/circle)
>>>> opadd -n circle circle1
>>>> oplocate -x 3.41176 -y 0.0882355 circle1
>>>> opparm circle1 type ( poly ) orient ( zx ) rad ( 21 21 ) divs ( 100 )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off circle1
>>>> opexprlanguage -s hscript circle1
>>>>
>>>> # Node triangulate2d1 (Sop/triangulate2d)
>>>> opadd -n triangulate2d triangulate2d1
>>>> oplocate -x 3.41176 -y -1.15882 triangulate2d1
>>>> opparm triangulate2d1 refine ( on ) maxarea ( 2 ) minangle ( 30 )
>>>> maxnewpts ( 19565 ) removeduplicatepoints ( off )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off triangulate2d1
>>>> opexprlanguage -s hscript triangulate2d1
>>>>
>>>> # Node facet1 (Sop/facet)
>>>> opadd -n facet facet1
>>>> oplocate -x 3.50951 -y -3.19412 facet1
>>>> opparm facet1 unique ( on )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off facet1
>>>> opexprlanguage -s hscript facet1
>>>>
>>>> # Node foreach1 (Sop/foreach)
>>>> opadd -n foreach foreach1
>>>> oplocate -x 3.41176 -y -5.02471 foreach1
>>>> chblockbegin
>>>> chadd -t 0 0 foreach1 numrange2
>>>> chkey -t 0 -v 10 -m 0 -a 0 -A 0 -T a -F 'nprims("../" + opinput(".",
>>>> 0))-1' foreach1/numrange2
>>>> chblockend
>>>> opparm foreach1 fortype ( number ) numrange ( 0 numrange2 1 )
>>>> opset -d on -r on -h off -f off -y off -t off -l off -s off -u off -c
>>>> off -e on -b off foreach1
>>>> opexprlanguage -s hscript foreach1
>>>> opcf foreach1
>>>>
>>>> # Node each1 (Sop/each)
>>>> opadd -n each each1
>>>> oplocate -x 0.6102 -y 4.8513 each1
>>>> chblockbegin
>>>> chadd -t 0 0 each1 attribtol
>>>> chkey -t 0 -v 0.001 -m 0 -a 0 -A 0 -T a -F 'ch("../attribtol")'
>>>> each1/attribtol
>>>> chadd -t 0 0 each1 attribval1
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F 'stamp("..",
>>>> chs("../forstamp") + "1", 0)' each1/attribval1
>>>> chadd -t 0 0 each1 attribval2
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F 'stamp("..",
>>>> chs("../forstamp") + "2", 0)' each1/attribval2
>>>> chadd -t 0 0 each1 attribval3
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F 'stamp("..",
>>>> chs("../forstamp") + "3", 0)' each1/attribval3
>>>> chadd -t 0 0 each1 attrib
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F
>>>> 'ifs(!!strcmp(chs("../fortype"), "attrib"), "", chs("../attrib"))'
>>>> each1/attrib
>>>> chadd -t 0 0 each1 group
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F
>>>> 'ifs(!!strcmp(chs("../fortype"), "group"), "", stamps("..",
>>>> chs("../forstamp"), ""))' each1/group
>>>> chadd -t 0 0 each1 feedback
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F '!ch("../mergeresults")'
>>>> each1/feedback
>>>> chblockend
>>>> opparm each1 feedback ( feedback ) group ( group ) attrib ( attrib )
>>>> attribval ( attribval1 attribval2 attribval3 ) attribtol ( attribtol )
>>>> forpath ( .. )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off each1
>>>> opexprlanguage -s hscript each1
>>>>
>>>> # Node delete2 (Sop/delete)
>>>> opadd -n delete delete2
>>>> oplocate -x 0.6102 -y 3.89295 delete2
>>>> chblockbegin
>>>> chadd -t 0 0 delete2 rangeend
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F '$N' delete2/rangeend
>>>> chadd -t 0 0 delete2 filter
>>>> chkey -t 0 -v 1 -m 0 -a 0 -A 0 -T a -F 'stamp("../", "FORVALUE", 0)
>>>> == prim("../" + opinput(".", 0), $PR, "__primnum", 0)' delete2/filter
>>>> chblockend
>>>> opparm delete2 negate ( keep ) groupop ( filter ) filter ( filter )
>>>> pattern ( "" )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off delete2
>>>> opexprlanguage -s hscript delete2
>>>>
>>>> # Node fit1 (Sop/fit)
>>>> opadd -n fit fit1
>>>> oplocate -x 0.610753 -y 0.946953 fit1
>>>> opparm fit1 stdswitcher ( 2 2 2 ) method ( interp ) orderu ( 3 )
>>>> orderv ( 3 ) smooth ( 0.343 ) scope ( breakpnt ) dataparmv ( uniform )
>>>> closeu ( wu ) closev ( wv ) corners ( on )
>>>> opset -d on -r on -h off -f off -y off -t off -l off -s off -u off -c
>>>> off -e on -b off fit1
>>>> opexprlanguage -s hscript fit1
>>>>
>>>> # Node circle1 (Sop/circle)
>>>> opadd -n circle circle1
>>>> oplocate -x 3.01075 -y 3.7 circle1
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off circle1
>>>> opexprlanguage -s hscript circle1
>>>>
>>>> # Node resample1 (Sop/resample)
>>>> opadd -n resample resample1
>>>> oplocate -x 0.622517 -y 2.92353 resample1
>>>> opparm resample1 edge ( on ) dolength ( off ) dosegs ( on ) segs ( 2 )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off resample1
>>>> opexprlanguage -s hscript resample1
>>>>
>>>> # Node delete1 (Sop/delete)
>>>> opadd -n delete delete1
>>>> oplocate -x 0.610753 -y 1.85283 delete1
>>>> chblockbegin
>>>> chadd -t 0 0 delete1 rangeend
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F '$N' delete1/rangeend
>>>> chblockend
>>>> opparm delete1 entity ( point ) groupop ( range ) range ( -1 rangeend )
>>>> opset -d off -r off -h off -f off -y off -t on -l off -s off -u off -c
>>>> off -e on -b off delete1
>>>> opexprlanguage -s hscript delete1
>>>> oporder -e each1 delete2 fit1 circle1 resample1 delete1
>>>> opcf ..
>>>>
>>>> # Node __PRIMNUM (Sop/attribcreate)
>>>> opadd -n attribcreate __PRIMNUM
>>>> oplocate -x 3.41176 -y -4.07765 __PRIMNUM
>>>> chblockbegin
>>>> chadd -t 0 0 __PRIMNUM value1
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F '$PR' __PRIMNUM/value1
>>>> chblockend
>>>> opparm __PRIMNUM name ( __primnum ) varname ( __PRIMNUM ) class (
>>>> primitive ) value ( value1 0 0 0 )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off __PRIMNUM
>>>> opexprlanguage -s hscript __PRIMNUM
>>>>
>>>> # Node foreach2 (Sop/foreach)
>>>> opadd -n foreach foreach2
>>>> oplocate -x 3.50951 -y -2.29415 foreach2
>>>> opparm foreach2 fortype ( number ) numrange ( 0 4 1 ) mergeresults (
>>>> off )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off foreach2
>>>> opexprlanguage -s hscript foreach2
>>>> opcf foreach2
>>>>
>>>> # Node each1 (Sop/each)
>>>> opadd -n each each1
>>>> oplocate -x 0.6102 -y 4.8513 each1
>>>> chblockbegin
>>>> chadd -t 0 0 each1 attribtol
>>>> chkey -t 0 -v 0.001 -m 0 -a 0 -A 0 -T a -F 'ch("../attribtol")'
>>>> each1/attribtol
>>>> chadd -t 0 0 each1 attribval1
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F 'stamp("..",
>>>> chs("../forstamp") + "1", 0)' each1/attribval1
>>>> chadd -t 0 0 each1 attribval2
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F 'stamp("..",
>>>> chs("../forstamp") + "2", 0)' each1/attribval2
>>>> chadd -t 0 0 each1 attribval3
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F 'stamp("..",
>>>> chs("../forstamp") + "3", 0)' each1/attribval3
>>>> chadd -t 0 0 each1 attrib
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F
>>>> 'ifs(!!strcmp(chs("../fortype"), "attrib"), "", chs("../attrib"))'
>>>> each1/attrib
>>>> chadd -t 0 0 each1 group
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F
>>>> 'ifs(!!strcmp(chs("../fortype"), "group"), "", stamps("..",
>>>> chs("../forstamp"), ""))' each1/group
>>>> chadd -t 0 0 each1 feedback
>>>> chkey -t 0 -v 0 -m 0 -a 0 -A 0 -T a -F '!ch("../mergeresults")'
>>>> each1/feedback
>>>> chblockend
>>>> opparm each1 feedback ( feedback ) group ( group ) attrib ( attrib )
>>>> attribval ( attribval1 attribval2 attribval3 ) attribtol ( attribtol )
>>>> forpath ( .. )
>>>> opset -d off -r off -h off -f off -y off -t off -l off -s off -u off
>>>> -c off -e on -b off each1
>>>> opexprlanguage -s hscript each1
>>>>
>>>> # Node divide2 (Sop/divide)
>>>> opadd -n divide divide2
>>>> oplocate -x 0.6102 -y 3.42343 divide2
>>>> opparm divide2 convex ( off ) dual ( on )
>>>> opset -d on -r on -h off -f off -y off -t off -l off -s off -u off -c
>>>> off -e on -b off divide2
>>>> opexprlanguage -s hscript divide2
>>>> oporder -e each1 divide2
>>>> opcf ..
>>>> oporder -e circle1 triangulate2d1 facet1 foreach1 __PRIMNUM foreach2
>>>> opcf ..
>>>>
>>>> opcf /obj
>>>> opcf circle_cells
>>>> opwire -n circle1 -0 triangulate2d1
>>>> opwire -n foreach2 -0 facet1
>>>> opwire -n __PRIMNUM -0 foreach1
>>>> opcf foreach1
>>>> opwire -n -i 0 -0 each1
>>>> opwire -n each1 -0 delete2
>>>> opwire -n delete1 -0 fit1
>>>> opwire -n delete2 -0 resample1
>>>> opwire -n resample1 -0 delete1
>>>> opcf ..
>>>> opwire -n facet1 -0 __PRIMNUM
>>>> opwire -n triangulate2d1 -0 foreach2
>>>> opcf foreach2
>>>> opwire -n -i 0 -0 each1
>>>> opwire -n each1 -0 divide2
>>>> opcf ..
>>>> opcf ..
>>>> opcf $saved_path
>>>>
>>>> ######################################################
>>>>
>>>> 2009/8/5 Doug Struthers <dragonfly at dougstruthers.com>:
>>>> > Thanks for your inputs.
>>>> >
>>>> > Since there do not need to be thousands of them I bet I can iterate on
>>>> them
>>>> > to get a close approximation without taking a long long time to
>>>> > compute.
>>>> >
>>>> > It is intriguing to think that there may be a function with dops that
>>>> > the
>>>> > solution falls out of but I am still a way down the learning curve
>>>> > with
>>>> all
>>>> > the functionality that exists in vops let alone rolling my own.
>>>> >
>>>> > Cheers
>>>> >
>>>> > Doug
>>>> >
>>>> > On Wed, Aug 5, 2009 at 9:09 AM, Gene Dreitser <keyframe at rogers.com>
>>>> wrote:
>>>> >
>>>> >>
>>>> >> Might also be worth it to take a look at the output of the isooffset
>>>> >> sop
>>>> >> using the 'tetra-mesh' output type. Tetra-type set to 'cubes'.
>>>> >>
>>>> >> While it will not pack perfectly, it DOES create a predictable
>>>> >> pattern
>>>> of
>>>> >> rows and columns that one might be able to make use, and as an added
>>>> bonus,
>>>> >> it can use ray-intersect to sample the original mesh.
>>>> >>
>>>> >> Best,
>>>> >>
>>>> >> G
>>>> >>
>>>> >> --
>>>> >> Gene Dreitser
>>>> >> Loki Visual Effects
>>>> >> p: 416.532.5654 // c: 416.803.0682 // www.lokivfx.com
>>>> >>
>>>> >>
>>>> >>
>>>> >> ----- Original Message ----
>>>> >> From: Andy Nicholas <andy at andynicholas.com>
>>>> >> To: sidefx-houdini-list at sidefx.com
>>>> >> Sent: Wednesday, August 5, 2009 12:05:13 PM
>>>> >> Subject: Re: [Sidefx-houdini-list] Space filling circles
>>>> >>
>>>> >> Hi Doug,
>>>> >> Are you asking this because you know of this being done somewhere
>>>> >> else?
>>>> I
>>>> >> only ask because I just Googled this (out of my own interest), and
>>>> judging
>>>> >> on how many papers are written on this topic, I'd say that it's a
>>>> >> non-trivial problem to solve.
>>>> >>
>>>> >> The only thing that springs to mind, would be to create an iterative
>>>> >> approach, using the SOP solver or the Feedback SOP (proto_install).
>>>> >>
>>>> >> Note that I haven't tested this, or fully thought it through, but the
>>>> >> following... might... just... work...
>>>> >>
>>>> >> Start off with a triangular polygon with a random sized disc at each
>>>> >> vertex so that their circumferences touch. From that, take a pair of
>>>> discs
>>>> >> and create another randomly sized one and place it (using simple
>>>> >> trigonometry) so that it touches the first two. Extend the triangle
>>>> >> into
>>>> a
>>>> >> four sided polygon with the new point at the center of the new disc.
>>>> >> Repeat the process, but ignoring any discs internal to the polygon.
>>>> >>
>>>> >> I can see this approach breaking down if you ever have a non-convex
>>>> >> polygon, but there are probably some constraints that you could
>>>> >> figure
>>>> out
>>>> >> that will prevent this from happening.
>>>> >>
>>>> >> Andy
>>>> >>
>>>> >>
>>>> >>
>>>> >>
>>>> >> > Hi
>>>> >> >
>>>> >> > Can anyone point me to a Houdini method (or other solution) for
>>>> packing
>>>> >> > random sized circles so that they are tightly packed and each
>>>> >> > circumference
>>>> >> > just touches its neighbors?
>>>> >> >
>>>> >> > Thanks
>>>> >> >
>>>> >> > Doug
>>>> >> >
>>>> >> > --
>>>> >> > www.dougstruthers.com
>>>> >> > _______________________________________________
>>>> >> > Sidefx-houdini-list mailing list
>>>> >> > Sidefx-houdini-list at sidefx.com
>>>> >> > https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>>>> >> >
>>>> >>
>>>> >>
>>>> >> _______________________________________________
>>>> >> Sidefx-houdini-list mailing list
>>>> >> Sidefx-houdini-list at sidefx.com
>>>> >> https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>>>> >>
>>>> >> _______________________________________________
>>>> >> Sidefx-houdini-list mailing list
>>>> >> Sidefx-houdini-list at sidefx.com
>>>> >> https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>>>> >>
>>>> >
>>>> >
>>>> >
>>>> > --
>>>> > www.dougstruthers.com
>>>> > _______________________________________________
>>>> > Sidefx-houdini-list mailing list
>>>> > Sidefx-houdini-list at sidefx.com
>>>> > https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>>>> >
>>>>
>>>>
>>>>
>>>> --
>>>> =======================================
>>>> Andrew D Lyons | Digital Artist | http://www.tstex.com
>>>> =======================================
>>>> _______________________________________________
>>>> Sidefx-houdini-list mailing list
>>>> Sidefx-houdini-list at sidefx.com
>>>> https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>>>> _______________________________________________
>>>> Sidefx-houdini-list mailing list
>>>> Sidefx-houdini-list at sidefx.com
>>>> https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>>>>
>>> _______________________________________________
>>> Sidefx-houdini-list mailing list
>>> Sidefx-houdini-list at sidefx.com
>>> https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>>>
>>
>>
>>
>> --
>> =======================================
>> Andrew D Lyons | Digital Artist | http://www.tstex.com
>> =======================================
>>
>
>
>
> --
> =======================================
> Andrew D Lyons | Digital Artist | http://www.tstex.com
> =======================================
> _______________________________________________
> Sidefx-houdini-list mailing list
> Sidefx-houdini-list at sidefx.com
> https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>
>
>
> _______________________________________________
> Sidefx-houdini-list mailing list
> Sidefx-houdini-list at sidefx.com
> https://lists.sidefx.com:443/mailman/listinfo/sidefx-houdini-list
>



_______________________________________________________
Perfection is achieved when nothing else can be removed
-Yvon Chouinard

----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.



More information about the Sidefx-houdini-list mailing list