Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

99 rindas
2.4KB

  1. // Package pattern defines a pattern that can be drawn to a canvas.
  2. package pattern
  3. import (
  4. "fmt"
  5. "git.wtrh.nl/patterns/gopatterns/pkg/pattern/point"
  6. "git.wtrh.nl/patterns/gopatterns/pkg/pattern/text"
  7. "github.com/tdewolff/canvas"
  8. "golang.org/x/image/font/gofont/goregular"
  9. "gopkg.in/Knetic/govaluate.v3"
  10. )
  11. // Pattern contains all the points, lines and dimensions to draw a pattern to a canvas.
  12. type Pattern struct {
  13. points map[point.ID]point.Point
  14. lines []pathDrawer
  15. dimensions Dimensions
  16. texts []*text.Text
  17. }
  18. type pathDrawer interface {
  19. Draw(c *canvas.Canvas) error
  20. }
  21. // AddPoint adds a point.Point to the pattern.
  22. func (p *Pattern) AddPoint(point point.Point) {
  23. p.points[point.ID()] = point
  24. }
  25. // AddLine adds a drawable line to the pattern.
  26. func (p *Pattern) AddLine(line pathDrawer) {
  27. p.lines = append(p.lines, line)
  28. }
  29. // GetPoints returns a slice with points for the given IDs.
  30. func (p *Pattern) GetPoints(id ...point.ID) []point.Point {
  31. points := make([]point.Point, 0, len(id))
  32. for _, i := range id {
  33. points = append(points, p.GetPoint(i))
  34. }
  35. return points
  36. }
  37. // GetPoint returns the point for the given ID.
  38. func (p *Pattern) GetPoint(id point.ID) point.Point { //nolint:ireturn
  39. return p.points[id]
  40. }
  41. // NewPattern returns a new Pattern.
  42. func NewPattern() *Pattern {
  43. return &Pattern{
  44. points: make(map[point.ID]point.Point, 32),
  45. lines: make([]pathDrawer, 0, 32),
  46. dimensions: make(Dimensions),
  47. texts: make([]*text.Text, 0),
  48. }
  49. }
  50. // ToCanvas draws the pattern on the provided [canvas.Canvas].
  51. func (p *Pattern) ToCanvas(c *canvas.Canvas, debug bool) error {
  52. fontDejaVu := canvas.NewFontFamily("latin")
  53. if err := fontDejaVu.LoadFont(goregular.TTF, 0, canvas.FontRegular); err != nil {
  54. panic(err)
  55. }
  56. face := fontDejaVu.Face(12.0, canvas.Black, canvas.FontRegular)
  57. for _, pp := range p.points {
  58. point.Draw(c, pp, face, debug)
  59. }
  60. for _, path := range p.lines {
  61. err := path.Draw(c)
  62. if err != nil {
  63. return fmt.Errorf("draw path to canvas: %w", err)
  64. }
  65. }
  66. for _, t := range p.texts {
  67. t.ToCanvas(c, face)
  68. }
  69. return nil
  70. }
  71. // Parameters return the parameters based on the dimensions.
  72. func (p *Pattern) Parameters() govaluate.MapParameters {
  73. return p.dimensions.Parameters()
  74. }
  75. func (p *Pattern) AddText(t *text.Text) {
  76. p.texts = append(p.texts, t)
  77. }
  78. func (p *Pattern) SetDimensions(dimensions Dimensions) {
  79. p.dimensions = dimensions
  80. }