home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- * CagdMesh.c - Extract surface control mesh/curve control polygon as polyline *
- *******************************************************************************
- * Written by Gershon Elber, Aug. 90. *
- ******************************************************************************/
-
- #include "cagd_loc.h"
-
- /******************************************************************************
- * Extract the control polygon of a curve as a polyline. *
- ******************************************************************************/
- CagdPolylineStruct *CagdCrv2CtrlPoly(CagdCrvStruct *Crv)
- {
- int i,
- Length = Crv->Length;
- CagdRType **CrvP = Crv -> Points;
- CagdPtStruct *NewPolyline;
- CagdPolylineStruct *P;
-
- P = CagdPolylineNew(Length);
- NewPolyline = P -> Polyline;
-
- for (i = 0; i < Length; i++) {
- CagdCoerceToE3(NewPolyline -> Pt, CrvP, i, Crv -> PType);
- NewPolyline++;
- }
- return P;
- }
-
- /******************************************************************************
- * Extract the control mesh of a surface as a list of polylines. *
- ******************************************************************************/
- CagdPolylineStruct *CagdSrf2CtrlMesh(CagdSrfStruct *Srf)
- {
- int i, j, SrfIndex,
- ULength = Srf->ULength,
- VLength = Srf->VLength;
- CagdRType **SrfP = Srf -> Points;
- CagdPtStruct *NewPolyline;
- CagdPolylineStruct *P, *PList = NULL;
-
- for (j = 0; j < VLength; j++) { /* Generate the rows of the mesh. */
- P = CagdPolylineNew(ULength);
- NewPolyline = P -> Polyline;
-
- SrfIndex = CAGD_MESH_UV(Srf, 0, j); /* Start at the begining of row. */
- for (i = 0; i < ULength; i++) {
- CagdCoerceToE3(NewPolyline -> Pt, SrfP, SrfIndex, Srf -> PType);
- NewPolyline++;
- SrfIndex += CAGD_NEXT_U(Srf);
- }
- CAGD_LIST_PUSH(P, PList);
- }
-
- for (i = 0; i < ULength; i++) { /* Generate the cols of the mesh. */
- P = CagdPolylineNew(VLength);
- NewPolyline = P -> Polyline;
-
- SrfIndex = CAGD_MESH_UV(Srf, i, 0); /* Start at the begining of row. */
- for (j = 0; j < VLength; j++) {
- CagdCoerceToE3(NewPolyline -> Pt, SrfP, SrfIndex, Srf -> PType);
- NewPolyline++;
- SrfIndex += CAGD_NEXT_V(Srf);
- }
- CAGD_LIST_PUSH(P, PList);
- }
-
- return PList;
- }
-