import java.util.*; import java.awt.*; import java.io.*; public class Interaction extends Edge { float a1; float a2; float b1 ; boolean vertical = false ; int _type ; public Interaction( Blackboard b, Node f, Node t, int type ) { super( b, f, t ); _type = type ; } public float calcCoefDir (int X1, int Y1, int X2, int Y2) { float a; if ((X1-X2) != 0) { a = (float)(Y1-Y2) / (float)(X1-X2); vertical = false ; } else { a = 0; vertical = true; } return a; } public float calcConst (int X, int Y, float a) { float b; if (! vertical) { b = (float)Y - a * (float)X ; } else { b = 0; } return b; } public double calcCx(double a, double b, int w, int h) { double Cx ; if ((_to.X() > _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_to.X(), _to.Y(), _to.X() - w/2, _to.Y() - h/2 ) ; if (a1 > a2) { Cx = (_to.Y() - h/2 - b) / a1 ; } else { Cx = _to.X() - w/2 ; } } else if ((_to.X() > _from.X()) && (_to.Y() < _from.Y())) { a2 = calcCoefDir(_to.X(), _to.Y(), _to.X()- w/2 , _to.Y() + h/2 ) ; if (a1 < a2) { Cx = (_to.Y() + h/2 - b) / a1 ; } else { Cx = _to.X() - w/2 ; } } else if ((_to.X() < _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_to.X(), _to.Y(), _to.X() + w/2 , _to.Y() - h/2 ) ; if (a1 < a2) { Cx = (_to.Y() - h/2 - b) / a1 ; } else { Cx = _to.X() + w/2 ; } } else { // ((_to.X() < _from.X()) && (_to.Y() < _from.Y())) a2 = calcCoefDir(_to.X(), _to.Y(), _to.X() + w/2, _to.Y() + h/2 ) ; if (a1 >= a2) { Cx = (_to.Y() + h/2 - b) / a1 ; } else { Cx = _to.X() + w/2 ; } } return Cx + 0.5 ; } public double calcCy(double a, double b, int w, int h) { double Cy ; if ((_to.X() > _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_to.X(), _to.Y(), _to.X() - w/2, _to.Y() - h/2 ) ; if (a1 > a2) { Cy = _to.Y() - h/2 ; } else { Cy = (_to.X() - w/2) * a1 + b ; } } else if ((_to.X() > _from.X()) && (_to.Y() < _from.Y())) { a2 = calcCoefDir(_to.X(), _to.Y(), _to.X() - w/2, _to.Y() + h/2 ) ; if (a1 < a2) { Cy = _to.Y() + h/2 ; } else { Cy = (_to.X() - w/2) * a1 + b ; } } else if ((_to.X() < _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_to.X(), _to.Y(), _to.X() + w/2, _to.Y() - h/2 ) ; if (a1 < a2) { Cy = _to.Y() - h/2 ; } else { Cy = (_to.X() + w/2) * a1 + b ; } } else { // ((_to.X() < _from.X()) && (_to.Y() < _from.Y())) a2 = calcCoefDir(_to.X(), _to.Y(), _to.X() + w/2, _to.Y() + h/2 ) ; if (a1 > a2) { Cy = _to.Y() + h/2 ; } else { Cy = (_to.X() + w/2) * a1 + b ; } } return Cy + 0.5 ; } public double calcFromX(double a, double b, int w, int h) { double Cx ; if ((_to.X() > _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() + w/2, _from.Y() + h/2 ) ; if (a1 > a2) { Cx = (_from.Y() + h/2 - b) / a1 ; } else { Cx = _from.X() + w/2 ; } } else if ((_to.X() > _from.X()) && (_to.Y() < _from.Y())) { a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() + w/2 , _from.Y() - h/2 ) ; if (a1 < a2) { Cx = (_from.Y() - h/2 - b) / a1 ; } else { Cx = _from.X() + w/2 ; } } else if ((_to.X() < _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() - w/2 , _from.Y() + h/2 ) ; if (a1 < a2) { Cx = (_from.Y() + h/2 - b) / a1 ; } else { Cx = _from.X() - w/2 ; } } else { // ((_to.X() < _from.X()) && (_to.Y() < _from.Y())) a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() - w/2, _from.Y() - h/2 ) ; if (a1 >= a2) { Cx = (_from.Y() - h/2 - b) / a1 ; } else { Cx = _from.X() - w/2 ; } } return Cx + 0.5 ; } public double calcFromY(double a, double b, int w, int h) { double Cy ; if ((_to.X() > _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() + w/2, _from.Y() + h/2 ) ; if (a1 > a2) { Cy = _from.Y() + h/2 ; } else { Cy = (_from.X() + w/2) * a1 + b ; } } else if ((_to.X() > _from.X()) && (_to.Y() < _from.Y())) { a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() + w/2, _from.Y() - h/2 ) ; if (a1 < a2) { Cy = _from.Y() - h/2 ; } else { Cy = (_from.X() + w/2) * a1 + b ; } } else if ((_to.X() < _from.X()) && (_to.Y() > _from.Y())) { a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() - w/2, _from.Y() + h/2 ) ; if (a1 < a2) { Cy = _from.Y() + h/2 ; } else { Cy = (_from.X() - w/2) * a1 + b ; } } else { // ((_to.X() < _from.X()) && (_to.Y() < _from.Y())) a2 = calcCoefDir(_from.X(), _from.Y(), _from.X() - w/2, _from.Y() - h/2 ) ; if (a1 > a2) { Cy = _from.Y() - h/2 ; } else { Cy = (_from.X() - w/2) * a1 + b ; } } return Cy + 0.5 ; } public void paint(Graphics g) { double cx; double cy; double cxFrom; double cyFrom; int decal = 6 ; if (_dir == -1 ) swapDir(); int w_to = _to.boundingWidth() + decal; int h_to = _to.boundingHeight() + decal; int w_from = _from.boundingWidth() + decal; int h_from = _from.boundingHeight() + decal; a1 = calcCoefDir(_to.X(), _to.Y(), _from.X(), _from.Y()) ; b1 = calcConst(_to.X(), _to.Y(), a1) ; int dX = _to.X()-_from.X(); int dY = _to.Y()-_from.Y(); double len = Math.sqrt( dX*dX + dY*dY ); double ndx = arrowSize*dX/len; double ndy = arrowSize*dY/len; if ( (_to.X() != _from.X()) && (_to.Y() != _from.Y()) ) { cx = calcCx(a1,b1,w_to,h_to) ; cy = calcCy(a1,b1,w_to,h_to) ; cxFrom = calcFromX(a1,b1,w_from,h_from); cyFrom = calcFromY(a1,b1,w_from,h_from); } else if ( (_to.X() == _from.X()) && (_to.Y() != _from.Y()) ){ cx = _to.X() ; cxFrom = _to.X() ; if (_to.Y() > _from.Y()) { cy = _to.Y() - h_to/2 ; cyFrom = _from.Y() + h_from/2 ; } else { cy = _to.Y() + h_to/2 ; cyFrom = _from.Y() - h_from/2 ; } } else { if (_to.X() > _from.X()) { cx = _to.X() - w_to/2 ; cxFrom = _from.X() + w_from/2 ; } else { cx = _to.X() + w_to/2 ; cxFrom = _from.X() - w_from/2 ; } cy = _to.Y() ; cyFrom = _to.Y() ; } g.setColor( edgeColor ); g.drawLine( (int)cxFrom , (int)cyFrom , (int)cx , (int)cy ); if (_type == 1) { // activation g.drawLine( (int)cx , (int)cy , (int)(cx + ndy - ndx), (int)(cy - ndx -ndy) ); g.drawLine( (int)cx , (int)cy , (int)(cx - ndy - ndx), (int)(cy + ndx -ndy ) ); } else if (_type == -1) { // inhibition g.drawLine( (int)cx , (int)cy , (int)(cx - ndy), (int)(cy + ndx) ); g.drawLine( (int)cx , (int)cy , (int)(cx + ndy), (int)(cy - ndx ) ); } else { // activation et inhibition g.drawLine( (int)cx , (int)cy , (int)(cx + ndy - ndx), (int)(cy - ndx -ndy) ); g.drawLine( (int)cx , (int)cy , (int)(cx - ndy - ndx), (int)(cy + ndx -ndy ) ); g.drawLine( (int)cx , (int)cy , (int)(cx - ndy), (int)(cy + ndx) ); g.drawLine( (int)cx , (int)cy , (int)(cx + ndy), (int)(cy - ndx ) ); } if (_dir == -1 ) swapDir(); } } // class Interaction