Add randomize button to mandala page.

pull/59/head
Atul Varma 2021-03-27 15:19:36 -04:00
rodzic 9ce2d8df80
commit 3095e5b16a
2 zmienionych plików z 40 dodań i 9 usunięć

Wyświetl plik

@ -22,7 +22,8 @@ import {
} from "../svg-transform"; } from "../svg-transform";
import { SvgVocabulary } from "../svg-vocabulary"; import { SvgVocabulary } from "../svg-vocabulary";
import { SymbolContextWidget } from "../symbol-context-widget"; import { SymbolContextWidget } from "../symbol-context-widget";
import { range } from "../util"; import { NumericRange, range } from "../util";
import { Random } from "../random";
const EYE = SvgVocabulary.get("eye"); const EYE = SvgVocabulary.get("eye");
@ -57,13 +58,35 @@ const MandalaCircle: React.FC<
return <>{symbols}</>; return <>{symbols}</>;
}; };
type NumericParams = NumericRange & { default: number };
const RADIUS: NumericParams = {
min: 0,
max: 1000,
step: 1,
default: 400,
};
const NUM_SYMBOLS: NumericParams = {
min: 1,
max: 30,
step: 1,
default: 6,
};
export const MandalaPage: React.FC<{}> = () => { export const MandalaPage: React.FC<{}> = () => {
const svgRef = useRef<SVGSVGElement>(null); const svgRef = useRef<SVGSVGElement>(null);
const [bgColor, setBgColor] = useState(DEFAULT_BG_COLOR); const [bgColor, setBgColor] = useState(DEFAULT_BG_COLOR);
const [symbol, setSymbol] = useState(EYE); const [symbol, setSymbol] = useState(EYE);
const [symbolCtx, setSymbolCtx] = useState(createSvgSymbolContext()); const [symbolCtx, setSymbolCtx] = useState(createSvgSymbolContext());
const [radius, setRadius] = useState(400); const [radius, setRadius] = useState(RADIUS.default);
const [numSymbols, setNumSymbols] = useState(6); const [numSymbols, setNumSymbols] = useState(NUM_SYMBOLS.default);
const randomize = () => {
const rng = new Random(Date.now());
setRadius(rng.inRange(RADIUS));
setNumSymbols(rng.inRange(NUM_SYMBOLS));
setSymbol(rng.choice(SvgVocabulary.items));
};
return ( return (
<> <>
@ -82,20 +105,19 @@ export const MandalaPage: React.FC<{}> = () => {
label="Radius" label="Radius"
value={radius} value={radius}
onChange={setRadius} onChange={setRadius}
min={0} {...RADIUS}
max={1000}
step={1}
/> />
<NumericSlider <NumericSlider
label="Numer of symbols" label="Numer of symbols"
value={numSymbols} value={numSymbols}
onChange={setNumSymbols} onChange={setNumSymbols}
min={1} {...NUM_SYMBOLS}
max={30}
step={1}
/> />
</div> </div>
<div className="thingy"> <div className="thingy">
<button accessKey="r" onClick={randomize}>
<u>R</u>andomize!
</button>{" "}
<ExportSvgButton filename="mandala.svg" svgRef={svgRef} /> <ExportSvgButton filename="mandala.svg" svgRef={svgRef} />
</div> </div>
<HoverDebugHelper> <HoverDebugHelper>

Wyświetl plik

@ -1,3 +1,5 @@
import { inclusiveRange, NumericRange } from "./util";
export type RandomParameters = { export type RandomParameters = {
modulus: number; modulus: number;
multiplier: number; multiplier: number;
@ -49,6 +51,13 @@ export class Random {
return this.next() < trueProbability; return this.next() < trueProbability;
} }
/**
* Return a number in the given range, inclusive.
*/
inRange(range: NumericRange): number {
return this.choice(inclusiveRange(range));
}
/** /**
* Return a random item from the given array. If the array is * Return a random item from the given array. If the array is
* empty, an exception is thrown. * empty, an exception is thrown.