bounded rotate works, ish
This commit is contained in:
parent
8f56e5939b
commit
a1835a532d
7 changed files with 60 additions and 27 deletions
|
@ -24,12 +24,12 @@ func drawChart(res http.ResponseWriter, req *http.Request) {
|
||||||
TextRotationDegrees: 45.0,
|
TextRotationDegrees: 45.0,
|
||||||
},
|
},
|
||||||
Ticks: []chart.Tick{
|
Ticks: []chart.Tick{
|
||||||
{0.0, "0.00"},
|
{Value: 0.0, Label: "0.00"},
|
||||||
{2.0, "2.00"},
|
{Value: 2.0, Label: "2.00"},
|
||||||
{4.0, "4.00"},
|
{Value: 4.0, Label: "4.00"},
|
||||||
{6.0, "6.00"},
|
{Value: 6.0, Label: "6.00"},
|
||||||
{8.0, "Eight"},
|
{Value: 8.0, Label: "Eight"},
|
||||||
{10.0, "Ten"},
|
{Value: 10.0, Label: "Ten"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
XAxis: chart.XAxis{
|
XAxis: chart.XAxis{
|
||||||
|
@ -40,12 +40,12 @@ func drawChart(res http.ResponseWriter, req *http.Request) {
|
||||||
TextRotationDegrees: 45.0,
|
TextRotationDegrees: 45.0,
|
||||||
},
|
},
|
||||||
Ticks: []chart.Tick{
|
Ticks: []chart.Tick{
|
||||||
{0.0, "0.00"},
|
{Value: 0.0, Label: "0.00"},
|
||||||
{2.0, "2.00"},
|
{Value: 2.0, Label: "2.00"},
|
||||||
{4.0, "4.00"},
|
{Value: 4.0, Label: "4.00"},
|
||||||
{6.0, "6.00"},
|
{Value: 6.0, Label: "6.00"},
|
||||||
{8.0, "Eight"},
|
{Value: 8.0, Label: "Eight"},
|
||||||
{10.0, "Ten"},
|
{Value: 10.0, Label: "Ten"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Series: []chart.Series{
|
Series: []chart.Series{
|
||||||
|
@ -60,15 +60,28 @@ func drawChart(res http.ResponseWriter, req *http.Request) {
|
||||||
graph.Elements = []chart.Renderable{
|
graph.Elements = []chart.Renderable{
|
||||||
func(r chart.Renderer, cb chart.Box, defaults chart.Style) {
|
func(r chart.Renderer, cb chart.Box, defaults chart.Style) {
|
||||||
|
|
||||||
b := chart.Box{50, 50, 90, 110}
|
b := chart.Box{Top: 50, Left: 50, Right: 150, Bottom: 300}
|
||||||
|
|
||||||
|
cx, cy := b.Center()
|
||||||
|
|
||||||
|
chart.Draw.Box(r, chart.Box{Top: cy - 2, Left: cx - 2, Right: cx + 2, Bottom: cy + 2}, chart.Style{
|
||||||
|
StrokeWidth: 2,
|
||||||
|
StrokeColor: chart.ColorBlack,
|
||||||
|
})
|
||||||
|
|
||||||
chart.Draw.Box(r, b, chart.Style{
|
chart.Draw.Box(r, b, chart.Style{
|
||||||
StrokeWidth: 2,
|
StrokeWidth: 2,
|
||||||
StrokeColor: chart.ColorBlue,
|
StrokeColor: chart.ColorBlue,
|
||||||
})
|
})
|
||||||
chart.Draw.Box(r, b.Rotate(chart.Math.DegreesToRadians(45)), chart.Style{
|
chart.Draw.Box(r, b.BoundedRotate(chart.Math.DegreesToRadians(45)), chart.Style{
|
||||||
StrokeWidth: 2,
|
StrokeWidth: 2,
|
||||||
StrokeColor: chart.ColorRed,
|
StrokeColor: chart.ColorRed,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
chart.Draw.BoxRotated(r, b, chart.Math.DegreesToRadians(45), chart.Style{
|
||||||
|
StrokeWidth: 2,
|
||||||
|
StrokeColor: chart.ColorOrange,
|
||||||
|
})
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
graph.Render(chart.PNG, res)
|
graph.Render(chart.PNG, res)
|
||||||
|
|
16
box.go
16
box.go
|
@ -220,16 +220,20 @@ func (b Box) OuterConstrain(bounds, other Box) Box {
|
||||||
return newBox
|
return newBox
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rotate rotates a box's corners by a given radian rotation angle.
|
// BoundedRotate rotates a box's corners by a given radian rotation angle
|
||||||
func (b Box) Rotate(radians float64) Box {
|
// and returns the maximum bounds or clipping rectangle.
|
||||||
|
func (b Box) BoundedRotate(radians float64) Box {
|
||||||
cx, cy := b.Center()
|
cx, cy := b.Center()
|
||||||
|
|
||||||
ltx, lty := Math.RotateCoordinate(cx, cy, b.Left, b.Top, radians)
|
ltx, lty := Math.RotateCoordinate(cx, cy, b.Left, b.Top, radians)
|
||||||
|
lbx, lby := Math.RotateCoordinate(cx, cy, b.Left, b.Bottom, radians)
|
||||||
|
rtx, rty := Math.RotateCoordinate(cx, cy, b.Right, b.Top, radians)
|
||||||
rbx, rby := Math.RotateCoordinate(cx, cy, b.Right, b.Bottom, radians)
|
rbx, rby := Math.RotateCoordinate(cx, cy, b.Right, b.Bottom, radians)
|
||||||
|
|
||||||
return Box{
|
return Box{
|
||||||
Left: ltx,
|
Left: Math.MinInt(ltx, lbx),
|
||||||
Top: lty,
|
Top: Math.MinInt(lty, rty),
|
||||||
Right: rbx,
|
Right: Math.MaxInt(rtx, rbx),
|
||||||
Bottom: rby,
|
Bottom: Math.MaxInt(lby, rby),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,7 +158,7 @@ func TestBoxCenter(t *testing.T) {
|
||||||
assert.Equal(20, cy)
|
assert.Equal(20, cy)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBoxRotate(t *testing.T) {
|
func TestBoxBoundedRotate(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
b := Box{
|
b := Box{
|
||||||
|
@ -167,9 +167,9 @@ func TestBoxRotate(t *testing.T) {
|
||||||
Right: 20,
|
Right: 20,
|
||||||
Bottom: 10,
|
Bottom: 10,
|
||||||
}
|
}
|
||||||
rotated := b.Rotate(Math.DegreesToRadians(45))
|
rotated := b.BoundedRotate(Math.DegreesToRadians(45))
|
||||||
assert.Equal(1, rotated.Top)
|
assert.Equal(1, rotated.Top)
|
||||||
assert.Equal(4, rotated.Left)
|
assert.Equal(5, rotated.Left)
|
||||||
assert.Equal(10, rotated.Right)
|
assert.Equal(19, rotated.Right)
|
||||||
assert.Equal(14, rotated.Bottom)
|
assert.Equal(14, rotated.Bottom)
|
||||||
}
|
}
|
||||||
|
|
16
draw.go
16
draw.go
|
@ -219,6 +219,22 @@ func (d draw) Box(r Renderer, b Box, s Style) {
|
||||||
r.FillStroke()
|
r.FillStroke()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d draw) BoxRotated(r Renderer, b Box, thetaRadians float64, s Style) {
|
||||||
|
s.WriteToRenderer(r)
|
||||||
|
cx, cy := b.Center()
|
||||||
|
ltx, lty := Math.RotateCoordinate(cx, cy, b.Left, b.Top, thetaRadians)
|
||||||
|
lbx, lby := Math.RotateCoordinate(cx, cy, b.Left, b.Bottom, thetaRadians)
|
||||||
|
rtx, rty := Math.RotateCoordinate(cx, cy, b.Right, b.Top, thetaRadians)
|
||||||
|
rbx, rby := Math.RotateCoordinate(cx, cy, b.Right, b.Bottom, thetaRadians)
|
||||||
|
|
||||||
|
r.MoveTo(ltx, lty)
|
||||||
|
r.LineTo(rtx, rty)
|
||||||
|
r.LineTo(rbx, rby)
|
||||||
|
r.LineTo(lbx, lby)
|
||||||
|
r.Close()
|
||||||
|
r.FillStroke()
|
||||||
|
}
|
||||||
|
|
||||||
// DrawText draws text with a given style.
|
// DrawText draws text with a given style.
|
||||||
func (d draw) Text(r Renderer, text string, x, y int, style Style) {
|
func (d draw) Text(r Renderer, text string, x, y int, style Style) {
|
||||||
style.GetTextOptions().WriteToRenderer(r)
|
style.GetTextOptions().WriteToRenderer(r)
|
||||||
|
|
2
math.go
2
math.go
|
@ -225,7 +225,7 @@ func (m mathUtil) RotateCoordinate(cx, cy, x, y int, thetaRadians float64) (rx,
|
||||||
tempX, tempY := float64(x-cx), float64(y-cy)
|
tempX, tempY := float64(x-cx), float64(y-cy)
|
||||||
rotatedX := tempX*math.Cos(thetaRadians) - tempY*math.Sin(thetaRadians)
|
rotatedX := tempX*math.Cos(thetaRadians) - tempY*math.Sin(thetaRadians)
|
||||||
rotatedY := tempX*math.Sin(thetaRadians) + tempY*math.Cos(thetaRadians)
|
rotatedY := tempX*math.Sin(thetaRadians) + tempY*math.Cos(thetaRadians)
|
||||||
rx = int(rotatedX) + cy
|
rx = int(rotatedX) + cx
|
||||||
ry = int(rotatedY) + cy
|
ry = int(rotatedY) + cy
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,7 +187,7 @@ func (rr *rasterRenderer) MeasureText(body string) Box {
|
||||||
return textBox
|
return textBox
|
||||||
}
|
}
|
||||||
|
|
||||||
return textBox.Rotate(*rr.rotateRadians)
|
return textBox.BoundedRotate(*rr.rotateRadians)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTextRotation sets a text rotation.
|
// SetTextRotation sets a text rotation.
|
||||||
|
|
|
@ -170,7 +170,7 @@ func (vr *vectorRenderer) MeasureText(body string) (box Box) {
|
||||||
if vr.c.textTheta == nil {
|
if vr.c.textTheta == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
box = box.Rotate(*vr.c.textTheta)
|
box = box.BoundedRotate(*vr.c.textTheta)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue