Hello. Le ven. 15 nov. 2019 à 15:34, Matt Juntunen <matt.juntu...@hotmail.com> a écrit : > > Hi all, > > I'm attempting to wrap up the refactoring work I've been doing with > GEOMETRY-32 but I've hit a snag with the code for computing barycenters in 2D > spherical space. The results I'm getting seem mostly reasonable but they > aren't as consistent as I'd like, which makes me wonder if I'm doing > something wrong or if I've made an invalid assumption somewhere. The previous > barycenter code was not really unit tested so I don't have much to compare to.
What does the CM code produce? Gilles > > Here is what I have currently for computing the barycenter of convex regions > with 3 or more sides: > - Split the region into a series of triangles using a triangle fan approach > (eg, if the boundary points are p0, p1, p2, p3, split the region into the > triangles p0, p1, p2 and p0, p2, p3) > - Compute the area of each triangle by calculating the interior angles A, B, > C and using Girard's Theorem (area = A + B + C - pi) > - Compute the barycenter of each triangle using the formula for the center of > mass found on the first page of the article here [1]. This is done by > multiplying the pole of each side's great circle by its arc length and > summing the result vectors. The sum vector is normalized to place it on the > surface of the unit sphere. (This is the approach used in the previous code > for the barycenter [2]) > - Compute the overall barycenter for the region by scaling each triangle > barycenter vector by the triangle area, adding the results, and normalizing. > > As mentioned above, this seems to produce mostly reasonable results. The > issue I'm having is with verifying their consistency. In my unit tests, I'm > doing the following to check the barycenters: > - Compute a number of great circles that pass through the region barycenter > - Use each circle to split the area into two smaller convex regions - a plus > and a minus region > - Compute the barycenters and areas for the plus and minus regions using the > same logic as the larger region > - Combine the two barycenters by scaling their vectors by the region's area, > summing, and normalizing > - Verify that the barycenter computed from the split parts matches the one > computed for the region as a whole > > This basically checks that the region is the sum of its parts in terms of > barycenter. However, I'm finding that the barycenter computed from the split > regions is always slightly off from the overall region barycenter, generally > by a margin of between 0.001 to 0.01 radians in both azimuth and polar. So, > I'm wondering if this is a math issue, a floating point issue, or something > else. > > Any insight would be greatly appreciated. My code can be found here [3] and > here [4], although I haven't yet pushed the changes for the full algorithm I > outlined above. > > Regards, > Matt J > > > [1] > https://asmedigitalcollection.asme.org/appliedmechanics/article/42/1/239/387501/The-Inertia-Tensor-for-a-Spherical-Triangle > [2] > https://github.com/darkma773r/commons-geometry/blob/master/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/twod/PropertiesComputer.java#L135 > [3] > https://github.com/darkma773r/commons-geometry/blob/geometry-32-working/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/twod/ConvexArea2S.java > [4] > https://github.com/darkma773r/commons-geometry/blob/geometry-32-working/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java#L188 --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org