home *** CD-ROM | disk | FTP | other *** search
- #
- # Some comparison tests with LOFFSET.
- #
- # Gershon Elber, OCtober 1994.
- #
-
- ComputeError = procedure(FName, Crv, Dist, OCrv):Dst:DstSqr:FFMin:FFMax:
- Dst = symbdiff(Crv, OCrv):
- DstSqr = symbdprod(Dst, Dst):
- FFMin = max(coord(ffextreme(DstSqr, true), 1), 0):
- FFMax = max(coord(ffextreme(DstSqr, false), 1), 0):
- printf("%s: Min %lf, Max %lf, Max Error %lf (ctlpts = %1.0lf)",
- list(FName, sqrt(FFMin), sqrt(FFMax),
- max(abs(sqrt(FFMin) - Dist),
- abs(sqrt(FFMax) - Dist)),
- sizeof(OCrv)));
-
- CompareOffset = procedure(Crv, Dist, c1, c2, c3, c4):
- ComputeError("OFFSET ", Crv, Dist, c1):
- ComputeError("OFFSETI", Crv, Dist, c2):
- ComputeError("AOFFSET", Crv, Dist, c3):
- ComputeError("LOFFSET", Crv, Dist, c4);
-
- CmpOffAllTols = procedure(Crv, Header, FName, Dist, Tol, Steps):c1:c2:c3:
- for (i = 0, 1, Steps,
- printf("\\\n\\\n%s: TOLERANCE = %lf, Dist = %lf",
- list(Header, Tol, Dist)):
- c1 = offset(Crv, Dist, Tol, off):
- c2 = offset(Crv, Dist, Tol, on):
- c3 = aoffset(Crv, Dist, Tol, false, off):
- c4 = loffset(Crv, Dist, 300, sizeof(c2), 4):
- attrib(c1, "dash", "[0.1 0.01] 0"):
- color(c1, red):
- attrib(c2, "dash", "[0.01 0.01] 0"):
- color(c2, green):
- attrib(c3, "dash", "[0.2 0.01 0.05 0.01] 0"):
- color(c3, yellow):
- attrib(c4, "dash", "[0.1 0.1 0.01 0.01] 0"):
- color(c4, cyan):
- save(FName + "_" + (i + 1), list(crv, c1, c2, c3, c4)):
- CompareOffset(Crv, abs(Dist), c1, c2, c3, c4):
- Tol = Tol * sqrt(0.1));
-
- #############################################################################
-
- bez = cbezier( list( ctlpt( E2, -0.95, 0.7 ),
- ctlpt( E2, -0.3, 0.5 ),
- ctlpt( E2, 0.3, -2.5 ),
- ctlpt( E2, 0.9, -0.2 ) ) );
- CmpOffAllTols(bez, "BEZIER CURVE", "bez_0.4", 0.4, 1.0, 5);
-
- cpawn = cbspline( 4,
- list( ctlpt( E2, 0.95, 0.05 ),
- ctlpt( E2, 0.95, 0.76 ),
- ctlpt( E2, 0.30, 1.52 ),
- ctlpt( E2, 0.30, 1.90 ),
- ctlpt( E2, 0.50, 2.09 ),
- ctlpt( E2, 0.72, 2.24 ),
- ctlpt( E2, 0.72, 2.32 ),
- ctlpt( E2, 0.38, 2.50 ),
- ctlpt( E2, 0.42, 2.70 ),
- ctlpt( E2, 0.57, 2.81 ),
- ctlpt( E2, 0.57, 3.42 ),
- ctlpt( E2, 0.19, 3.57 ),
- ctlpt( E2, 0.00, 3.57 ) ),
- list( KV_OPEN ) );
- CmpOffAllTols(cpawn, "CHESS PAWN CSECTION", "pawn_0.5", 0.5, 1.0, 4);
- CmpOffAllTols(cpawn, "CHESS PAWN CSECTION", "pawn_1.5", 1.5, 1.0, 3);
-
- cross = cbspline( 4,
- list( ctlpt( E2, 0.5, 0.5 ),
- ctlpt( E2, 0.5, -0.5 ),
- ctlpt( E2, -0.5, -0.5 ),
- ctlpt( E2, -0.5, 0.5 ) ),
- list( KV_PERIODIC ) );
- cross = coerce( cross, kv_open );
- CmpOffAllTols(cross, "CROSS SECTION", "cross_0.3", 0.3, 0.1, 4);
-
- circ = circle( vector(0, 0, 0), 1 );
- CmpOffAllTols(circ, "CIRC", "circ_0.5", 0.5, 0.1, 2);
- CmpOffAllTols(circ, "CIRC", "circ-0.6", -0.6, 0.1, 2);
-
- Crv = cbspline( 3,
- list( ctlpt( E2, 0.7, 0.0 ),
- ctlpt( E2, 0.7, 0.06 ),
- ctlpt( E2, 0.1, 0.1 ),
- ctlpt( E2, 0.1, 0.6 ),
- ctlpt( E2, 0.6, 0.6 ),
- ctlpt( E2, 0.8, 0.8 ),
- ctlpt( E2, 0.8, 1.4 ),
- ctlpt( E2, 0.6, 1.6 ) ),
- list( KV_OPEN ) );
- CmpOffAllTols(Crv, "OFFSET DOCS CRV", "doc_crv_0.4", 0.4, 0.1, 2);
- CmpOffAllTols(Crv, "OFFSET DOCS CRV", "doc_crv-0.2", -0.2, 0.1, 2);
- # CmpOffAllTols(Crv, "OFFSET DOCS CRV", -0.8, 1.0, 2); creates NAN
-