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

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

package rec.meche;

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

public class CamRecognizer //extends Recognizer
{
//    public static WMCam isCam( WCircle c1, WCircle c2, WLine l1, WLine l2 )
//    {
//      GSegment s1 = l1.getLine();
//      GSegment s2 = l2.getLine();

//      if( !Estimator.arePerpendicular( s1, s2 ) )
//        return( null );

//      if( Estimator.isSameSize( c1.size(), s1.size() )
//  	&& Estimator.isSameSize( c1.size(), s2.size() ) ) {

//        if( !( Geometry.distance( c1.getCenter(), s1.getMidpoint() ) <= 5.0
//  	     && Geometry.distance( c1.getCenter(), s2.getMidpoint() ) <= 5.0 ) )
//  	return( null );

//        if( !( c2.getRadius()
//  	     > c1.getRadius() + Geometry.distance( c1.getCenter(),
//  						   c2.getCenter() ) ) )
//  	return( null );

//        return( new WMCam( c2.getCenter(), 0.0, c2.size(), null ) );
//      }

//      if( Estimator.isSameSize( c2.size(), l1.size() )
//  	&& Estimator.isSameSize( c2.size(), l2.size() ) ) {

//        if( !( Geometry.distance( c2.getCenter(), s1.getMidpoint() ) <= 5.0
//  	     && Geometry.distance( c2.getCenter(), s2.getMidpoint() ) <= 5.0 ) )
//  	return( null );

//        if( !( c1.getRadius()
//  	     > c2.getRadius() + Geometry.distance( c2.getCenter(),
//  						   c1.getCenter() ) ) )
//  	return( null );

//        return( new WMCam( c1.getCenter(), 0.0, c1.size(), null ) );
//      }

//      return( null );
//    }

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

//    public CamRecognizer()
//    {
//    }

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

//    public boolean recognize( Surface s, Widget w )
//    {
//      GeometryCalculator gc = new GeometryCalculator( s );

//      Vector vect = gc.getWidgetsVector();

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

//      if( w instanceof WCircle ) {

//        WCircle c = (WCircle)w;

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

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

//  	if( vw1 instanceof WCircle && !vw1.equals( c ) ) {

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

//  	    Widget vw2 = (Widget)vect.elementAt( j );
	      
//  	    if( vw2 instanceof WLine ) {

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

//  		Widget vw3 = (Widget)vect.elementAt( k );

//  		if( vw3 instanceof WLine && !vw3.equals( vw2 ) ) {

//  		  WMCam part = isCam( c, (WCircle)vw1,
//  				      (WLine)vw2, (WLine)vw3 );

//  		  if( part != null ) {

//  		    s.removeWidget( c );
//  		    s.removeWidget( vw1 );
//  		    s.removeWidget( vw2 );
//  		    s.removeWidget( vw3 );

//  		    s.addWidget( part );

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

//      if( w instanceof WLine ) {

//        WLine l = (WLine)w;

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

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

//  	if( vw1 instanceof WLine && !vw1.equals( l ) ) {

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

//  	    Widget vw2 = (Widget)vect.elementAt( j );
	      
//  	    if( vw2 instanceof WCircle ) {

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

//  		Widget vw3 = (Widget)vect.elementAt( k );

//  		if( vw3 instanceof WCircle && !vw3.equals( vw2 ) ) {

//  		  WMCam part = isCam( (WCircle)vw2, (WCircle)vw3,
//  				      l, (WLine)vw1 );

//  		  if( part != null ) {

//  		    s.removeWidget( l );
//  		    s.removeWidget( vw1 );
//  		    s.removeWidget( vw2 );
//  		    s.removeWidget( vw3 );

//  		    s.addWidget( part );

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

//      return( false );
//    }

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

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

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

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

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

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

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

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