Commit 8b3f663f authored by Jakub Kolman's avatar Jakub Kolman
Browse files

[#38] documentation

parent 4dd01a3f
Loading
Loading
Loading
Loading
+26 −17
Original line number Diff line number Diff line
@@ -57,6 +57,15 @@ public class ProcrustesAnalysis {
        this.modelCentroid2 = ProcrustesAnalysisUtils.findCentroidOfFeaturePoints(model2.getFeaturePointValues());
    }

    /**
     * Constructor with variable for scaling option.
     * Default scale option is set to false.
     *
     * @param humanFace1
     * @param humanFace2
     * @param scale
     * @throws ProcrustesAnalysisException
     */
    public ProcrustesAnalysis(
            HumanFace humanFace1,
            HumanFace humanFace2,
@@ -180,11 +189,6 @@ public class ProcrustesAnalysis {
     * @return ratioValue
     */
    private double calculateScalingValue(List<FeaturePoint> featurePointList1, List<FeaturePoint> featurePointList2) {
//        double[] distancesOfList1 = ProcrustesAnalysisUtils.calculateMeanDistancesFromOrigin(
//                featurePointList1);
//        double[] distancesOfList2 = ProcrustesAnalysisUtils.calculateMeanDistancesFromOrigin(
//                featurePointList2);

        double[] distancesOfList1 = new double[featurePointList1.size()];
        double[] distancesOfList2 = new double[featurePointList2.size()];

@@ -193,17 +197,13 @@ public class ProcrustesAnalysis {
        Point3d featurePointCentroid2 = ProcrustesAnalysisUtils.findCentroidOfFeaturePoints(
                featurePointList2);

        Point3d centroid = ProcrustesAnalysisUtils.getMidPoint(
                featurePointCentroid1, featurePointCentroid2);
//        Point3d centroid = ProcrustesAnalysisUtils.getMidPoint(
//                featurePointCentroid1, featurePointCentroid2);

        for (int i = 0; i < featurePointList1.size(); i++) {
            distancesOfList1[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList1.get(i), centroid);
            distancesOfList2[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList2.get(i), centroid);
            distancesOfList1[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList1.get(i), featurePointCentroid1);
            distancesOfList2[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList2.get(i), featurePointCentroid2);
        }
//        distancesOfList1 = ProcrustesAnalysisUtils.calculateDistanceOfTwoPoints(
//                featurePointList1);
//        distancesOfList2 = ProcrustesAnalysisUtils.calculateDistanceOfTwoPoints(
//                featurePointList2);

        double[] ratioArray = new double[distancesOfList1.length];
        double ratioValue = 0;
@@ -211,21 +211,30 @@ public class ProcrustesAnalysis {
        for (int i = 0; i < distancesOfList1.length; i++) {
            ratioArray[i] += distancesOfList1[i] / distancesOfList2[i];
        }

        for (int i = 0; i < ratioArray.length; i++) {
            ratioValue += ratioArray[i];
        }

        return ratioValue / distancesOfList1.length;
    }

    /**
     * Initiates scaling of feature points and vertices of given face model by scaleFactor.
     *
     * @param faceModel
     * @param scaleFactor
     */
    private void scaleFace(ProcrustesAnalysisFaceModel faceModel, double scaleFactor) {

        calculateScaledList(faceModel.getVertices(), scaleFactor);
        calculateScaledList(faceModel.getFeaturePointValues(), scaleFactor);

    }

    /**
     * Scales each given point from list by multiplying its position coordinates with scaleFactor.
     *
     * @param list
     * @param scaleFactor
     * @param <T> either MeshPoint or FeaturePoint type.
     */
    private <T extends IPosition> void calculateScaledList(List<T> list, double scaleFactor) {
        List<T> scaledList = new ArrayList<>();
        for (T point : list) {
+1 −1
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ public class ProcrustesAnalysisComparison {
        FileResourcesUtils fru = new FileResourcesUtils();
        HumanFaceFactory factory = new HumanFaceFactory();
        FeaturePointImportService featurePointImportService = new FeaturePointImportService();
        FeaturePointExportService featurePointExportService = new FeaturePointExportService();

//        System.out.println("Working Directory = " + System.getProperty("user.dir"));

@@ -80,7 +81,6 @@ public class ProcrustesAnalysisComparison {
//                FP_FILE_DIRECTORY.toString(), "3points_head02head01.fp");
//        List<FeaturePoint> fpList02 = featurePointImportService.importFeaturePoints(
//                FP_FILE_DIRECTORY.toString(), "3points_ultramini_head02.fp");
//        FeaturePointExportService featurePointExportService = new FeaturePointExportService();
//        featurePointExportService.exportFeaturePoints(fpList01, "head01", "CSV");
//        featurePointExportService.exportFeaturePoints(fpList02, "3points_ultramini_head02", "CSV");

+16 −2
Original line number Diff line number Diff line
@@ -2,11 +2,10 @@ package cz.fidentis.analyst.procrustes.utils;

import cz.fidentis.analyst.feature.FeaturePoint;
import cz.fidentis.analyst.feature.api.IPosition;
import cz.fidentis.analyst.mesh.core.MeshPoint;
import cz.fidentis.analyst.procrustes.ProcrustesAnalysisFaceModel;
import org.ejml.simple.SimpleMatrix;

import javax.vecmath.Point3d;
import java.awt.*;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -144,6 +143,14 @@ public class ProcrustesAnalysisUtils {
    }


    /**
     * Scales position of given point by multiplying its coordinates with given scaleFactor.
     *
     * @param point
     * @param scaleFactor
     * @param <T>
     * @return
     */
    public static <T extends IPosition> T scalePointDistance(T point, double scaleFactor) {
        point.getPosition().x = point.getX() * scaleFactor;
        point.getPosition().y = point.getY() * scaleFactor;
@@ -165,6 +172,13 @@ public class ProcrustesAnalysisUtils {
                        + (Math.pow(fp1.getZ()- point.z, 2)));
    }

    /**
     * Gets point that is in middle between two given points.
     *
     * @param point1
     * @param point2
     * @return
     */
    public static Point3d getMidPoint(Point3d point1, Point3d point2) {
        return new Point3d(((point1.x + point2.x) / 2),  ((point1.y + point2.y) / 2), ((point1.z + point2.z) / 2));
    }
+11 −0
Original line number Diff line number Diff line
@@ -259,6 +259,7 @@ public class RegistrationAction extends ControlPanelAction {
                break;
            case RegistrationPanel.ACTION_COMMAND_PROCRUSTES_SCALING:
                this.procrustesScalingEnabled = !this.procrustesScalingEnabled;
                Logger.print("Procrustes: scaling enabled is " + this.procrustesScalingEnabled);
                break;
            default:
            // to nothing
@@ -267,6 +268,16 @@ public class RegistrationAction extends ControlPanelAction {
        renderScene();
    }

    /**
     * Calculates Procrustes analysis.
     * 
     * First it creates object of type ProcrusteAnalasys containing two face models converted
     * to ProcrustesAnalysisFaceModel objects which are required for next analysis step.
     * 
     * In analysis step faces are superimposed and rotated.
     * 
     * If {@see this.procrustesScalingEnabled} is set to true then one of them is scaled as well.
     */
    protected void initiateProcrustesAnalysis() {
        Logger.print("Procrustes Analysis");
        Logger out = Logger.measureTime();