Move math and random files into their respective modules (#198)
* Move math and random files into their respective modules - Move distanceBetweenPointAndSegment to math module - Move LCG, randomSeed, and withCustomMathRandom to random module * Add everything else back
This commit is contained in:
		
							parent
							
								
									b3667000e2
								
							
						
					
					
						commit
						e3eef04e00
					
				|  | @ -5,7 +5,10 @@ import { RoughCanvas } from "roughjs/bin/canvas"; | ||||||
| import { TwitterPicker } from "react-color"; | import { TwitterPicker } from "react-color"; | ||||||
| 
 | 
 | ||||||
| import { moveOneLeft, moveAllLeft, moveOneRight, moveAllRight } from "./zindex"; | import { moveOneLeft, moveAllLeft, moveOneRight, moveAllRight } from "./zindex"; | ||||||
|  | import { LCG, randomSeed, withCustomMathRandom } from "./random"; | ||||||
|  | import { distanceBetweenPointAndSegment } from "./math"; | ||||||
| import { roundRect } from "./roundRect"; | import { roundRect } from "./roundRect"; | ||||||
|  | 
 | ||||||
| import EditableText from "./components/EditableText"; | import EditableText from "./components/EditableText"; | ||||||
| 
 | 
 | ||||||
| import "./styles.scss"; | import "./styles.scss"; | ||||||
|  | @ -55,64 +58,6 @@ function restoreHistoryEntry(entry: string) { | ||||||
|   skipHistory = true; |   skipHistory = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript/47593316#47593316
 |  | ||||||
| const LCG = (seed: number) => () => |  | ||||||
|   ((2 ** 31 - 1) & (seed = Math.imul(48271, seed))) / 2 ** 31; |  | ||||||
| 
 |  | ||||||
| function randomSeed() { |  | ||||||
|   return Math.floor(Math.random() * 2 ** 31); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Unfortunately, roughjs doesn't support a seed attribute (https://github.com/pshihn/rough/issues/27).
 |  | ||||||
| // We can achieve the same result by overriding the Math.random function with a
 |  | ||||||
| // pseudo random generator that supports a random seed and swapping it back after.
 |  | ||||||
| function withCustomMathRandom<T>(seed: number, cb: () => T): T { |  | ||||||
|   const random = Math.random; |  | ||||||
|   Math.random = LCG(seed); |  | ||||||
|   const result = cb(); |  | ||||||
|   Math.random = random; |  | ||||||
|   return result; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // https://stackoverflow.com/a/6853926/232122
 |  | ||||||
| function distanceBetweenPointAndSegment( |  | ||||||
|   x: number, |  | ||||||
|   y: number, |  | ||||||
|   x1: number, |  | ||||||
|   y1: number, |  | ||||||
|   x2: number, |  | ||||||
|   y2: number |  | ||||||
| ) { |  | ||||||
|   const A = x - x1; |  | ||||||
|   const B = y - y1; |  | ||||||
|   const C = x2 - x1; |  | ||||||
|   const D = y2 - y1; |  | ||||||
| 
 |  | ||||||
|   const dot = A * C + B * D; |  | ||||||
|   const lenSquare = C * C + D * D; |  | ||||||
|   let param = -1; |  | ||||||
|   if (lenSquare !== 0) { |  | ||||||
|     // in case of 0 length line
 |  | ||||||
|     param = dot / lenSquare; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   let xx, yy; |  | ||||||
|   if (param < 0) { |  | ||||||
|     xx = x1; |  | ||||||
|     yy = y1; |  | ||||||
|   } else if (param > 1) { |  | ||||||
|     xx = x2; |  | ||||||
|     yy = y2; |  | ||||||
|   } else { |  | ||||||
|     xx = x1 + param * C; |  | ||||||
|     yy = y1 + param * D; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   const dx = x - xx; |  | ||||||
|   const dy = y - yy; |  | ||||||
|   return Math.hypot(dx, dy); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function hitTest(element: ExcalidrawElement, x: number, y: number): boolean { | function hitTest(element: ExcalidrawElement, x: number, y: number): boolean { | ||||||
|   // For shapes that are composed of lines, we only enable point-selection when the distance
 |   // For shapes that are composed of lines, we only enable point-selection when the distance
 | ||||||
|   // of the click is less than x pixels of any of the lines that the shape is composed of
 |   // of the click is less than x pixels of any of the lines that the shape is composed of
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | // https://stackoverflow.com/a/6853926/232122
 | ||||||
|  | export function distanceBetweenPointAndSegment( | ||||||
|  |   x: number, | ||||||
|  |   y: number, | ||||||
|  |   x1: number, | ||||||
|  |   y1: number, | ||||||
|  |   x2: number, | ||||||
|  |   y2: number | ||||||
|  | ) { | ||||||
|  |   const A = x - x1; | ||||||
|  |   const B = y - y1; | ||||||
|  |   const C = x2 - x1; | ||||||
|  |   const D = y2 - y1; | ||||||
|  | 
 | ||||||
|  |   const dot = A * C + B * D; | ||||||
|  |   const lenSquare = C * C + D * D; | ||||||
|  |   let param = -1; | ||||||
|  |   if (lenSquare !== 0) { | ||||||
|  |     // in case of 0 length line
 | ||||||
|  |     param = dot / lenSquare; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let xx, yy; | ||||||
|  |   if (param < 0) { | ||||||
|  |     xx = x1; | ||||||
|  |     yy = y1; | ||||||
|  |   } else if (param > 1) { | ||||||
|  |     xx = x2; | ||||||
|  |     yy = y2; | ||||||
|  |   } else { | ||||||
|  |     xx = x1 + param * C; | ||||||
|  |     yy = y1 + param * D; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const dx = x - xx; | ||||||
|  |   const dy = y - yy; | ||||||
|  |   return Math.hypot(dx, dy); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | // https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript/47593316#47593316
 | ||||||
|  | export const LCG = (seed: number) => () => | ||||||
|  |   ((2 ** 31 - 1) & (seed = Math.imul(48271, seed))) / 2 ** 31; | ||||||
|  | 
 | ||||||
|  | export function randomSeed() { | ||||||
|  |   return Math.floor(Math.random() * 2 ** 31); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Unfortunately, roughjs doesn't support a seed attribute (https://github.com/pshihn/rough/issues/27).
 | ||||||
|  | // We can achieve the same result by overriding the Math.random function with a
 | ||||||
|  | // pseudo random generator that supports a random seed and swapping it back after.
 | ||||||
|  | export function withCustomMathRandom<T>(seed: number, cb: () => T): T { | ||||||
|  |   const random = Math.random; | ||||||
|  |   Math.random = LCG(seed); | ||||||
|  |   const result = cb(); | ||||||
|  |   Math.random = random; | ||||||
|  |   return result; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue