UNPKG

@canterbury-air-patrol/sar-search-patterns

Version:
1 lines 24.3 kB
{"version":3,"sources":["../react.tsx","../sar-search-patterns.ts"],"sourcesContent":["import React from 'react'\n\nimport { Table, Form } from 'react-bootstrap'\nimport { SearchPattern, SearchLeg, SectorSearch, ExpandingBoxSearch, CreepingLineAheadSearch } from './sar-search-patterns'\n\ninterface SearchDisplayProps {\n search: SearchPattern\n leg?: number\n}\n\ninterface SearchDisplayState {\n search: SearchPattern\n}\n\nclass SearchDisplay extends React.Component<SearchDisplayProps, SearchDisplayState> {\n canvasRef: React.RefObject<HTMLCanvasElement | null>\n minX: number\n minY: number\n maxX: number\n maxY: number\n\n constructor(props: SearchDisplayProps) {\n super(props)\n this.state = {\n search: this.props.search\n }\n this.canvasRef = React.createRef<HTMLCanvasElement>()\n this.minX = 0\n this.minY = 0\n this.maxX = 0\n this.maxY = 0\n }\n\n updateX(x: number) {\n if (x < this.minX) {\n this.minX = x\n }\n if (x > this.maxX) {\n this.maxX = x\n }\n }\n\n updateY(y: number) {\n if (y < this.minY) {\n this.minY = y\n }\n if (y > this.maxY) {\n this.maxY = y\n }\n }\n\n determineXYRange(searchLegs: SearchLeg[]) {\n this.minX = 0\n this.minY = 0\n this.maxX = 0\n this.maxY = 0\n for (const idx in searchLegs) {\n const leg = searchLegs[idx]\n this.updateX(leg.from.x)\n this.updateY(leg.from.y)\n this.updateX(leg.to.x)\n this.updateY(leg.to.y)\n }\n return [Math.abs(this.maxX - this.minX), Math.abs(this.maxY - this.minY)]\n }\n\n drawSearch(canvas: HTMLCanvasElement) {\n const ctx = canvas.getContext('2d')\n if (ctx === null) {\n return\n }\n const searchLegs = this.state.search.getLegs()\n const range = this.determineXYRange(searchLegs)\n const offsetX = Math.abs(this.minX) + 10\n const offsetY = Math.abs(this.maxY) + 10\n range[0] += 20\n range[1] += 20\n const scaleX = canvas.width / range[0]\n const scaleY = canvas.height / range[1]\n let scale = scaleX\n if (scaleY < scaleX) {\n scale = scaleY\n }\n ctx.scale(scale, scale)\n for (const idx in searchLegs) {\n const leg = searchLegs[idx]\n ctx.beginPath()\n ctx.lineWidth = 5\n if (this.state.search.leg === leg) {\n ctx.strokeStyle = 'orange'\n } else {\n ctx.strokeStyle = 'grey'\n }\n ctx.moveTo(offsetX + leg.from.x, offsetY - leg.from.y)\n ctx.lineTo(offsetX + leg.to.x, offsetY - leg.to.y)\n ctx.stroke()\n }\n }\n\n componentDidMount() {\n const canvas = this.canvasRef.current\n if (canvas !== null) {\n this.drawSearch(canvas)\n }\n }\n\n render() {\n return <canvas ref={this.canvasRef} width={600} height={600} />\n }\n}\n\nfunction constructSearch(values: SearchConfigurationState) {\n if (values.searchType === 'sector') {\n return new SectorSearch(values.sweepWidth, values.multiplier, values.iterations, values.initialDirection)\n }\n if (values.searchType === 'expandingbox') {\n return new ExpandingBoxSearch(values.sweepWidth, values.iterations, values.initialDirection)\n }\n if (values.searchType === 'creepingline') {\n return new CreepingLineAheadSearch(values.sweepWidth, values.legLength, values.iterations, values.initialDirection)\n }\n}\n\ninterface SearchConfigurationProps {\n updateSearch: (search?: SearchPattern) => void\n}\n\ninterface SearchConfigurationState {\n searchType: string\n sweepWidth: number\n legLength: number\n iterations: number\n initialDirection: number\n multiplier: number\n}\n\nclass SearchConfiguration extends React.Component<SearchConfigurationProps, SearchConfigurationState> {\n constructor(props: SearchConfigurationProps) {\n super(props)\n this.handleStateUpdate = this.handleStateUpdate.bind(this)\n this.handleChangeSearch = this.handleChangeSearch.bind(this)\n this.handleChangeSweepWidth = this.handleChangeSweepWidth.bind(this)\n this.handleChangeMultiplier = this.handleChangeMultiplier.bind(this)\n this.handleChangeLegLength = this.handleChangeLegLength.bind(this)\n this.handleChangeIterations = this.handleChangeIterations.bind(this)\n this.handleChangeDirection = this.handleChangeDirection.bind(this)\n this.state = {\n searchType: 'sector',\n sweepWidth: 200,\n legLength: 1000,\n iterations: 1,\n initialDirection: 0,\n multiplier: 1\n }\n }\n\n handleStateUpdate() {\n if (this.props.updateSearch !== undefined) {\n this.props.updateSearch(constructSearch(this.state))\n }\n }\n\n handleChangeSearch(event: React.ChangeEvent<HTMLSelectElement>) {\n const target = event.target\n const value = target.value\n\n this.setState({ searchType: value }, this.handleStateUpdate)\n }\n\n handleChangeSweepWidth(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = Number(target.value)\n\n this.setState({ sweepWidth: value }, this.handleStateUpdate)\n }\n\n handleChangeLegLength(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = Number(target.value)\n\n this.setState({ legLength: value }, this.handleStateUpdate)\n }\n\n handleChangeMultiplier(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = Number(target.value)\n\n this.setState({ multiplier: value }, this.handleStateUpdate)\n }\n\n handleChangeIterations(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = Number(target.value)\n\n this.setState({ iterations: value }, this.handleStateUpdate)\n }\n\n handleChangeDirection(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = Number(target.value)\n\n this.setState({ initialDirection: value }, this.handleStateUpdate)\n }\n\n render() {\n const labels = []\n const inputs = []\n if (this.state.searchType === 'sector' || this.state.searchType === 'expandingbox') {\n labels.push(<td key=\"iterations\">Iterations</td>)\n inputs.push(\n <td key=\"iterations\">\n <Form.Control type=\"number\" onChange={this.handleChangeIterations} value={this.state.iterations} />\n </td>\n )\n if (this.state.searchType === 'sector') {\n labels.push(<td key=\"multiplier\">Multiplier</td>)\n inputs.push(\n <td key=\"multiplier\">\n <Form.Control type=\"number\" onChange={this.handleChangeMultiplier} value={this.state.multiplier} />\n </td>\n )\n }\n labels.push(<td key=\"direction\">Initial Direction</td>)\n inputs.push(\n <td key=\"direction\">\n <Form.Control type=\"number\" onChange={this.handleChangeDirection} value={this.state.initialDirection} />\n </td>\n )\n } else if (this.state.searchType === 'creepingline') {\n labels.push(<td key=\"legs\">Leg Length</td>)\n labels.push(<td key=\"iterations\">Legs</td>)\n labels.push(<td key=\"direction\">Progress Direction</td>)\n inputs.push(\n <td key=\"legs\">\n <Form.Control type=\"number\" onChange={this.handleChangeLegLength} value={this.state.legLength} />\n </td>\n )\n inputs.push(\n <td key=\"iterations\">\n <Form.Control type=\"number\" onChange={this.handleChangeIterations} value={this.state.iterations} />\n </td>\n )\n inputs.push(\n <td key=\"direction\">\n <Form.Control type=\"number\" onChange={this.handleChangeDirection} value={this.state.initialDirection} />\n </td>\n )\n }\n return (\n <>\n <Table>\n <thead>\n <tr>\n <td>Search Type</td>\n <td>Sweep Width</td>\n {labels}\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <Form.Select onChange={this.handleChangeSearch}>\n <option value=\"sector\">Sector</option>\n <option value=\"expandingbox\">Expanding Box</option>\n <option value=\"creepingline\">Creeping Line</option>\n </Form.Select>\n </td>\n <td>\n <Form.Control type=\"number\" onChange={this.handleChangeSweepWidth} value={this.state.sweepWidth} />\n </td>\n {inputs}\n </tr>\n </tbody>\n </Table>\n </>\n )\n }\n}\n\nexport { SearchDisplay, SearchConfiguration }\n","class xy {\n x: number\n y: number\n constructor(x: number, y: number) {\n this.x = x\n this.y = y\n }\n}\n\nclass SearchLeg {\n from: xy\n to: xy\n bearing: number\n distance: number\n constructor(from: xy, to: xy, distance: number, bearing: number) {\n this.from = from\n this.to = to\n this.bearing = bearing\n this.distance = distance\n }\n}\n\nclass SearchPattern {\n sweepWidth: number\n searchLegs: SearchLeg[]\n currentLeg: number\n searchType?: string\n\n constructor(sweepWidth: number) {\n this.sweepWidth = sweepWidth\n this.searchLegs = []\n this.currentLeg = 1\n }\n\n get leg(): SearchLeg {\n return this.searchLegs[this.currentLeg - 1]\n }\n\n get complete(): boolean {\n return this.currentLeg > this.searchLegs.length\n }\n\n get length(): number {\n let length = 0\n for (const legIdx in this.searchLegs) {\n const tmpLeg = this.searchLegs[legIdx]\n length += tmpLeg.distance\n }\n return length\n }\n\n getLegs() {\n return this.searchLegs\n }\n\n nextLeg() {\n this.currentLeg++\n }\n\n uniqueKey(): string {\n return `${this.searchType}-${this.sweepWidth}-${this.searchLegs}-${this.currentLeg}`\n }\n}\n\nfunction move(from: xy, direction: number, distance: number) {\n const to = { x: 0, y: 0 }\n const rads = (direction * Math.PI) / 180\n to.x = from.x + Math.sin(rads) * distance\n to.y = from.y + Math.cos(rads) * distance\n return to\n}\n\nclass SectorSearch extends SearchPattern {\n startingDirection: number\n multiplier: number\n iterations: number\n\n constructor(sweepWidth: number, multiplier: number, iterations: number, startingDirection: number) {\n super(sweepWidth)\n this.searchType = 'sector'\n this.startingDirection = Number(startingDirection)\n if (this.startingDirection === undefined) {\n this.startingDirection = 0\n }\n this.multiplier = multiplier\n if (this.multiplier <= 0) {\n this.multiplier = 1\n }\n if (this.multiplier > 3) {\n this.multiplier = 3\n }\n this.iterations = iterations\n if (!(this.iterations === 1 || this.iterations === 2 || this.iterations === 3)) {\n this.iterations = 1\n }\n this.generateSearchLegs()\n }\n\n generateSearchLegs() {\n this.searchLegs = []\n let currentBearing = this.startingDirection\n let lastPoint = { x: 0, y: 0 }\n const legLength = this.sweepWidth * this.multiplier\n for (let i = 1; i < 9 * this.iterations + 1; i++) {\n const from = lastPoint\n let to = { x: 0, y: 0 }\n if (i % 3 !== 0) {\n to = move(from, currentBearing, legLength)\n }\n this.searchLegs.push(new SearchLeg(from, to, legLength, currentBearing))\n if (i % 3 === 0) {\n if (i % 9 === 0) {\n currentBearing = (currentBearing + 30) % 360\n }\n } else {\n currentBearing = (currentBearing + 120) % 360\n }\n lastPoint = to\n }\n }\n\n uniqueKey(): string {\n return `${this.searchType}-${this.sweepWidth}-${this.searchLegs}-${this.currentLeg}-${this.startingDirection}-${this.multiplier}-${this.iterations}`\n }\n}\n\nclass ExpandingBoxSearch extends SearchPattern {\n iterations: number\n startingDirection: number\n\n constructor(sweepWidth: number, iterations: number, startingDirection: number) {\n super(sweepWidth)\n this.searchType = 'expandingbox'\n this.iterations = iterations\n this.startingDirection = Number(startingDirection)\n this.generateSearchLegs()\n }\n\n generateSearchLegs() {\n this.searchLegs = []\n let direction = this.startingDirection\n let from = { x: 0, y: 0 }\n for (let i = 0; i < this.iterations * 4; i++) {\n const legLength = this.sweepWidth * (1 + Math.round((i - 1) / 2))\n const to = move(from, direction, legLength)\n this.searchLegs.push(new SearchLeg(from, to, this.sweepWidth * (1 + Math.round((i - 1) / 2)), direction))\n direction = (direction + 90) % 360\n from = to\n }\n }\n\n uniqueKey(): string {\n return `${this.searchType}-${this.sweepWidth}-${this.searchLegs}-${this.currentLeg}-${this.startingDirection}-${this.iterations}`\n }\n}\n\nclass CreepingLineAheadSearch extends SearchPattern {\n legLength: number\n legs: number\n progressDirection: number\n\n constructor(sweepWidth: number, legLength: number, legs: number, progressDirection: number) {\n super(sweepWidth)\n this.searchType = 'creepingline'\n this.legLength = Number(legLength)\n this.legs = Number(legs)\n this.progressDirection = Number(progressDirection)\n this.generateSearchLegs()\n }\n\n generateSearchLegs() {\n this.searchLegs = []\n const baseNear: xy = new xy(0, 0)\n const baseFar = move(baseNear, this.progressDirection + 90, this.legLength)\n for (let i = 1; i < this.legs * 2; i++) {\n let direction = this.progressDirection\n let from\n let to\n let distance\n const leg = Math.round(i / 2)\n if (i % 4 === 0) {\n from = move(baseNear, this.progressDirection, this.sweepWidth * leg)\n to = move(baseNear, this.progressDirection, this.sweepWidth * (leg + 1))\n distance = this.sweepWidth\n } else if (i % 4 === 1) {\n from = move(baseNear, this.progressDirection, this.sweepWidth * leg)\n to = move(baseFar, this.progressDirection, this.sweepWidth * leg)\n direction = (direction + 90) % 360\n distance = this.legLength\n } else if (i % 4 === 2) {\n from = move(baseFar, this.progressDirection, this.sweepWidth * leg)\n to = move(baseFar, this.progressDirection, this.sweepWidth * (leg + 1))\n distance = this.sweepWidth\n } else {\n from = move(baseFar, this.progressDirection, this.sweepWidth * leg)\n to = move(baseNear, this.progressDirection, this.sweepWidth * leg)\n direction = (direction + 270) % 360\n distance = this.legLength\n }\n this.searchLegs.push(new SearchLeg(from, to, distance, direction))\n }\n }\n\n uniqueKey(): string {\n return `${this.searchType}-${this.sweepWidth}-${this.searchLegs}-${this.currentLeg}-${this.legLength}-${this.legs}-${this.progressDirection}`\n }\n}\n\nexport { SearchPattern, SearchLeg, SectorSearch, ExpandingBoxSearch, CreepingLineAheadSearch }\n"],"mappings":"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","names":[]}