You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

svg.ts 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Some helpers for drawing SVGs.
  2. import { getSweep } from 'utils/utils'
  3. // General
  4. export default class Svg {
  5. static ellipse = (A: number[], r: number): string => {
  6. return `M ${A[0] - r},${A[1]}
  7. a ${r},${r} 0 1,0 ${r * 2},0
  8. a ${r},${r} 0 1,0 -${r * 2},0 `
  9. }
  10. static moveTo = (v: number[]): string => {
  11. return `M ${v[0]},${v[1]} `
  12. }
  13. static lineTo = (v: number[]): string => {
  14. return `L ${v[0]},${v[1]} `
  15. }
  16. static line = (a: number[], ...pts: number[][]): string => {
  17. return Svg.moveTo(a) + pts.map((p): string => Svg.lineTo(p)).join()
  18. }
  19. static hLineTo = (v: number[]): string => {
  20. return `H ${v[0]},${v[1]} `
  21. }
  22. static vLineTo = (v: number[]): string => {
  23. return `V ${v[0]},${v[1]} `
  24. }
  25. static bezierTo = (A: number[], B: number[], C: number[]): string => {
  26. return `C ${A[0]},${A[1]} ${B[0]},${B[1]} ${C[0]},${C[1]} `
  27. }
  28. static arcTo = (C: number[], r: number, A: number[], B: number[]): string => {
  29. return [
  30. Svg.moveTo(A),
  31. 'A',
  32. r,
  33. r,
  34. 0,
  35. getSweep(C, A, B) > 0 ? '1' : '0',
  36. 0,
  37. B[0],
  38. B[1],
  39. ].join(' ')
  40. }
  41. static closePath = (): string => {
  42. return 'Z'
  43. }
  44. static rectTo = (A: number[]): string => {
  45. return ['R', A[0], A[1]].join(' ')
  46. }
  47. static getPointAtLength = (
  48. path: SVGPathElement,
  49. length: number
  50. ): number[] => {
  51. const point = path.getPointAtLength(length)
  52. return [point.x, point.y]
  53. }
  54. }