/*****************************************************************************
#   Copyright (C) 1994-2008 by David Gordon.
#   All rights reserved.                           
#                                                                           
#   This software is part of a beta-test version of the Consed/Autofinish
#   package.  It should not be redistributed or
#   used for any commercial purpose, including commercially funded
#   sequencing, without written permission from the author and the
#   University of Washington.
#   
#   This software is provided ``AS IS'' and any express or implied
#   warranties, including, but not limited to, the implied warranties of
#   merchantability and fitness for a particular purpose, are disclaimed.
#   In no event shall the authors or the University of Washington be
#   liable for any direct, indirect, incidental, special, exemplary, or
#   consequential damages (including, but not limited to, procurement of
#   substitute goods or services; loss of use, data, or profits; or
#   business interruption) however caused and on any theory of liability,
#   whether in contract, strict liability, or tort (including negligence
#   or otherwise) arising in any way out of the use of this software, even
#   if advised of the possibility of such damage.
#
#   Building Consed from source is error prone and not simple which is
#   why I provide executables.  Due to time limitations I cannot
#   provide any assistance in building Consed.  Even if you do not
#   modify the source, you may introduce errors due to using a
#   different version of the compiler, a different version of motif,
#   different versions of other libraries than I used, etc.  For this
#   reason, if you discover Consed bugs, I can only offer help with
#   those bugs if you first reproduce those bugs with an executable
#   provided by me--not an executable you have built.
# 
#   Modifying Consed is also difficult.  Although Consed is modular,
#   some modules are used by many other modules.  Thus making a change
#   in one place can have unforeseen effects on many other features.
#   It may takes months for you to notice these other side-effects
#   which may not seen connected at all.  It is not feasable for me to
#   provide help with modifying Consed sources because of the
#   potentially huge amount of time involved.
#
#*****************************************************************************/
#include    "fwdRevPairTriangle.h"
#include    "arrayOfFwdRevPairTriangles.h"
#include    "assemblyView.h"
#include    "abs.h"
#include    "locatedFragment.h"

void arrayOfFwdRevPairTriangles :: markCoincidentItems( 
                                assemblyView* pAssemblyView ) {

      for( int nTriangle = 1; nTriangle < entries(); ++nTriangle ) {
         fwdRevPairTriangle* pFwdRevPair1 = operator[]( nTriangle - 1 );
         fwdRevPairTriangle* pFwdRevPair2 = operator[]( nTriangle );

         if ( ABS( pFwdRevPair1->xpoints_[0].x - pFwdRevPair2->xpoints_[0].x )
              <= 10 &&
              ABS( pFwdRevPair1->xpoints_[1].x - pFwdRevPair2->xpoints_[1].x )
              <= 10 &&
              ABS( pFwdRevPair1->xpoints_[2].x - pFwdRevPair2->xpoints_[2].x )
              <= 10 &&
              ABS( pFwdRevPair1->xpoints_[0].y - pFwdRevPair2->xpoints_[0].y )
              <= 10 &&
              ABS( pFwdRevPair1->xpoints_[1].y - pFwdRevPair2->xpoints_[1].y )
              <= 10 &&
              ABS( pFwdRevPair1->xpoints_[2].y - pFwdRevPair2->xpoints_[2].y )
              <= 10 ) {

            // if the lines are very slanted, then this is sufficient to
            // make them unable to be seen.  Otherwise they must be closer 
            // together.

            float fSlope;
            float fDen = (float) pFwdRevPair1->xpoints_[1].x -
               (float) pFwdRevPair1->xpoints_[0].x;

            if ( fDen == 0.0 ) {
               fSlope = 666666;
            }
            else {
               fSlope = ( (float) pFwdRevPair1->xpoints_[1].y - 
                          (float) pFwdRevPair1->xpoints_[0].y ) / fDen;
            }

            bool bMakePurple = false;
            if ( fSlope < 0.2 )
               bMakePurple = true;
            else {
               if ( ABS( pFwdRevPair1->xpoints_[0].x - pFwdRevPair2->xpoints_[0].x )
                    <= 3 &&
                    ABS( pFwdRevPair1->xpoints_[1].x - pFwdRevPair2->xpoints_[1].x )
                    <= 3 &&
                    ABS( pFwdRevPair1->xpoints_[2].x - pFwdRevPair2->xpoints_[2].x )
                    <= 3 &&
                    ABS( pFwdRevPair1->xpoints_[0].y - pFwdRevPair2->xpoints_[0].y )
                    <= 3 &&
                    ABS( pFwdRevPair1->xpoints_[1].y - pFwdRevPair2->xpoints_[1].y )
                    <= 3 &&
                    ABS( pFwdRevPair1->xpoints_[2].y - pFwdRevPair2->xpoints_[2].y )
                    <= 3 ) {
                  bMakePurple = true;
               }
            }

            if ( bMakePurple ) {
               pFwdRevPair1->pGctToUse_ = pAssemblyView->pGctMultipleItemsOnTopOfEachOther_;
               pFwdRevPair2->pGctToUse_ = pAssemblyView->pGctMultipleItemsOnTopOfEachOther_;
            }
         }
      }
} // markCoincidentItems