Hello! I had been trying to write the implementation for volume already and here is it's first implementation. I haven't kept API design in mind right now as you can see in there, but this one is just to make sure I'm following the logic correctly or not. Please have a look.
volume implementation : https://gist.github.com/dracarys-stormborn/c894daa679fb670892c8 A header having the structures defined : https://gist.github.com/dracarys-stormborn/5f64359e90334728df70 This is a very very naive implementation right now. But things are slowly getting clearer to me and analysis on this will make it much clearer. :) With Regards, Kalpit Thakkar On Thu, Jun 18, 2015 at 9:00 PM, Christopher Sean Morrison <brl...@mac.com> wrote: > > On Jun 18, 2015, at 5:35 AM, Kalpit Thakkar <ceasy...@gmail.com> wrote: > > Yes, after sending the previous mail, I considered both, the rtweight and > gqa way, and I realized it's better if I stick with the gqa way. Yes, even > I wouldn't bother about the raytrace direction, and so I can do something > like : *Use a tolerance which keeps in check the difference in volumes > computed after consecutive grid refinements, and the volume is computed > shooting only from a single direction. *For now, I am computing the > volume with a fixed grid spacing and not refining the grid. Once I succeed > in getting a reasonably well working program for that, I'll add the > refinement and tolerance. > > > Also keep in mind that we will likely want to replace the method for > calculating volume at some point in the future, and this should be possible > without changing the API you design. This will be particularly necessary > if you only shoot from a single direction, even with refinement, as that > has proven to be highly unreliable/inaccurate on production models. Too > many surfaces are axis-aligned causing unstable oscillation in the volume > summation. Certainly good enough for a first step here, but the API design > should be sufficiently generic to allow a completely different method. > > Having a way to control the volume “quality” (e.g., via some convergence > tolerance) might be useful for getting an estimate quickly, or the API > could simply document and guarantee a given quality (e.g., volume converges > to at least 0.0005 mm^3 across successive iterations). > > >>>> I see the problem. gqa doesn't simply compute the volume when it >>>> shoots rays through a grid, it collects additional data about gaps, >>>> overlaps, etc. too. However, our goal should be to have well defined >>>> functions in libanalyse which don't compute an arbitrary set of >>>> additional values only because of they are easy to add to the >>>> algorithm. >>>> >>> >>> Yes, I thought so too. I will try to eliminate as much useless >>> calculations as I can. >>> >> > You may want to consider breaking up the calculation into two sets of > routines. One API call that creates “an evaluation context” and is where > you'd actually sample the geometry via rt_shootray(s). Then the different > analysis API calls (volume, centroid, etc.) that would take an evaluation > context and compute their value(s). They could further refine the > evaluation context as needed if you create API up to support this. > > Why do this? It would avoid reshooting the same rays for different types > of calculations, effectively caching previous results in the evaluation > context. So you might create a context and evaluate volume, which maybe > converged after 1M rays. To process a centroid, it would reuse the > partition data stored in the evaluation context. > > A primary consumer of this new API is going to be the ‘analyze’ command > which is supposed to report volume, centroid, and surface area > simultaneously. > > > Should the final implementation in libanalyze be also written in a >>>> single file? Or should it be modular? >>>> >>> > Modular. > > > How are we going to find the surface area of a model using the ray >>>> shooting >>>> > method (I guess rtarea doesn't find the total surface area)? Is there >>>> an >>>> > implementation for it right now? >>>> >>> > Given a set of ray samples and a density factor, this is fairly simple to > estimate. Every hit point is a surface sample, which you can think of as > being small circular patches. As the density increases, the patches get > smaller and the surface area is refined. > > > How exactly do I start designing the public API layout that I have to >>>> put in >>>> > src/libanalyze? (Yes, I guess it is pretty open ended a question. If I >>>> > should come up with a better question, shoot! I’ll come up with one >>>> in some >>>> > time). >>>> >>> > This is a great resource written by someone with a lot of experience in > API design: > http://www4.in.tum.de/~blanchet/api-design.pdf > > > There are some more implementation level questions (like whether to >>>> prefer >>>> > bu_vls over fprintf for printing messages in MGED?). >>>> >>> > The HACKING file speaks to some of these questions, but it’s almost always > preferred to leverage routines in our basic runtime (BU, BN). You > shouldn’t be calling fprintf() … when in doubt, just ask. ;-) > > Cheers! > Sean > > > > > ------------------------------------------------------------------------------ > > _______________________________________________ > BRL-CAD Developer mailing list > brlcad-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/brlcad-devel > >
------------------------------------------------------------------------------
_______________________________________________ BRL-CAD Developer mailing list brlcad-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-devel