Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

svg.ts 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Some helpers for drawing SVGs.
  2. import vec from './vec'
  3. import { getSweep } from 'utils/utils'
  4. // General
  5. export function ellipse(A: number[], r: number) {
  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. export function moveTo(v: number[]) {
  11. return `M ${v[0]},${v[1]} `
  12. }
  13. export function lineTo(v: number[]) {
  14. return `L ${v[0]},${v[1]} `
  15. }
  16. export function line(a: number[], ...pts: number[][]) {
  17. return moveTo(a) + pts.map((p) => lineTo(p)).join()
  18. }
  19. export function hLineTo(v: number[]) {
  20. return `H ${v[0]},${v[1]} `
  21. }
  22. export function vLineTo(v: number[]) {
  23. return `V ${v[0]},${v[1]} `
  24. }
  25. export function bezierTo(A: number[], B: number[], C: number[]) {
  26. return `C ${A[0]},${A[1]} ${B[0]},${B[1]} ${C[0]},${C[1]} `
  27. }
  28. export function arcTo(C: number[], r: number, A: number[], B: number[]) {
  29. return [
  30. 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. export function closePath() {
  42. return 'Z'
  43. }
  44. export function rectTo(A: number[]) {
  45. return ['R', A[0], A[1]].join(' ')
  46. }
  47. export function getPointAtLength(path: SVGPathElement, length: number) {
  48. const point = path.getPointAtLength(length)
  49. return [point.x, point.y]
  50. }