<> <> <> <> DIRECTORY PredefSweeps, RealFns, SV2d, SVPolygon2d, SVSweepGeometry; PredefSweepsImpl: CEDAR PROGRAM IMPORTS RealFns, SVPolygon2d, SVSweepGeometry EXPORTS PredefSweeps = BEGIN RevoluteMesh: TYPE = REF RevoluteMeshRecord; RevoluteMeshRecord: TYPE = SVSweepGeometry.RevoluteMeshRecord; LinearMesh: TYPE = REF LinearMeshRecord; LinearMeshRecord: TYPE = SVSweepGeometry.LinearMeshRecord; ToroidalMesh: TYPE = REF ToroidalMeshRecord; ToroidalMeshRecord: TYPE = SVSweepGeometry.ToroidalMeshRecord; Polygon: TYPE = SV2d.Polygon; Path: TYPE = SV2d.Path; linesOfLatitude: NAT _ 5; linesOfLongitude: NAT _ 8; SetLinesOfLatitude: PUBLIC PROC [lat: NAT] = { linesOfLatitude _ lat; }; SetLinesOfLongitude: PUBLIC PROC [long: NAT] = { linesOfLongitude _ long; }; GetLinesOfLatitude: PUBLIC PROC [] RETURNS [lat: NAT] = { lat _ linesOfLatitude; }; GetLinesOfLongitude: PUBLIC PROC [] RETURNS [long: NAT] = { long _ linesOfLongitude; }; CreateSphere: PUBLIC PROC [r: REAL] RETURNS [RevoluteMesh] = { <> x, y: REAL; path: Path _ SVPolygon2d.CreatePath[linesOfLatitude]; theta, deltaTheta: REAL; SVPolygon2d.PutPathPoint[path, 0, [0,r]]; theta _ 90.0; deltaTheta _ 180.0/(linesOfLatitude - 1); -- Nat to float? FOR i: NAT IN [2..linesOfLatitude-1] DO theta _ theta - deltaTheta; x _ r*RealFns.CosDeg[theta]; y _ r*RealFns.SinDeg[theta]; SVPolygon2d.PutPathPoint[path, i-1, [x,y]]; ENDLOOP; SVPolygon2d.PutPathPoint[path, linesOfLatitude-1, [0,-r]]; RETURN[SVSweepGeometry.RevoluteSweep[path, linesOfLongitude]]; }; CreateCube: PUBLIC PROC [side: REAL] RETURNS [LinearMesh] = { pos, neg: REAL; lin: LinearMesh; poly: Polygon _ SVPolygon2d.CreatePoly[4]; pos _ side*(0.5); neg _ side*(-0.5); poly _ SVPolygon2d.PutPolyPoint[poly, 0, [neg,pos]]; poly _ SVPolygon2d.PutPolyPoint[poly, 1, [pos,pos]]; poly _ SVPolygon2d.PutPolyPoint[poly, 2, [pos,neg]]; poly _ SVPolygon2d.PutPolyPoint[poly, 3, [neg,neg]]; lin _ SVSweepGeometry.LinearSweep[poly, pos, neg]; RETURN[lin]; }; CreateFullCylinder: PUBLIC PROC [r, h: REAL] RETURNS [RevoluteMesh] = { path: Path _ SVPolygon2d.CreatePath[linesOfLatitude]; height, deltaH: REAL; height _ h/2.0; deltaH _ h/(linesOfLatitude - 1); SVPolygon2d.PutPathPoint[path, 0, [r,height]]; <> SVPolygon2d.PutPathPoint[path, linesOfLatitude-1, [r,-height]]; FOR i: NAT IN [2..linesOfLatitude-1] DO height _ height - deltaH; SVPolygon2d.PutPathPoint[path, i-1, [r,height]]; ENDLOOP; RETURN[SVSweepGeometry.RevoluteSweep[path, linesOfLongitude]]; }; CreateCylinder: PUBLIC PROC [r, h: REAL] RETURNS [RevoluteMesh] = { path: Path _ SVPolygon2d.CreatePath[2]; height: REAL _ h/2.0; SVPolygon2d.PutPathPoint[path, 0, [r,height]]; SVPolygon2d.PutPathPoint[path, 1, [r,-height]]; RETURN[SVSweepGeometry.RevoluteSweep[path, linesOfLongitude]]; }; CreateCone: PUBLIC PROC [r, h: REAL] RETURNS [RevoluteMesh] = { path: Path _ SVPolygon2d.CreatePath[linesOfLatitude]; height, deltaH, x, deltaX: REAL; height _ h; deltaH _ h/(linesOfLatitude - 1); x _ 0; deltaX _ r/(linesOfLatitude - 1); <> SVPolygon2d.PutPathPoint[path, 0, [0,h]];-- top is on the y axis; SVPolygon2d.PutPathPoint[path, linesOfLatitude-1, [r,0]];-- base is on the xz plane FOR i: NAT IN [2..linesOfLatitude-1] DO height _ height - deltaH; x _ x + deltaX; SVPolygon2d.PutPathPoint[path, i-1, [x,height]]; ENDLOOP; RETURN[SVSweepGeometry.RevoluteSweep[path, linesOfLongitude]]; }; CreateTorus: PUBLIC PROC [rBig, rCross: REAL] RETURNS [ToroidalMesh] = { poly: Polygon _ SVPolygon2d.CreatePoly[linesOfLatitude]; <> alpha, deltaAlpha, sin, cos, x, y: REAL; -- the cross section circle alpha _ 0; deltaAlpha _ -360/linesOfLatitude; -- negative because ToroidalSweep assumes clockwise poly _ SVPolygon2d.PutPolyPoint[poly, 0, [rBig+rCross,0]]; FOR i: NAT IN[2..linesOfLatitude] DO alpha _ alpha + deltaAlpha; sin _ RealFns.SinDeg[alpha]; cos _ RealFns.CosDeg[alpha]; x _ rBig + rCross*cos; y _ rCross*sin; poly _ SVPolygon2d.PutPolyPoint[poly, i-1, [x,y]]; ENDLOOP; RETURN[SVSweepGeometry.ToroidalSweep[poly, linesOfLongitude]]; }; GetUnitSphere: PUBLIC PROC RETURNS [RevoluteMesh] = { RETURN[CreateSphere[1.0]] }; GetUnitCube: PUBLIC PROC RETURNS [LinearMesh] = { RETURN[CreateCube[2.0]] }; GetUnitCylinder: PUBLIC PROC RETURNS [RevoluteMesh] = { RETURN[CreateFullCylinder[1.0, 2.0]] }; GetUnitCone: PUBLIC PROC RETURNS [RevoluteMesh] = { RETURN[CreateCone[1.0, 1.0]] }; END.