blob: 9b26546d0340ec9d1cfa235f7f400bb95eb74217 [file] [log] [blame]
#include "geo.h"
extern void tpop( TNODEPTR *root , TNODEPTR *node , int *value ,
int *property);
extern void tinsert( TNODEPTR *root , int value , int property );
void makeVertDownTree(void);
void makeHoriRiteTree(void);
void makeVertTree(void);
void makeHoriTree(void);
void fulllink(void)
{
TNODEPTR junkptr ;
DLINK1PTR ptr , pptr , nptr ;
int location , index ;
Hlist = (DLINK1PTR) malloc( sizeof( DLINK1 ) ) ;
Hlist->edge = edgeCount ;
Hlist->next = (DLINK1PTR) malloc( sizeof( DLINK1 ) ) ;
Hlist->prev = (DLINK1PTR) NULL ;
Hlist->next->next = (DLINK1PTR) NULL ;
Hlist->next->prev = Hlist ;
Hlist->next->edge = edgeCount - 2 ;
Hend = Hlist->next ;
Vlist = (DLINK1PTR) malloc( sizeof( DLINK1 ) ) ;
Vlist->edge = edgeCount - 3 ;
Vlist->next = (DLINK1PTR) malloc( sizeof( DLINK1 ) ) ;
Vlist->prev = (DLINK1PTR) NULL ;
Vlist->next->next = (DLINK1PTR) NULL ;
Vlist->next->prev = Vlist ;
Vlist->next->edge = edgeCount - 1 ;
Vend = Vlist->next ;
pptr = Hlist ;
nptr = Hlist->next ;
for( ; ; ) {
tpop( &hEdgeRoot , &junkptr , &location , &index ) ;
if( junkptr == (TNODEPTR) NULL ) {
break ;
}
ptr = (DLINK1PTR) malloc( sizeof( DLINK1 ) ) ;
ptr->edge = index ;
ptr->prev = pptr ;
ptr->next = nptr ;
pptr->next = ptr ;
nptr->prev = ptr ;
pptr = ptr ;
}
pptr = Vlist ;
nptr = Vlist->next ;
for( ; ; ) {
tpop( &vEdgeRoot , &junkptr , &location , &index ) ;
if( junkptr == (TNODEPTR) NULL ) {
break ;
}
ptr = (DLINK1PTR) malloc( sizeof( DLINK1 ) ) ;
ptr->edge = index ;
ptr->prev = pptr ;
ptr->next = nptr ;
pptr->next = ptr ;
nptr->prev = ptr ;
pptr = ptr ;
}
makeVertDownTree() ;
makeHoriRiteTree() ;
makeVertTree() ;
makeHoriTree() ;
return ;
}
void makeVertTree(void)
{
DLINK1PTR vptr ;
int last , edge , count ;
Vroot = (TNODEPTR) NULL ;
Vptrs = (DLINK1PTR *) malloc( 100 * sizeof(DLINK1PTR) ) ;
count = 0 ;
last = -1000000 ;
for( vptr = Vlist ; vptr != (DLINK1PTR) NULL ; vptr = vptr->next ) {
edge = vptr->edge ;
if( edgeList[edge].loc > last ) {
last = edgeList[edge].loc ;
if( ++count % 100 == 0 ) {
Vptrs = (DLINK1PTR *) realloc( Vptrs ,
(count + 100) * sizeof(DLINK1PTR) ) ;
}
Vptrs[count] = vptr ;
tinsert( &Vroot , last , count ) ;
}
}
return ;
}
void makeHoriTree(void)
{
DLINK1PTR hptr ;
int last , edge , count ;
Hroot = (TNODEPTR) NULL ;
Hptrs = (DLINK1PTR *) malloc( 100 * sizeof(DLINK1PTR) ) ;
count = 0 ;
last = -1000000 ;
for( hptr = Hlist ; hptr != (DLINK1PTR) NULL ; hptr = hptr->next ) {
edge = hptr->edge ;
if( edgeList[edge].loc > last ) {
last = edgeList[edge].loc ;
if( ++count % 100 == 0 ) {
Hptrs = (DLINK1PTR *) realloc( Hptrs ,
(count + 100) * sizeof(DLINK1PTR) ) ;
}
Hptrs[count] = hptr ;
tinsert( &Hroot , last , count ) ;
}
}
return ;
}
void makeVertDownTree(void)
{
DLINK1PTR vptr ;
int last , edge , count ;
VDroot = (TNODEPTR) NULL ;
VDptrs = (DLINK1PTR *) malloc( 100 * sizeof(DLINK1PTR) ) ;
count = 0 ;
last = -1000000 ;
for( vptr = Vlist ; vptr != (DLINK1PTR) NULL ; vptr = vptr->next ) {
edge = vptr->edge ;
if( edgeList[edge].UorR > 0 ) {
continue ;
}
if( edgeList[edge].loc > last ) {
last = edgeList[edge].loc ;
if( ++count % 100 == 0 ) {
VDptrs = (DLINK1PTR *) realloc( VDptrs ,
(count + 100) * sizeof(DLINK1PTR) ) ;
}
VDptrs[count] = vptr ;
tinsert( &VDroot , last , count ) ;
}
}
return ;
}
void makeHoriRiteTree(void)
{
DLINK1PTR hptr ;
int last , edge , count ;
HRroot = (TNODEPTR) NULL ;
HRptrs = (DLINK1PTR *) malloc( 100 * sizeof(DLINK1PTR) ) ;
count = 0 ;
last = -1000000 ;
for( hptr = Hlist ; hptr != (DLINK1PTR) NULL ; hptr = hptr->next ) {
edge = hptr->edge ;
if( edgeList[edge].UorR < 0 ) {
continue ;
}
if( edgeList[edge].loc > last ) {
last = edgeList[edge].loc ;
if( ++count % 100 == 0 ) {
HRptrs = (DLINK1PTR *) realloc( HRptrs ,
(count + 100) * sizeof(DLINK1PTR) ) ;
}
HRptrs[count] = hptr ;
tinsert( &HRroot , last , count ) ;
}
}
return ;
}