/************************************************************************ ** ** FILE : celltra.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "celltra.h" #include "tra.h" #include "cell.H" #include "cell.h" #include /************************************************************************* ** FUNKTION: CellTraLookFor ** ZWECK: Schaut in Cell nach, ob in dieser Gegend Platz fuer ** eine Trans frei ist. ** INPUT: Mittelpunktkoordinaten der Trans ** Falls Trans bereits eingezeichnet, dann kann mit TNr ** die Nr der Trans angegeben werden. Trans und Transnname ** werden dann ignoriert. Das ist dann sinnvoll, falls eine ** bereits existierende Trans verschoben werden soll. ** OUTPUT: char = CE_OK oder den Typ des Objekts, das im Weg ist *************************************************************************/ #define LookAbs( x, y) if (Cell[ x][ y]) return (Cell[ x][ y]->typ) #define LookRel( x, y) \ if ((p = Cell[ x][ y])) \ do \ if ( (p->Nr1 == TNr) && \ ( (p->typ == CE_TRANSITION) || (p->typ == CE_TRANS_NAME) ) )\ p = p->next; \ else \ return (p->typ); \ while (p) char CellTraLookFor( TNr, mx, my, darst) int TNr; int mx, my; char darst; { OBJECT *p; register int x = CellXKoord( mx); register int y = CellYKoord( my); int cX1, cY1, cX2, cY2; if (TNr == CE_NOTHING) switch (darst) { case TRA_0: cY1 = y - CE_TRA_RAD; cY2 = y + CE_TRA_RAD; for ( y=cY1; y <= cY2; y++) LookAbs( x, y); break; case TRA_1: cX1 = x - CE_TRA_DIA; cY1 = y + CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y--) LookAbs( x, y); break; case TRA_3: cX1 = x - CE_TRA_RAD; cX2 = x + CE_TRA_RAD; for ( x=cX1; x <= cX2; x++) LookAbs( x, y); break; case TRA_5: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y++) LookAbs( x, y); break; case TRA_QUAD: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; cY2 = y + CE_TRA_DIA; for (x=cX1; x <= cX2; x++) for (y=cY1; y <= cY2; y++) LookAbs( x, y); break; } else switch (darst) { case TRA_0: cY1 = y - CE_TRA_RAD; cY2 = y + CE_TRA_RAD; for ( y=cY1; y <= cY2; y++) LookRel( x, y); break; case TRA_1: cX1 = x - CE_TRA_DIA; cY1 = y + CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y--) LookRel( x, y); break; case TRA_3: cX1 = x - CE_TRA_RAD; cX2 = x + CE_TRA_RAD; for ( x=cX1; x <= cX2; x++) LookRel( x, y); break; case TRA_5: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y++) LookRel( x, y); break; case TRA_QUAD: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; cY2 = y + CE_TRA_DIA; for (x=cX1; x <= cX2; x++) for (y=cY1; y <= cY2; y++) LookRel( x, y); break; } return (CE_OK); } /************************************************************************* ** FUNKTION: CellTraEin ** ZWECK: Traegt Trans in Cell ein. ** INPUT: Transnnummer und Mittelpunkt in Plane-Koordinaten ** OUTPUT: - ** ANMERK: - allokiere ein Original TRANSITION ** - verweise leere Cellen auf Original TRANSITION ** - nichtleere Cellen: ** - allokiere Original ANDERES_OBJEKT ** - verweise bish. letztes Element auf Original ANDERES_OBJEKT ** - verweise Nachfolgeelement auf Original TRANSITION *************************************************************************/ #define Ein( x, y) if ( !(Cell[ x][ y]) ) \ Cell[ x][ y] = O; \ else \ CellObjEin( &(Cell[ x][ y]), O) void CellTraEin( TNr, mx, my, darst) int TNr; int mx, my; char darst; { register int x = CellXKoord( mx); register int y = CellYKoord( my); int cX1, cY1, cX2, cY2; OBJECT *O; O = TraTrans[ TNr]->OrgTra; switch (darst) { case TRA_0: cY1 = y - CE_TRA_RAD; cY2 = y + CE_TRA_RAD; for ( y=cY1; y <= cY2; y++) Ein( x, y); break; case TRA_1: cX1 = x - CE_TRA_DIA; cY1 = y + CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y--) Ein( x, y); break; case TRA_3: cX1 = x - CE_TRA_RAD; cX2 = x + CE_TRA_RAD; for ( x=cX1; x <= cX2; x++) Ein( x, y); break; case TRA_5: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y++) Ein( x, y); break; case TRA_QUAD: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; cY2 = y + CE_TRA_DIA; for (x=cX1; x <= cX2; x++) for (y=cY1; y <= cY2; y++) Ein( x, y); break; } } /************************************************************************* ** FUNKTION: CellTraRemove ** ZWECK: ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void CellTraRemove( TNr) int TNr; { register int x = CellXKoord( TraTrans[ TNr]->PosTrans.x); register int y = CellYKoord( TraTrans[ TNr]->PosTrans.y); int cX1, cY1, cX2, cY2; char darst = TraTrans[ TNr]->Darstellung; switch (darst) { case TRA_0: cY1 = y - CE_TRA_RAD; cY2 = y + CE_TRA_RAD; for ( y=cY1; y <= cY2; y++) CellObjDel( &(Cell[ x][ y]), CE_TRANSITION, TNr); break; case TRA_1: cX1 = x - CE_TRA_DIA; cY1 = y + CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y--) CellObjDel( &(Cell[ x][ y]), CE_TRANSITION, TNr); break; case TRA_3: cX1 = x - CE_TRA_RAD; cX2 = x + CE_TRA_RAD; for ( x=cX1; x <= cX2; x++) CellObjDel( &(Cell[ x][ y]), CE_TRANSITION, TNr); break; case TRA_5: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; for ( x=cX1, y=cY1; x <= cX2; x++, y++) CellObjDel( &(Cell[ x][ y]), CE_TRANSITION, TNr); break; case TRA_QUAD: cX1 = x - CE_TRA_DIA; cY1 = y - CE_TRA_DIA; cX2 = x + CE_TRA_DIA; cY2 = y + CE_TRA_DIA; for (x=cX1; x <= cX2; x++) for (y=cY1; y <= cY2; y++) CellObjDel( &(Cell[ x][ y]), CE_TRANSITION, TNr); break; } }