| author | wenzelm | 
| Wed, 18 Oct 2017 11:53:01 +0200 | |
| changeset 66879 | 593053cac3be | 
| parent 62812 | ce22e5c3d4ce | 
| child 73340 | 0ffcad1f6130 | 
| permissions | -rw-r--r-- | 
| 59202 | 1  | 
/* Title: Tools/Graphview/shapes.scala  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
2  | 
Author: Markus Kaiser, TU Muenchen  | 
| 59240 | 3  | 
Author: Makarius  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
4  | 
|
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
5  | 
Drawable shapes.  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
6  | 
*/  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
7  | 
|
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
8  | 
package isabelle.graphview  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
9  | 
|
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
10  | 
|
| 
59245
 
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
 
wenzelm 
parents: 
59242 
diff
changeset
 | 
11  | 
import isabelle._  | 
| 
 
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
 
wenzelm 
parents: 
59242 
diff
changeset
 | 
12  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
13  | 
import java.awt.{BasicStroke, Graphics2D, Shape}
 | 
| 59410 | 14  | 
import java.awt.geom.{AffineTransform, GeneralPath, Path2D, Rectangle2D,
 | 
15  | 
RoundRectangle2D, PathIterator}  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
16  | 
|
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
17  | 
|
| 50467 | 18  | 
object Shapes  | 
19  | 
{
 | 
|
| 59249 | 20  | 
private val default_stroke =  | 
21  | 
new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)  | 
|
22  | 
||
| 59384 | 23  | 
def shape(info: Layout.Info): Rectangle2D.Double =  | 
24  | 
new Rectangle2D.Double(info.x - info.width2, info.y - info.height2, info.width, info.height)  | 
|
25  | 
||
| 59459 | 26  | 
def highlight_node(gfx: Graphics2D, graphview: Graphview, node: Graph_Display.Node)  | 
| 59410 | 27  | 
  {
 | 
| 59459 | 28  | 
val metrics = graphview.metrics  | 
| 59410 | 29  | 
val extra = metrics.char_width  | 
| 59459 | 30  | 
val info = graphview.layout.get_node(node)  | 
| 59410 | 31  | 
|
| 59459 | 32  | 
gfx.setColor(graphview.highlight_color)  | 
| 59410 | 33  | 
gfx.fill(new Rectangle2D.Double(  | 
34  | 
info.x - info.width2 - extra,  | 
|
35  | 
info.y - info.height2 - extra,  | 
|
36  | 
info.width + 2 * extra,  | 
|
37  | 
info.height + 2 * extra))  | 
|
38  | 
}  | 
|
39  | 
||
| 59459 | 40  | 
def paint_node(gfx: Graphics2D, graphview: Graphview, node: Graph_Display.Node)  | 
| 50467 | 41  | 
  {
 | 
| 59459 | 42  | 
val metrics = graphview.metrics  | 
43  | 
val info = graphview.layout.get_node(node)  | 
|
44  | 
val c = graphview.node_color(node)  | 
|
| 59384 | 45  | 
val s = shape(info)  | 
46  | 
||
47  | 
gfx.setColor(c.background)  | 
|
48  | 
gfx.fill(s)  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
49  | 
|
| 59384 | 50  | 
gfx.setColor(c.border)  | 
51  | 
gfx.setStroke(default_stroke)  | 
|
52  | 
gfx.draw(s)  | 
|
| 59236 | 53  | 
|
| 59384 | 54  | 
gfx.setColor(c.foreground)  | 
55  | 
gfx.setFont(metrics.font)  | 
|
| 59242 | 56  | 
|
| 59384 | 57  | 
val text_width =  | 
58  | 
      (0.0 /: info.lines) { case (w, line) => w max metrics.string_bounds(line).getWidth }
 | 
|
59  | 
val text_height =  | 
|
60  | 
(info.lines.length max 1) * metrics.height.ceil  | 
|
61  | 
val x = (s.getCenterX - text_width / 2).round.toInt  | 
|
62  | 
var y = (s.getCenterY - text_height / 2 + metrics.ascent).round.toInt  | 
|
| 
62812
 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
63  | 
    for (line <- info.lines) {
 | 
| 
 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
64  | 
gfx.drawString(Word.bidi_override(line), x, y)  | 
| 
 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
65  | 
y += metrics.height.ceil.toInt  | 
| 
 
ce22e5c3d4ce
more robust display of bidirectional Unicode text: enforce left-to-right;
 
wenzelm 
parents: 
60215 
diff
changeset
 | 
66  | 
}  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
67  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
68  | 
|
| 59459 | 69  | 
def paint_dummy(gfx: Graphics2D, graphview: Graphview, info: Layout.Info)  | 
| 50467 | 70  | 
  {
 | 
| 59384 | 71  | 
gfx.setStroke(default_stroke)  | 
| 59459 | 72  | 
gfx.setColor(graphview.dummy_color)  | 
| 59384 | 73  | 
gfx.draw(shape(info))  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
74  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
75  | 
|
| 59248 | 76  | 
object Straight_Edge  | 
| 50467 | 77  | 
  {
 | 
| 59459 | 78  | 
def paint(gfx: Graphics2D, graphview: Graphview, edge: Graph_Display.Edge)  | 
| 50464 | 79  | 
    {
 | 
| 59459 | 80  | 
val p = graphview.layout.get_node(edge._1)  | 
81  | 
val q = graphview.layout.get_node(edge._2)  | 
|
| 50468 | 82  | 
val ds =  | 
83  | 
      {
 | 
|
| 59262 | 84  | 
val a = p.y min q.y  | 
85  | 
val b = p.y max q.y  | 
|
| 59459 | 86  | 
graphview.layout.dummies_iterator(edge).filter(d => a < d.y && d.y < b).toList  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
87  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
88  | 
val path = new GeneralPath(Path2D.WIND_EVEN_ODD, ds.length + 2)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
89  | 
|
| 59262 | 90  | 
path.moveTo(p.x, p.y)  | 
91  | 
ds.foreach(d => path.lineTo(d.x, d.y))  | 
|
92  | 
path.lineTo(q.x, q.y)  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
93  | 
|
| 59459 | 94  | 
if (graphview.show_dummies) ds.foreach(paint_dummy(gfx, graphview, _))  | 
| 50467 | 95  | 
|
| 59250 | 96  | 
gfx.setStroke(default_stroke)  | 
| 59459 | 97  | 
gfx.setColor(graphview.edge_color(edge, p.y < q.y))  | 
| 59250 | 98  | 
gfx.draw(path)  | 
| 50467 | 99  | 
|
| 59459 | 100  | 
if (graphview.show_arrow_heads) Arrow_Head.paint(gfx, path, Shapes.shape(q))  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
101  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
102  | 
}  | 
| 50467 | 103  | 
|
| 59248 | 104  | 
object Cardinal_Spline_Edge  | 
| 50467 | 105  | 
  {
 | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
106  | 
private val slack = 0.1  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
107  | 
|
| 59459 | 108  | 
def paint(gfx: Graphics2D, graphview: Graphview, edge: Graph_Display.Edge)  | 
| 50464 | 109  | 
    {
 | 
| 59459 | 110  | 
val p = graphview.layout.get_node(edge._1)  | 
111  | 
val q = graphview.layout.get_node(edge._2)  | 
|
| 50468 | 112  | 
val ds =  | 
113  | 
      {
 | 
|
| 59262 | 114  | 
val a = p.y min q.y  | 
115  | 
val b = p.y max q.y  | 
|
| 59459 | 116  | 
graphview.layout.dummies_iterator(edge).filter(d => a < d.y && d.y < b).toList  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
117  | 
}  | 
| 50467 | 118  | 
|
| 59459 | 119  | 
if (ds.isEmpty) Straight_Edge.paint(gfx, graphview, edge)  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
120  | 
      else {
 | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
121  | 
val path = new GeneralPath(Path2D.WIND_EVEN_ODD, ds.length + 2)  | 
| 59262 | 122  | 
path.moveTo(p.x, p.y)  | 
| 50467 | 123  | 
|
| 59262 | 124  | 
val coords = p :: ds ::: List(q)  | 
125  | 
val dx = coords(2).x - coords(0).x  | 
|
126  | 
val dy = coords(2).y - coords(0).y  | 
|
| 50467 | 127  | 
|
128  | 
val (dx2, dy2) =  | 
|
| 59262 | 129  | 
          ((dx, dy) /: coords.sliding(3)) {
 | 
130  | 
case ((dx, dy), List(l, m, r)) =>  | 
|
131  | 
val dx2 = r.x - l.x  | 
|
132  | 
val dy2 = r.y - l.y  | 
|
133  | 
path.curveTo(  | 
|
134  | 
l.x + slack * dx, l.y + slack * dy,  | 
|
135  | 
m.x - slack * dx2, m.y - slack * dy2,  | 
|
136  | 
m.x, m.y)  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
137  | 
(dx2, dy2)  | 
| 59262 | 138  | 
}  | 
| 50467 | 139  | 
|
| 59262 | 140  | 
val l = ds.last  | 
141  | 
path.curveTo(  | 
|
142  | 
l.x + slack * dx2, l.y + slack * dy2,  | 
|
143  | 
q.x - slack * dx2, q.y - slack * dy2,  | 
|
144  | 
q.x, q.y)  | 
|
| 50467 | 145  | 
|
| 59459 | 146  | 
if (graphview.show_dummies) ds.foreach(paint_dummy(gfx, graphview, _))  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
147  | 
|
| 59250 | 148  | 
gfx.setStroke(default_stroke)  | 
| 59459 | 149  | 
gfx.setColor(graphview.edge_color(edge, p.y < q.y))  | 
| 59250 | 150  | 
gfx.draw(path)  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
151  | 
|
| 59459 | 152  | 
if (graphview.show_arrow_heads) Arrow_Head.paint(gfx, path, Shapes.shape(q))  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
153  | 
}  | 
| 50467 | 154  | 
}  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
155  | 
}  | 
| 50467 | 156  | 
|
157  | 
object Arrow_Head  | 
|
158  | 
  {
 | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
159  | 
type Point = (Double, Double)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
160  | 
|
| 50467 | 161  | 
private def position(path: GeneralPath, shape: Shape): Option[AffineTransform] =  | 
162  | 
    {
 | 
|
163  | 
def intersecting_line(path: GeneralPath, shape: Shape): Option[(Point, Point)] =  | 
|
164  | 
      {
 | 
|
| 49745 | 165  | 
val i = path.getPathIterator(null, 1.0)  | 
| 
59245
 
be4180f3c236
more formal Graph_Display.Node (with ordering) and Graph_Display.Edge;
 
wenzelm 
parents: 
59242 
diff
changeset
 | 
166  | 
val seg = Array[Double](0.0, 0.0, 0.0, 0.0, 0.0, 0.0)  | 
| 49745 | 167  | 
var p1 = (0.0, 0.0)  | 
168  | 
var p2 = (0.0, 0.0)  | 
|
| 60215 | 169  | 
        while (!i.isDone) {
 | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
170  | 
          i.currentSegment(seg) match {
 | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
171  | 
case PathIterator.SEG_MOVETO => p2 = (seg(0), seg(1))  | 
| 50467 | 172  | 
case PathIterator.SEG_LINETO =>  | 
173  | 
p1 = p2  | 
|
174  | 
p2 = (seg(0), seg(1))  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
175  | 
|
| 50467 | 176  | 
if(shape.contains(seg(0), seg(1)))  | 
177  | 
return Some((p1, p2))  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
178  | 
case _ =>  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
179  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
180  | 
i.next()  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
181  | 
}  | 
| 50467 | 182  | 
None  | 
183  | 
}  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
184  | 
|
| 50467 | 185  | 
def binary_search(line: (Point, Point), shape: Shape): Option[AffineTransform] =  | 
186  | 
      {
 | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
187  | 
val ((fx, fy), (tx, ty)) = line  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
188  | 
if (shape.contains(fx, fy) == shape.contains(tx, ty))  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
189  | 
None  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
190  | 
        else {
 | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
191  | 
val (dx, dy) = (fx - tx, fy - ty)  | 
| 49745 | 192  | 
          if ((dx * dx + dy * dy) < 1.0) {
 | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
193  | 
val at = AffineTransform.getTranslateInstance(fx, fy)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
194  | 
at.rotate(- (math.atan2(dx, dy) + math.Pi / 2))  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
195  | 
Some(at)  | 
| 50467 | 196  | 
}  | 
197  | 
          else {
 | 
|
| 49745 | 198  | 
val (mx, my) = (fx + (tx - fx) / 2.0, fy + (ty - fy) / 2.0)  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
199  | 
if (shape.contains(fx, fy) == shape.contains(mx, my))  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
200  | 
binary_search(((mx, my), (tx, ty)), shape)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
201  | 
else  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
202  | 
binary_search(((fx, fy), (mx, my)), shape)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
203  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
204  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
205  | 
}  | 
| 50467 | 206  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
207  | 
      intersecting_line(path, shape) match {
 | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
208  | 
case None => None  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
209  | 
case Some(line) => binary_search(line, shape)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
210  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
211  | 
}  | 
| 50467 | 212  | 
|
| 59250 | 213  | 
def paint(gfx: Graphics2D, path: GeneralPath, shape: Shape)  | 
| 50464 | 214  | 
    {
 | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
215  | 
      position(path, shape) match {
 | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
216  | 
case None =>  | 
| 50479 | 217  | 
case Some(at) =>  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
218  | 
val arrow = new GeneralPath(Path2D.WIND_EVEN_ODD, 3)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
219  | 
arrow.moveTo(0, 0)  | 
| 50479 | 220  | 
arrow.lineTo(-10, 4)  | 
221  | 
arrow.lineTo(-6, 0)  | 
|
222  | 
arrow.lineTo(-10, -4)  | 
|
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
223  | 
arrow.lineTo(0, 0)  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
224  | 
arrow.transform(at)  | 
| 59250 | 225  | 
gfx.fill(arrow)  | 
| 
49557
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
226  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
227  | 
}  | 
| 
 
61988f9df94d
added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
 
Markus Kaiser <markus.kaiser@in.tum.de> 
parents:  
diff
changeset
 | 
228  | 
}  | 
| 60215 | 229  | 
}  |