Go Premium for a chance to win a PS4. Enter to Win


I'm looking for samples/references for routing polylines - ie as visio/MSSQL query designer does?

Posted on 2004-04-06
Medium Priority
Last Modified: 2012-05-04

I am building an application that has some functionality similar to an organisation chart, and I am aiming to be able to move the 'nodes'  & lines dynamically.

I'm looking for any references / samples that anyone may know of that relate to the routing of polylines - as you find in visio / MS SQL query desginer.

Drawing the the lines (using VML) and moving them is not a problem, and I have done this. What I need is to be able to update my current routing functions.They are crude, but need to find a better solution, perhaps with collision detection (checking the line does not route over an existing node etc.)

Perhaps some of you have a grasp of some mathematical method that could be employed?


All comments appreciated.


Question by:AArnie
LVL 10

Accepted Solution

Kavar earned 672 total points
ID: 10775987
using math to determine if 2 lines intersect?

line a contains points{(x1,y1),(x2,y2)}
line b contains points{(x3,y3),(x4,y4)}

line a can be denoted as

line b can be denoted as

so logically, if there is a value for t and s that makes both

given the points x1,x2,y1,y2 {3,4,1,5}
and the points x3,x4,y3,y4 {2,6,1,5}

these lines intersect when t and s=.333

however this is for unbounded lines...

a very easy way to determine if 2 bounded lines intersect is to first find the line with a coordinate closest to y=0.  Then find whether or this line (we will call line a) has an y value at the end point <the end point is the lowest ending x value of either line> of line b greater than y value end point of line b.  

Sorry if I am not very clear, I understand this stuff but I don't articulate it well.

function DoLinesInterect(line1x1,line1x2,line1y1,line1y2,line2x1,line2x2,line2y1,line2y2)
dim line1Lowy,line2lowy
dim lineax1,lineax2,lineay1,lineay2
dim linebx1,linebx2,lineby1,lineby2
if line1y1<line1y2 then
end if
if line2y1<line2y2 then
end if
if line1lowy<line2lowy then
end if
'now lets find the y value for line a when line is at its end point
dim endpointx
dim line1highx,line2highx
if line1x1>line1x2 then
end if
if line2x1>line2x2 then
end if
if line2highx>line1highx then
end if
'now we need the y values for each line at this point
'to do this we will describe the lines in terms of (y)=start y + (deltay/deltax)
dim line1yend
dim line2yend
line1yend=line1y1+( ((line1y2-line1y1)/(line1x2-line1x1)) *endpointx)
line2yend=line2y1+( ((line2y2-line2y1)/(line2x2-line2x1)) *endpointx)
if line1yend>line2yend then
end if
end function

'PHEW!  I know there is a much more compact way of doing this, I just wanted to keep
'it so the logic was readible

LVL 22

Assisted Solution

NovaDenizen earned 664 total points
ID: 10784196
If you're talking about what I think you're talking about (user moves nodes around, and you want the lines between nodes to adjust accordingly, while satisfying some non-collision requirements and optimizing an aesthetic heuristic) you might want to google PC board layout and routing optimization.  

Simply put, you should create an "route ugliness" heuristic function that evaluates how acceptable or ugly a particular route is (how many lines does it cross, how long is it, does it go behind another feature, does it run along the top of another line), and returns a numerical value based on the ugliness.  Then you try a bunch of different routes, and use the one that has the smallest ugliness heuristic.  
LVL 12

Assisted Solution

farsight earned 664 total points
ID: 10784484
See some of the links I posted for this question.  Many apply to you, some do not.

Or, you can buy a component (if you're not fixed on implementing it yourself):

  http://www.tomsawyer.com/get/get-windows.php  (for .NET)
  http://www.tomsawyer.com/lav/index.php  (for use with Visio)

  http://www.sofotex.com/Diagram-Studio-download_L762.html    (maybe)

  Search on:     graph layout algorithm


Expert Comment

ID: 13108858

Could you please look at this: http://www.experts-exchange.com/Web/Web_Languages/Q_21284168.html

You may be able to help.


Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this post we will learn different types of Android Layout and some basics of an Android App.
In this post we will learn how to make Android Gesture Tutorial and give different functionality whenever a user Touch or Scroll android screen.
Introduction to Processes
Starting up a Project

926 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question