Mercurial > localebrowser
changeset 258:3ba7e2c77222
Add Cardinal-Spline Edges
author | Markus Kaiser <markus.kaiser@in.tum.de> |
---|---|
date | Thu, 30 Aug 2012 17:35:45 +0200 |
parents | 59fb9e37dcfb |
children | e7d9961d9cd9 |
files | src/isabelle/LocaleBrowser/shapes.scala src/isabelle/LocaleBrowser/visualizer.scala |
diffstat | 2 files changed, 54 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/isabelle/LocaleBrowser/shapes.scala Thu Aug 30 17:22:22 2012 +0200 +++ b/src/isabelle/LocaleBrowser/shapes.scala Thu Aug 30 17:35:45 2012 +0200 @@ -111,6 +111,59 @@ } } + object Cardinal_Spline_Edge extends Edge { + private val stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND) + private val slack = 0.12 + + def paint(g: Graphics2D, vis: Visualizer, peer: (String, String)) { + val ((fx, fy), (tx, ty)) = (vis.Coordinates(peer._1), vis.Coordinates(peer._2)) + val dummies = { + val (min, max) = (math.min(fy, ty), math.max(fy, ty)) + + vis.Coordinates(peer).filter({case (_, y) => y > min && y < max}) + } + + if (dummies.isEmpty) Straight_Edge.paint(g, vis, peer) + else { + val path = new GeneralPath(Path2D.WIND_EVEN_ODD, dummies.length + 2) + path.moveTo(fx, fy) + + val coords = ((fx, fy) :: dummies ::: List((tx, ty))) + val (dx, dy) = (coords(2)._1 - coords(0)._1, coords(2)._2 - coords(0)._2) + + val (dx2, dy2) = + ((dx, dy) /: coords.sliding(3))({ + case ((dx, dy), List((lx, ly), (mx, my), (rx, ry))) => { + val (dx2, dy2) = (rx - lx, ry - ly) + + path.curveTo(lx + slack * dx , ly + slack * dy, + mx - slack * dx2, my - slack * dy2, + mx , my) + (dx2, dy2) + } + }) + + val (lx, ly) = dummies.last + path.curveTo(lx + slack * dx2, ly + slack * dy2, + tx - slack * dx2, ty - slack * dy2, + tx , ty) + + dummies.foreach({ + case (x, y) => { + val at = AffineTransform.getTranslateInstance(x, y) + Dummy.paint_transformed(g, vis, None, at) + } + }) + + g.setStroke(stroke) + g.setColor(vis.Color(peer)) + g.draw(path) + + Arrow_Head.paint(g, path, vis.Drawer.shape(g, Some(peer._2))) + } + } + } + object Arrow_Head { type Point = (Double, Double)
--- a/src/isabelle/LocaleBrowser/visualizer.scala Thu Aug 30 17:22:22 2012 +0200 +++ b/src/isabelle/LocaleBrowser/visualizer.scala Thu Aug 30 17:35:45 2012 +0200 @@ -79,7 +79,7 @@ } def apply(g: Graphics2D, e: (String, String)) = { - Straight_Edge.paint(g, visualizer, e) + Cardinal_Spline_Edge.paint(g, visualizer, e) } def shape(g: Graphics2D, n: Option[String]): Shape = n match {