/************************************************************************ ** ** FILE : hakaclip.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "hakaclip.h" #include "misc.h" #include "netsize.h" #include "haka.H" #include #include "ste.h" #include "tra.h" #include "celltype.h" #define ABSTAND 5 /************************************************************************* ** FUNKTION: HaKaClip ** ZWECK: ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void HaKaClip( Typ, Nr, x, y, erg) char Typ; int Nr; int x, y; KOORDINATE *erg; { int mx, my; int dx, dy; double rx, ry; int r; if (Typ == CE_STELLE) { mx = SteStelle[ Nr]->PosStelle.x; /* Mittelpunkt absolut */ my = SteStelle[ Nr]->PosStelle.y; r = HA_STE_RAD + ABSTAND; /* Radius */ if (my != y) { dx = x-mx; /* Zielpunkt relativ */ dy = y-my; ry = r*dy/sqrt(dx*dx+dy*dy); if (dx<0) ry = -ry; rx = ry*dx/dy; erg->x = (dx<0) ? mx - (int)rx : mx + (int)rx; erg->y = (dx<0) ? my - (int)ry : my + (int)ry; } else { erg->x = (x>mx) ? mx + r : mx - r; erg->y = y; } } else { mx = TraTrans[ Nr]->PosTrans.x; my = TraTrans[ Nr]->PosTrans.y; switch (TraTrans[ Nr]->Darstellung) { case TRA_QUAD: r = HA_TRA_DIA + ABSTAND; if (x-mx-my+y > 0) /* Dia 1 Uhr : rechts unten */ if (x-mx-y+my > 0) { /* Dia 5 Uhr : rechts oben */ /**** RECHTE SEITE **********************************/ erg->x = mx+r; erg->y = my-(int)(r*(my-y)/(x-mx)); } else { /**** UNTERE SEITE **********************************/ erg->x = mx+ (int)(r*(x-mx)/(y-my)); erg->y = my+r; } else if (x-mx-y+my > 0) { /* Dia 5 Uhr : rechts oben */ /**** OBERE SEITE ***********************************/ erg->x = mx - (int)(r*(x-mx)/(y-my)); erg->y = my-r; } else { /**** LINKE SEITE ***********************************/ erg->x = mx-r; erg->y = my+(int)(r*(my-y)/(x-mx)); } break; default: r = HA_STE_RAD; /* Radius */ if (my != y) { dx = x-mx; /* Zielpunkt relativ */ dy = y-my; ry = r*dy/sqrt(dx*dx+dy*dy); if (dx<0) ry = -ry; rx = ry*dx/dy; erg->x = (dx<0) ? mx - (int)rx : mx + (int)rx; erg->y = (dx<0) ? my - (int)ry : my + (int)ry; } else { erg->x = (x>mx) ? mx + r : mx - r; erg->y = y; } break; } } }