ThinkGeo.com    |     Documentation    |     Premium Support

Get the adjacent vertices of a point on a lineshape

Hi guys,


I've got a lineshape with multiple vertices. I can get a point on the line using the GetPointOnALine(StartingPoint startingPoint, float percentageOfLine) function of LineShape. Now I need to find out the two adjacent vertices of the point so that I can calculate the angle of that line segment and draw an arrowhead marker facing that angle. At the moment, I'm looping through all the line segments between the vertices and checking if the point intersects with line segment. If it does, then the two end point vertices of the line segment are the vertices I want. But this process does seem redundant. Is there a quick built-in function to do this?


Thanks,


Nirish



Correction:


Checking if the point intersects any of the line segments between vertices of a lineshape always returns false even though the point was returned by GetPointOnALine(0 function of the line shape. I've got the following code:



// gets the PointShape at the point from the start of the line to the distance of arrow head
PointShape pointShape = multilineShape.Lines[0].GetPointOnALine(StartingPoint.FirstPoint, (float)arrowHeadDistPercentage);
bool lineSegmentWithPointShapeFound = false;
double arrowheadAngle = 0.0;
while (!lineSegmentWithPointShapeFound && vertexIdx < multilineShape.Lines[0].Vertices.Count - 1)
{
List<Vertex> lineEndPoints = new List<Vertex>();
lineEndPoints.Add(multilineShape.Lines[0].Vertices[vertexIdx]);
lineEndPoints.Add(multilineShape.Lines[0].Vertices[vertexIdx + 1]);
LineShape ls = new LineShape(lineEndPoints);
lineSegmentWithPointShapeFound = pointShape.Intersects(ls);
if (lineSegmentWithPointShapeFound)
{
// get the angle based on the last two vertices the line
arrowheadAngle = GetBearingBetweenTwoVertices(multilineShape.Lines[0].Vertices[vertexIdx],
multilineShape.Lines[0].Vertices[vertexIdx + 1]);
// draw the arrowhead on the pointshape
DrawArrowhead(pointShape, arrowheadAngle);
break;
}
else
{
vertexIdx++;
}
}
                            


lineSegmentWithPointShapeFound is always false despite looping through all the line segments within a line. :(


Thanks,


Nirish



Nirish,


It's caused by precision. You can archive your purpose following the below steps:


 
1. Add the following method:
 

 


private const double tolerance = 10E-6;

        internal RectangleShape GenerateMiniBoundingBox(PointShape pointShape)

        {

            RectangleShape bbox = new RectangleShape();

            double miniTolerance = tolerance / 2;

            bbox.UpperLeftPoint.X = pointShape.X - miniTolerance;

            bbox.UpperLeftPoint.Y = pointShape.Y + miniTolerance;

            bbox.LowerRightPoint.X = pointShape.X + miniTolerance;

            bbox.LowerRightPoint.Y = pointShape.Y - miniTolerance;

            return bbox;
        }

 



2. Relace with the following codes in your project:
 


lineSegmentWithPointShapeFound = GenerateMiniBoundingBox(pointShape).Intersects(ls);


 
You can change the tolerance depended on your requirements. Any more questions please let us know.
 
Thanks,
 
Johnny

Thanks Johnny. I appreciate your help. :)

You are so welcome, please be free to ask any question. 
  
 Thanks, 
 Johnny