// (c) MIT 2003.  All rights reserved.

////////////////////////////////////////////////////////////////////////////////
//
// FILE:	ChainRecognizer.java
//
// AUTHOR:	Manoj D. Muzumdar
//		archon@ai.mit.edu
//
// DATE:	April 99
//
// COPYRIGHT:	Massachusetts Institute of Technology
//		All rights reserved.
//
// PURPOSE:	Chain recognition
//
// HISTORY:     April 99  archon  created
//
////////////////////////////////////////////////////////////////////////////////

package rec.meche;

import java.util.*;
import rec.geo.*;
import rec.sys.*;
import rec.core.widgets.*;

public class ChainRecognizer //extends Recognizer
{
//    public static WMChain isChain( WMBelt belt, WCircle c1, WCircle c2 )
//    {
//      // Make sure the circles are kind of small.

//      if( c1.size() > 40.0 || c2.size() > 40.0 )
//        return( null );

//      boolean isNull1 = true;
//      boolean isNull2 = true;

//      GShape[] shapes = belt.getComponents();

//      for( int i = 0; i < shapes.length; ++i ) {

//        GSegment s = (GSegment)shapes[i];

//        if( isNull1 && s.includes( c1.getCenter(), 15.0 ) )
//  	isNull1 = false;

//        if( isNull2 && s.includes( c2.getCenter(), 15.0 ) )
//  	isNull2 = false;
//      }

//      if( isNull1 || isNull2 )
//        return( null );

//      // Should be chain.

//      return( new WMChain( belt ) );
//    }

//    //////////////////////////////////////////////////////////////////////////////

//    public ChainRecognizer()
//    {
//    }

//    //////////////////////////////////////////////////////////////////////////////

//    public boolean recognize( Surface s, Widget w )
//    {
//      // Must trigger on a circle i.e. the belt must already be on the surface.

//      GeometryCalculator gc = new GeometryCalculator( s );

//      Vector vect = gc.getWidgetsVector();

//      if( vect.size() < 3 )
//        return( false );

//      if( w instanceof WCircle ) {

//        WCircle c1 = (WCircle)w;

//        for( int i = 0; i < vect.size(); ++i ) {

//  	Widget vw1 = (Widget)vect.elementAt( i );

//  	if( vw1 instanceof WMBelt ) {

//  	  for( int j = 0; j < vect.size(); ++j ) {

//  	    Widget vw2 = (Widget)vect.elementAt( j );
	      
//  	    if( vw2 instanceof WCircle && !vw2.equals( c1 ) ) {

//  	      WMChain part = isChain( (WMBelt)vw1, c1, (WCircle)vw2 );

//  	      if( part != null ) {

//  		s.removeWidget( c1 );
//  		s.removeWidget( vw1 );
//  		s.removeWidget( vw2 );

//  		s.addWidget( part );

//  		return( true );
//  	      }
//  	    }
//  	  }
//  	}
//        }
//      }

//      return( false );
//    }

//    //////////////////////////////////////////////////////////////////////////////

//    public Iterator getInputTypes()
//    {
//      Vector v = new Vector();

//      v.addElement( "rec.core.widgets.WCircle" );

//      return( v.iterator() );
//    }

//    public Iterator getOutputTypes()
//    {
//      Vector v = new Vector();

//      v.addElement( "rec.meche.WMChain" );

//      return( v.iterator() );
//    } 
}

////////////////////////////////////////////////////////////////////////////////
