protected static PointList alignPointsAndAverage(List<PointList> shapes, PointList reference, double referenceScaling, Point2d referenceCog) { ProcrustesAnalysis pa = new ProcrustesAnalysis(reference); for (PointList shape : shapes) { pa.align(shape); } PointList mean = PointList.computeMean(shapes); //normalise translation to reference Point2d cog = mean.calculateCentroid(); Matrix trans = TransformUtilities.translateToPointMatrix(cog, referenceCog); mean.translate((float)trans.get(0,2), (float)trans.get(1,2)); //normalise scaling to reference double scale = ProcrustesAnalysis.computeScale(mean, referenceCog.getX(), referenceCog.getY()); float sf = (float)(scale / referenceScaling); mean.scale(referenceCog, sf); return mean; }