I’m working on concept maps application, which has a set of nodes and links. I have connected the links to nodes using the center of the node as reference. Since I have nodes with different size and shapes, it is not advisable to draw arrow-head for the link by specifying height or width of the shape. My approach is to draw a link, starting from one node, pixel by pixel till the next node is reached(here the nodes are of different color from that of the background), then by accessing the pixel value, I want to be able to decide the point of intersection of link and the node, which is actually the co-ordinate for drawing the arrow-head.
It would be great, if I could get some help with this.
Sample Code:
http://jsfiddle.net/9tUQP/4/
Here the green squares are nodes and the line starting from left square and entering into the right square is the link. I want the arrow-head to be drawn at the point of intersection of link and the right square.
I’ve created an example that does this. I use Bresenham’s Line Algorithm to walk the line of whole canvas pixels and check the alpha at each point; whenever it crosses a ‘threshold’ point I record that as a candidate. I then use the first and last such points to draw an arrow (with properly-rotated arrowhead).
Here’s the example: http://phrogz.net/tmp/canvas_shape_edge_arrows.html
Refresh the example to see a new random test case. It ‘fails’ if you have another ‘shape’ already overlapping one of the end points. One way to solve this would be to draw your shapes first to a blank canvas and then copy the result (
drawImage) to the final canvas.For Stack Overflow posterity (in case my site is down) here’s the relevant code: