📄 scanedg.cpp
字号:
else //new horiz edge current = h_edge (xpos, y, uppercolour - colour, *prevline); *prevline = NULL; //no change this time } else { if (colour == uppercolour) *prevline = v_edge (xpos, y, colour - prevcolour, *prevline); //8 vs 4 connection else if (colour == WHITE_PIX) { join_edges(current, *prevline); current = h_edge (xpos, y, uppercolour - colour, NULL); *prevline = v_edge (xpos, y, colour - prevcolour, current); } else { newcurrent = h_edge (xpos, y, uppercolour - colour, *prevline); *prevline = v_edge (xpos, y, colour - prevcolour, current); current = newcurrent; //right going h edge } prevcolour = colour; //remember new colour } } else { if (colour != prevcolour) { *prevline = current = v_edge (xpos, y, colour - prevcolour, current); prevcolour = colour; } if (colour != uppercolour) current = h_edge (xpos, y, uppercolour - colour, current); else current = NULL; //no edge now } } if (current != NULL) { //out of block if (*prevline != NULL) { //got one to join to? join_edges(current, *prevline); *prevline = NULL; //tidy now } else { //fake vertical *prevline = v_edge (xpos, y, FLIP_COLOUR(prevcolour)-prevcolour, current); } } else if (*prevline != NULL) //continue fake *prevline = v_edge (xpos, y, FLIP_COLOUR(prevcolour)-prevcolour, *prevline);}/********************************************************************** * h_edge * * Create a new horizontal CRACKEDGE and join it to the given edge. **********************************************************************/CRACKEDGE *h_edge ( //horizontal edgeINT16 x, //xpositionINT16 y, //y positionINT8 sign, //sign of edgeCRACKEDGE * join //edge to join to) { CRACKEDGE *newpt; //return value // check_mem("h_edge",JUSTCHECKS); if (free_cracks != NULL) { newpt = free_cracks; free_cracks = newpt->next; //get one fast } else { newpt = new CRACKEDGE; } newpt->pos.set_y (y + 1); //coords of pt newpt->stepy = 0; //edge is horizontal if (sign > 0) { newpt->pos.set_x (x + 1); //start location newpt->stepx = -1; newpt->stepdir = 0; } else { newpt->pos.set_x (x); //start location newpt->stepx = 1; newpt->stepdir = 2; } if (join == NULL) { newpt->next = newpt; //ptrs to other ends newpt->prev = newpt; } else { if (newpt->pos.x () + newpt->stepx == join->pos.x () && newpt->pos.y () == join->pos.y ()) { newpt->prev = join->prev; //update other ends newpt->prev->next = newpt; newpt->next = join; //join up join->prev = newpt; } else { newpt->next = join->next; //update other ends newpt->next->prev = newpt; newpt->prev = join; //join up join->next = newpt; } } return newpt;}/********************************************************************** * v_edge * * Create a new vertical CRACKEDGE and join it to the given edge. **********************************************************************/CRACKEDGE *v_edge ( //vertical edgeINT16 x, //xpositionINT16 y, //y positionINT8 sign, //sign of edgeCRACKEDGE * join //edge to join to) { CRACKEDGE *newpt; //return value if (free_cracks != NULL) { newpt = free_cracks; free_cracks = newpt->next; //get one fast } else { newpt = new CRACKEDGE; } newpt->pos.set_x (x); //coords of pt newpt->stepx = 0; //edge is vertical if (sign > 0) { newpt->pos.set_y (y); //start location newpt->stepy = 1; newpt->stepdir = 3; } else { newpt->pos.set_y (y + 1); //start location newpt->stepy = -1; newpt->stepdir = 1; } if (join == NULL) { newpt->next = newpt; //ptrs to other ends newpt->prev = newpt; } else { if (newpt->pos.x () == join->pos.x () && newpt->pos.y () + newpt->stepy == join->pos.y ()) { newpt->prev = join->prev; //update other ends newpt->prev->next = newpt; newpt->next = join; //join up join->prev = newpt; } else { newpt->next = join->next; //update other ends newpt->next->prev = newpt; newpt->prev = join; //join up join->next = newpt; } } return newpt;}/********************************************************************** * join_edges * * Join 2 edges together. Send the outline for approximation when a * closed loop is formed. **********************************************************************/void join_edges( //join edge fragments CRACKEDGE *edge1, //edges to join CRACKEDGE *edge2 //no specific order ) { CRACKEDGE *tempedge; //for exchanging if (edge1->pos.x () + edge1->stepx != edge2->pos.x () || edge1->pos.y () + edge1->stepy != edge2->pos.y ()) { tempedge = edge1; edge1 = edge2; //swap araound edge2 = tempedge; } // tprintf("Joining %x=(%d,%d)+(%d,%d)->%x<-%x ", // edge1,edge1->pos.x(),edge1->pos.y(),edge1->stepx,edge1->stepy, // edge1->next,edge1->prev); // tprintf("to %x=(%d,%d)+(%d,%d)->%x<-%x\n", // edge2,edge2->pos.x(),edge2->pos.y(),edge2->stepx,edge2->stepy, // edge2->next,edge2->prev); if (edge1->next == edge2) { //already closed complete_edge(edge1); //approximate it //attach freelist to end edge1->prev->next = free_cracks; free_cracks = edge1; //and free list } else { //update opposite ends edge2->prev->next = edge1->next; edge1->next->prev = edge2->prev; edge1->next = edge2; //make joins edge2->prev = edge1; }}/********************************************************************** * free_crackedges * * Really free the CRACKEDGEs by giving them back to delete. **********************************************************************/void free_crackedges( //really free them CRACKEDGE *start //start of loop ) { CRACKEDGE *current; //current edge to free CRACKEDGE *next; //next one to free for (current = start; current != NULL; current = next) { next = current->next; delete current; //delete them all }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -