/* * Copyright (C) 1998, 2000-2007, 2010, 2011, 2012, 2013 SINTEF ICT, * Applied Mathematics, Norway. * * Contact information: E-mail: tor.dokken@sintef.no * SINTEF ICT, Department of Applied Mathematics, * P.O. Box 124 Blindern, * 0314 Oslo, Norway. * * This file is part of SISL. * * SISL is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * SISL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public * License along with SISL. If not, see * . * * In accordance with Section 7(b) of the GNU Affero General Public * License, a covered work must retain the producer line in every data * file that is created or manipulated using SISL. * * Other Usage * You can be released from the requirements of the license by purchasing * a commercial license. Buying such a license is mandatory as soon as you * develop commercial activities involving the SISL library without * disclosing the source code of your own applications. * * This file may be used in accordance with the terms contained in a * written agreement between you and SINTEF ICT. */ #include "sisl-copyright.h" /* * * $Id: s1880.c,v 1.2 2001-03-19 15:58:55 afr Exp $ * */ #define S1880 #include "sislP.h" #if defined(SISLNEEDPROTOTYPES) void s1880(int ipar1,int ipar2,int *jpt,SISLIntpt **vpoint,int *jlist,SISLIntlist **vlist, int *jpar,double **gpar1,double **gpar2,int *jcrv,SISLIntcurve ***wcrv,int *jstat) #else void s1880(ipar1,ipar2,jpt,vpoint,jlist,vlist,jpar,gpar1,gpar2,jcrv, wcrv,jstat) int ipar1; int ipar2; int *jpt; SISLIntpt **vpoint; int *jlist; SISLIntlist **vlist; int *jpar; double **gpar1; double **gpar2; int *jcrv; SISLIntcurve ***wcrv; int *jstat; #endif /* ********************************************************************* * ********************************************************************* * * PURPOSE : Transform intersection points and curves from internal * format in the recursive part of intersection routines * to output format. * * * * INPUT : ipar1 - Number of parameter directions of first object. * ipar2 - Number of parameter directions of second object. * vpoint - Array containing intersection points on the * internal format. * vlist - Array representing intersection curves on the * internal format. * * INPUT/OUTPUT : jpt - Number of intersection point in the vpoint array. * jlist - Number of lists representing intersection curves * in the array vlist. * * * * * OUTPUT : jpar - Number of single intersection points. * gpar1 - Parameter values of the single intersection points * in the parameter area of the first object. * gpar2 - Parameter values of the single intersection points * in the parameter area of the second object. * jcrv - Number of intersection curves. * wcrv - Array containing description of intersection curves. * jstat - status messages * > 0 : warning * = 0 : ok * < 0 : error * * * METHOD : * * * REFERENCES : * *- * CALLS : newIntcurve - Create a new instance of Intcurve. * freeIntpt - Free space occupied by intersection point. * * WRITTEN BY : Vibeke Skytt, SI, 88-05. * ********************************************************************* */ { int kpos = 0; /* Position of error. */ int ki,kj,kk; /* Counters. */ int kpoint; /* Number of points in an intersection list. */ int klst; /* Kind of intersection list. (See SISLIntlist). */ int ktype; /* Kind of intersection curve. (See SISLIntcurve). */ int kpt; /* Used to find number of single intersection points.*/ double *spar1,*spar2; /* Values of points belonging to an intersection curve in the parameter area of the objects involved in the intersection. */ double *stpar1,*stpar2,*stpar3; /* Pointers used to travers arrays containing parameter values. */ SISLIntcurve **ucrv; /* Pointer used to traverse *wcrv array. */ SISLIntlist **ulst; /* Pointer used to traverse vlist array. */ SISLIntpt *qpt; /* Pointer to an intersection point. */ SISLIntpt **upt; /* Pointer used to travers vpoint array. */ /* Initiate output arrays. */ *gpar1 = *gpar2 = SISL_NULL; *wcrv = SISL_NULL; /* Allocate space for intersection curve array. */ *jcrv = *jlist; *wcrv = newarray(*jlist,SISLIntcurve*); if ((*jcrv) > 0 && *wcrv == SISL_NULL) goto err101; /* Transfer curve-information from vlist array to wcrv array. */ ucrv = *wcrv; ulst = vlist; kpt = 0; for (ki=0; ki<(*jlist); ki++) { qpt = (*ulst) -> pfirst; /* Allocate space for arrays containing parameter vlaues of points in intersection curves. */ kpoint = (*ulst) -> inumb; if (kpoint == 0) goto err137; spar1 = newarray(ipar1*kpoint,double); spar2 = newarray(ipar2*kpoint,double); if ((ipar1 > 0 && spar1 == SISL_NULL) || (ipar2 > 0 && spar2 == SISL_NULL)) goto err101; /* Collect parameter values of the points in this intersection list and distribute values to the objects in the intersection. */ kj = 0; stpar1 = spar1; stpar2 = spar2; while (qpt != SISL_NULL && qpt -> ipar != -1) { stpar3 = qpt -> epar; for (kk=0; kk ipar = -1; qpt = qpt -> pcurve; kj++; } /* Find kind of intersection curve. */ klst = (*ulst) -> itype; if (klst == 0) ktype = 4; else if (klst == 1) ktype = 2; else if (klst == 2) ktype = 5; else if (klst == 3) ktype = 6; else if (klst == 4) ktype = 7; else if (klst == 5) ktype = 8; else goto err146; /* Create new intersection curve. */ *ucrv = newIntcurve(kj,ipar1,ipar2,spar1,spar2,ktype); if (*ucrv == SISL_NULL) goto err101; kpt += kj; ucrv++; ulst++; } /* Find number of single intersection points. */ kpt = *jpt - kpt; /* Create arrays to keep parameter values of intersection points. */ *gpar1 = newarray(ipar1*kpt,double); *gpar2 = newarray(ipar2*kpt,double); if ((ipar1*kpt > 0 && *gpar1 == SISL_NULL) || (ipar2*kpt > 0 && *gpar2 == SISL_NULL)) goto err101; /* Copy parameters of single intersection points into output-arrays. */ kj = 0; upt = vpoint; stpar1 = *gpar1; stpar2 = *gpar2; for (ki=0; ki<(*jpt); ki++) { qpt = *upt; if (qpt != SISL_NULL) { if (qpt -> ipar != -1) { kj++; stpar3 = qpt -> epar; for (kk=0; kk 0) { if ((*gpar1 = increasearray(*gpar1,kj*ipar1,double)) == SISL_NULL) goto err101; } else { if (*gpar1 != SISL_NULL) freearray(*gpar1); *gpar1 = SISL_NULL; } if (kj*ipar2 > 0) { if ((*gpar2 = increasearray(*gpar2,kj*ipar2,double)) == SISL_NULL) goto err101; } else { if (*gpar2 != SISL_NULL) freearray(*gpar2); *gpar2 = SISL_NULL; } /* Intersections copied to output format. */ *jpt = 0; *jstat = 0; goto out; /* Error in space allocation. */ err101: *jstat = -101; s6err("s1880",*jstat,kpos); goto out; /* Error in data-strucuture. Expected intersection point not found. */ err137: *jstat = -137; s6err("s1880",*jstat,kpos); goto out; /* Unknown kind of intersection type. */ err146: *jstat = -146; s6err("s1880",*jstat,kpos); goto out; out: return; }