home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- * CagdEXTR.c - Extrusion operator out of a given profile and a direction vec. *
- *******************************************************************************
- * Written by Gershon Elber, Mar. 91. *
- ******************************************************************************/
-
- #ifdef __MSDOS__
- #include <stdlib.h>
- #include <string.h>
- #include <alloc.h>
- #endif /* __MSDOS__ */
-
- #include "cagd_loc.h"
-
- /******************************************************************************
- * Constructs an extrusion surface in the Vector direction for the given *
- * profile curve. Input curve be either a Bspline or a Bezier curve and the *
- * resulting output surface will be of the same type. *
- ******************************************************************************/
- CagdSrfStruct *CagdExtrudeSrf(CagdCrvStruct *Crv, CagdVecStruct *Vec)
- {
- CagdSrfStruct *Srf;
- int i, j,
- MaxCoord = CAGD_NUM_OF_PT_COORD(Crv -> PType),
- Len = Crv -> Length;
- CagdPointType
- PType = Crv -> PType;
- CagdBType
- IsNotRational = !CAGD_IS_RATIONAL_CRV(Crv);
- CagdRType **SrfPoints,
- **CrvPoints = Crv -> Points,
- *Dir = Vec->Vec;
-
- switch (PType) {
- case CAGD_PT_P2_TYPE:
- PType = CAGD_PT_P3_TYPE;
- break;
- case CAGD_PT_E2_TYPE:
- PType = CAGD_PT_E3_TYPE;
- break;
- case CAGD_PT_P3_TYPE:
- case CAGD_PT_E3_TYPE:
- break;
- default:
- FATAL_ERROR(CAGD_ERR_UNSUPPORT_PT);
- break;
- }
-
- switch (Crv -> GType) {
- case CAGD_CBEZIER_TYPE:
- Srf = BzrSrfNew(Len, 2, PType);
- break;
- case CAGD_CBSPLINE_TYPE:
- Srf = BspSrfNew(Len, 2, Crv -> Order, 2, PType);
- GEN_COPY(Srf -> UKnotVector, Crv -> KnotVector, sizeof(CagdRType) *
- (Len + Crv -> Order));
- Srf -> VKnotVector[0] = Srf -> VKnotVector[1] = 0.0;
- Srf -> VKnotVector[2] = Srf -> VKnotVector[3] = 1.0;
- break;
- case CAGD_CPOWER_TYPE:
- FATAL_ERROR(CAGD_ERR_POWER_NO_SUPPORT);
- return NULL;
- default:
- FATAL_ERROR(CAGD_ERR_UNDEF_CRV);
- return NULL;
- }
-
- /* Copy the control mesh - first row is exactly the same as the curve */
- /* while second one is the same as first one translated by Vec. */
- SrfPoints = Srf -> Points;
-
- for (i = IsNotRational; i <= MaxCoord; i++) /* First row. */
- GEN_COPY(SrfPoints[i], CrvPoints[i],
- sizeof(CagdRType) * Len);
-
- /* Make a copy of the Second row do we can "work" on it. */
- for (i = IsNotRational; i <= MaxCoord; i++) /* Second row. */
- GEN_COPY(&SrfPoints[i][Len], CrvPoints[i],
- sizeof(CagdRType) * Len);
-
- /* If the curve has lesser dimension (i.e. was 2D), Add zeros. */
- for (i = MaxCoord + 1; i <= 3; i++)
- for (j = 0; j < Len * 2; j++)
- SrfPoints[i][j] = 0.0;
-
- for (i = 1; i <= 3; i++) /* Translate the second row. */
- for (j = Len; j < Len * 2; j++)
- SrfPoints[i][j] += IsNotRational ? Dir[i - 1] :
- Dir[i - 1] * SrfPoints[W][j];
-
- return Srf;
- }
-