Main Page   Data Structures   File List   Data Fields   Globals  

scale_chain.c

Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include "sadie.h"
00003 #include "chain.h"
00004 
00005 
00006 void SCALE_CHAIN (
00007 CHAIN *chainmap,                     /* Pointer to the chain code structure */
00008 int   scale,                         /* Scaling factor to scale chain code */
00009 CHAIN **scaledChain                  /* Address of pointer to the scaled chain code structure */
00010 ) {
00011     unsigned char code;
00012     unsigned int j, k, prevj, prevk;
00013     unsigned int currj, currk;
00014     int skip;
00015     LIST_NODE *newLnode, *currLnode, **prevLnode;
00016     CHAIN_NODE *newCnode, *currCnode, **prevCnode;
00017     
00018     /* Allocate memory for the new chain code structure */
00019     (*scaledChain) = (CHAIN *)malloc(sizeof(CHAIN));
00020 
00021     /* Write header info into the new chain code structure */
00022     memcpy((char *)&((*scaledChain)->nlin), (char *)&(chainmap->nlin), CHAIN_HEADER_SIZE);
00023     (*scaledChain)->nlin = chainmap->nlin/scale;
00024     (*scaledChain)->npix = chainmap->npix/scale;
00025     (*scaledChain)->list = NULL;
00026     prevLnode = (LIST_NODE **)&((*scaledChain)->list);
00027 
00028     /* Scale chain code */
00029     currLnode = chainmap->list;
00030     while (currLnode != NULL) {
00031         j = currLnode->startj;
00032         k = currLnode->startk;
00033         prevj = j/scale;
00034         prevk = k/scale;
00035         
00036         newLnode = (LIST_NODE *)malloc(sizeof(LIST_NODE));
00037         newLnode->startj = j/scale;
00038         newLnode->startk = k/scale;
00039         newLnode->ring_type = currLnode->ring_type;
00040         newLnode->ring_id = currLnode->ring_id;
00041         newLnode->chain = NULL;
00042         newLnode->next = NULL;
00043         (*prevLnode) = newLnode;
00044         prevLnode = (LIST_NODE **)&(newLnode->next);
00045         prevCnode = (CHAIN_NODE **)&(newLnode->chain);
00046         
00047         currCnode = currLnode->chain;
00048         skip = 1;
00049         while (currCnode != NULL) {
00050             CHAIN_COMPUTE_COORDINATES(k, j, currCnode->code, &k, &j);
00051             if (!(skip%scale)) {
00052                 currj = j/scale;
00053                 currk = k/scale;
00054                 CHAIN_COMPUTE_CODE(prevj, prevk, currj, currk, &code);
00055                 newCnode = (CHAIN_NODE *)malloc(sizeof(CHAIN_NODE));
00056                 newCnode->code = code;
00057                 newCnode->valid = currCnode->valid;
00058                 newCnode->next = NULL;
00059                 (*prevCnode) = newCnode;
00060                 prevCnode = (CHAIN_NODE **)&(newCnode->next);
00061                 
00062                 prevj = currj;
00063                 prevk = currk;
00064             }
00065 
00066             skip++;
00067             currCnode = (CHAIN_NODE *)currCnode->next;
00068         }
00069 
00070         currLnode = currLnode->next;
00071     }
00072     
00073 }
00074 
00075     
00076     
00077                   

Generated on Wed Apr 9 08:56:13 2003 for TREES by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002