Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

74 wiersze
1.5KB

  1. package util
  2. import (
  3. "fmt"
  4. "strconv"
  5. svg "github.com/ajstarks/svgo/float"
  6. )
  7. type PointMap map[int]Point
  8. func (pm PointMap) Scale(s float64) PointMap {
  9. pointMap := make(PointMap, len(pm))
  10. for i, p := range pm {
  11. pointMap[i] = p.Multiply(s)
  12. }
  13. return pointMap
  14. }
  15. func (pm PointMap) Box() (Point, Point) {
  16. min := Point{}
  17. max := Point{}
  18. for _, p := range pm {
  19. min = min.Min(p)
  20. max = max.Max(p)
  21. }
  22. return min, max
  23. }
  24. func (pm PointMap) Offset(point Point) PointMap {
  25. pointMap := make(PointMap, len(pm))
  26. for i, p := range pm {
  27. pointMap[i] = p.Subtract(point)
  28. }
  29. return pointMap
  30. }
  31. func (pm PointMap) Normalize() PointMap {
  32. min, _ := pm.Box()
  33. return pm.Offset(min)
  34. }
  35. func (pm PointMap) Draw(canvas *svg.SVG) {
  36. for i, point := range pm.Normalize() {
  37. canvas.Circle(point.X, point.Y, 2.0, "stroke:black;fill:black")
  38. canvas.Text(point.X+2, point.Y+2, strconv.Itoa(i))
  39. }
  40. }
  41. func (pm PointMap) Line(canvas *svg.SVG, lines ...int) {
  42. for i := 0; i < len(lines)-1; i++ {
  43. start := lines[i]
  44. end := lines[i+1]
  45. canvas.Line(pm[start].X, pm[start].Y, pm[end].X, pm[end].Y, "stroke:black;stroke-width:3")
  46. }
  47. }
  48. func (pm PointMap) Bezier(canvas *svg.SVG, lines ...int) error {
  49. if len(lines) != 4 {
  50. return fmt.Errorf("expected 4 line definitons, got %d instead", len(lines))
  51. }
  52. canvas.Bezier(pm[lines[0]].X, pm[lines[0]].Y, pm[lines[1]].X, pm[lines[1]].Y, pm[lines[2]].X, pm[lines[2]].Y, pm[lines[3]].X, pm[lines[3]].Y, "stroke:black;fill:none")
  53. return nil
  54. }