monoChain.h revision f220fa62
1/* 2 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 3 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice including the dates of first publication and 13 * either this permission notice or a reference to 14 * http://oss.sgi.com/projects/FreeB/ 15 * shall be included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 * 25 * Except as contained in this notice, the name of Silicon Graphics, Inc. 26 * shall not be used in advertising or otherwise to promote the sale, use or 27 * other dealings in this Software without prior written authorization from 28 * Silicon Graphics, Inc. 29 */ 30/* 31*/ 32 33#ifndef _MONO_CHAIN_H 34#define _MONO_CHAIN_H 35 36#include "directedLine.h" 37#include "partitionY.h" 38 39class monoChain; 40 41class monoChain{ 42 directedLine* chainHead; 43 directedLine* chainTail; 44 monoChain* next; 45 monoChain* prev; 46 monoChain* nextPolygon; //a list of polygons 47 48 //cached informatin 49 //bounding box 50 Real minX, maxX, minY, maxY; 51 Int isIncrease; 52 53 //for efficiently comparing two chains 54 55 directedLine* current; 56 57public: 58 monoChain(directedLine* cHead, directedLine* cTail); 59 ~monoChain() {} 60 61 inline void setNext(monoChain* n) {next = n;} 62 inline void setPrev(monoChain* p) {prev = p;} 63 inline void setNextPolygon(monoChain* np) {nextPolygon = np;} 64 inline monoChain* getNext() {return next;} 65 inline monoChain* getPrev() {return prev;} 66 inline directedLine* getHead() {return chainHead;} 67 inline directedLine* getTail() {return chainTail;} 68 69 inline void resetCurrent() { current = ((isIncrease==1)? chainHead:chainTail);} 70 71 void deleteLoop(); 72 void deleteLoopList(); 73 74 //insert a new chain between prev and this 75 void insert(monoChain* nc); 76 77 Int numChainsSingleLoop(); 78 Int numChainsAllLoops(); 79 monoChain** toArrayAllLoops(Int& num_chains); 80 Int toArraySingleLoop(monoChain** array, Int index); 81 82 Int isKey; 83 Real keyY; //the current horizotal line 84 Real chainIntersectHoriz(Real y); //updates current incrementally for efficiency 85 directedLine* find(Real y);//find dline so that y intersects dline. 86 87 void printOneChain(); 88 void printChainLoop(); 89 void printAllLoops(); 90 91}; 92 93monoChain* directedLineLoopToMonoChainLoop(directedLine* loop); 94monoChain* directedLineLoopListToMonoChainLoopList(directedLine* list); 95Int MC_sweepY(Int nVertices, monoChain** sortedVertices, sweepRange** ret_ranges); 96 97void MC_findDiagonals(Int total_num_edges, monoChain** sortedVertices, 98 sweepRange** ranges, Int& num_diagonals, 99 directedLine** diagonal_vertices); 100 101directedLine* MC_partitionY(directedLine *polygons, sampledLine **retSampledLines); 102 103#endif 104