MODULE RandomShapes EXPORTS Main; (* Generates N random variations of a given ".top" file. *) IMPORT Triang, LR3, Random, Thread, Wr, Stdio, Fmt, ParseParams, Process; FROM Triang IMPORT Topology, Coords; FROM Stdio IMPORT stderr; TYPE Options = RECORD inFile: TEXT; (* Input file name (minus ".top" extension) *) outFile: TEXT; (* Output file name prefix *) trials: CARDINAL; (* Number of configurations to generate *) jitter: REAL; (* Magnitude of random perturbation *) normalize: BOOLEAN; (* TRUE to normalize the vertex coordinates *) END; PROCEDURE DoIt() = BEGIN WITH o = GetOptions(), coins = NEW(Random.Default).init(TRUE), tc = Triang.Read(o.inFile), top = tc.top, cOld = tc.c^, cNew = NEW(REF Coords, top.NV)^ DO IF o.normalize THEN Triang.NormalizeVertexNorms(top, cOld) END; FOR k := 1 TO o.trials DO cNew := cOld; PerturbCoords(top, cNew, coins, FLOAT(o.jitter, LONGREAL)); IF o.normalize THEN Triang.NormalizeVertexNorms(top, cNew) END; Triang.Write(o.outFile & "-" & Fmt.Pad(Fmt.Int(k), 4, '0'), top, cNew) END; END END DoIt; PROCEDURE PerturbCoords( READONLY top: Topology; VAR c: Coords; coins: Random.T; jitter: LONGREAL; ) = BEGIN FOR i := 0 TO LAST(c) DO IF top.vertex[i].exists AND NOT top.vertex[i].fixed THEN WITH ci = c[i], p = LR3.T{ jitter * coins.longreal(-1.0d0, +1.0d0), jitter * coins.longreal(-1.0d0, +1.0d0), jitter * coins.longreal(-1.0d0, +1.0d0) } DO ci := LR3.Add(ci, p) END END END; END PerturbCoords; PROCEDURE GetOptions (): Options = <* FATAL Thread.Alerted, Wr.Failure *> VAR o: Options; BEGIN WITH pp = NEW(ParseParams.T).init(stderr) DO TRY pp.getKeyword("-inFile"); o.inFile := pp.getNext(); pp.getKeyword("-outFile"); o.outFile := pp.getNext(); pp.getKeyword("-trials"); o.trials := pp.getNextInt(1,200); o.normalize := pp.keywordPresent("-normalize"); IF pp.keywordPresent("-jitter") THEN o.jitter := pp.getNextReal(0.0, 10.0); ELSE o.jitter := 1.0 END; pp.finish(); EXCEPT | ParseParams.Error => Wr.PutText(stderr, "Usage: RandomShapes \\\n"); Wr.PutText(stderr, " -inFile -outFile \\\n"); Wr.PutText(stderr, " -trials \\\n"); Wr.PutText(stderr, " [ -normalize ] [ -jitter ] \n"); Process.Exit (1); END END; RETURN o END GetOptions; BEGIN DoIt() END RandomShapes.