All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fastdtw.dtw.window.ParallelogramWindow Maven / Gradle / Ivy

The newest version!
/*
 * ParallelogramWindow.java   Jul 14, 2004
 *
 * Copyright (c) 2004 Stan Salvador
 * [email protected]
 */

package com.fastdtw.dtw.window;

import com.fastdtw.timeseries.TimeSeries;

public final class ParallelogramWindow extends SearchWindow {

    public ParallelogramWindow(TimeSeries tsI, TimeSeries tsJ, int searchRadius) {
        super(tsI.size(), tsJ.size());

        // Find the coordinates of the parallelogram's corners..other than
        // (minI,minJ) and (maxI, maxJ)
        final double upperCornerI = Math.max(maxI() / 2.0 - searchRadius
                * ((double) maxI() / maxJ()), minI());
        final double upperCornerJ = Math.min(maxJ() / 2.0 + searchRadius
                * ((double) maxJ() / maxI()), maxJ());
        final double lowerCornerI = Math.min(maxI() / 2.0 + searchRadius
                * ((double) maxI() / maxJ()), maxI());
        final double lowerCornerJ = Math.max(maxJ() / 2.0 - searchRadius
                * ((double) maxJ() / maxI()), minJ());

        // For each column determine the minimum and maximum row ranges that are
        // in the paralellogram's window.
        for (int i = 0; i < tsI.size(); i++) {
            final int minJ;
            final int maxJ;
            final boolean isIlargest = tsI.size() >= tsJ.size();

            if (i < upperCornerI)// left side of upper line
            {
                if (isIlargest) {
                    final double interpRatio = i / upperCornerI;
                    maxJ = (int) Math.round(interpRatio * upperCornerJ);
                } else {
                    final double interpRatio = (i + 1) / upperCornerI;
                    maxJ = (int) Math.round(interpRatio * upperCornerJ) - 1;
                }
            } else // right side of upper line
            {

                if (isIlargest) {
                    final double interpRatio = (i - upperCornerI) / (maxI() - upperCornerI);
                    maxJ = (int) Math.round(upperCornerJ + interpRatio * (maxJ() - upperCornerJ));
                } else {
                    final double interpRatio = (i + 1 - upperCornerI) / (maxI() - upperCornerI);
                    maxJ = (int) Math.round(upperCornerJ + interpRatio * (maxJ() - upperCornerJ)) - 1;
                }
            }

            if (i <= lowerCornerI)// left side of lower line
            {

                final double interpRatio = i / lowerCornerI;
                minJ = (int) Math.round(interpRatio * lowerCornerJ);
            } else // right side of lower line
            {

                final double interpRatio = (i - lowerCornerI) / (maxI() - lowerCornerI);
                minJ = (int) Math.round(lowerCornerJ + interpRatio * (maxJ() - lowerCornerJ));
            }

            super.markVisited(i, minJ);
            super.markVisited(i, maxJ);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy