ThinkGeo.com    |     Documentation    |     Premium Support

Position Shapes beside a Line - backwards

Hello,


according to my previews post..


gis.thinkgeo.com/Support/Dis...fault.aspx


.. I create shapes (Point, Lines, Rectangle) and position them beside a line (baseline).


To position the shapes I use code from a sample in Code Comunity -> "Offset Point at Right Angle".


This works fine.


But what I now need is the backward way. If a new point is created on the map via my edit functions and the user selects a lineshape as reference line I need to get a point on the line that is in right angle to my new point.


I made some test with Lineshape.GetShortestLineTo() method but this is not exact as I need. If I create a point to a line position via "Offset Point at Right Angle"-Code I should get the same line Position if I try the backward way.


Any ideas?



Thomas, 
  
 Just an idea, you can overrid GetShortestLineToCore method of LineShape and make it work for backward way. 
  
 Hope it can help. 
  
 James

Hello James,


thanks for Information.


Maybe I was not clear enough. What I need is an algorithm how I can get the point on the line that is in right angle to a given point beside the line.


Thomas


 



Thomas,

I think this is a mathematic logic problem. I wrote some logics for you, while It only deal with very simple case in which the LineShape will only contains 2 points. Hope it helps.





LineShape lineShape = new LineShape();
lineShape.Vertices.Add(new Vertex(0, 0));
lineShape.Vertices.Add(new Vertex(1, 1));

Vertex vertex = new Vertex(1, 0);
Vertex vertex111 = GetPredicularVertex(lineShape, vertex);

// Here LineShape contains 2 vertex.
private Vertex GetPredicularVertex(LineShape lineShape, Vertex vertex)
{
     Vertex vertex1 = lineShape.Vertices[0];
     Vertex vertex2 = lineShape.Vertices[1];

     double A = (vertex2.Y - vertex1.Y) / (vertex2.X - vertex1.X);
     double B = -1;
     double C = vertex1.Y - A * vertex1.X;

     double a = vertex.X;
     double b = vertex.Y;


     double x2 = a - 2 * A * (A * a + B * b + C) / (A * A + B * B);
     double y2 = b - 2 * B * (A * a + B * b + C) / (A * A + B * B);

     double x = (a + x2) / 2;
     double y = (b + y2) / 2;
     return new Vertex(x, y);
}

Any more questions please feel free to let me know.


Thanks.


Yale



Yale, 
  
 thanks for your sample code. It works much better than using the GetClosestPoint() method. 
 The point I get via your code is most exactly for my calculation.  
  
 But you have allready noticed what I need. How can I detect the point if I have linestrings with more than two points. 
  
 Thomas 
  


Thomas,  
  
 Just have a try as following idea, hope it helps. Loop all the points contained in the LineShape and from which find out those two points closest to target point shape in distance, and then call the API listed in previous post.  
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Thomas, 
  
  I amd the original author of the function GetClosestPoint(). I used several examples of line segments to compare the results from GetClosestPoint() and the function GetPerpendicularVertex written by Yale. I always to get the same result regardless of what function I use. Can you give some cases from you where the function GetPerpendicularVertex works much better than using the GetClosestPoint() method? 
   I am curious to see why our GetClosestPoint() is not always adequate in all the situations. Thank you. 
  
 Val.

Hello Val, 
  
 you are right. After looking on my code again I saw that I made a mistake. The method I used before I changed to GetPredicularVertex() was GetShortestLineTo() not GetClosestPoint(). If I use GetClosestPoint() I get exactly the position I need. 
  
 Thanks for pointing me in the right way. 
 Thomas

Thomas. You are welcome. Let us know if you have any other doubts.