|
Boost Users : |
Subject: Re: [Boost-users] measuring distance between a point and a segment
From: Juliette Pera (juliette.pera_at_[hidden])
Date: 2016-04-21 03:14:48
Hi Adam,
Thanks for your answer.
Here's some more information.
I am going through the list of vertices of a segment, stored in a vector of
Eigen::Vector2D and then I am computing the distance from a point stored in
Eigen::vector2d to a each segment of my polygon.
I calculate the distance using my own function and then I calculate it
using boost function distance.
I declare a segment of type boost::geometry::model::segment<double> in
which I add my two vertices that make the segment.
Then I display the result for each vertices and I get the same result for
every segment using boost.
I hope it's more clear now.
Thank you for your help.
Juliette
double closestDistance(std::vector<Eigen::Vector2d> polygon2D,
Eigen::Vector2d P)
{
double minDist = DBL_MAX;
for( unsigned int i = 0 ; i < polygon2D.size() ; i++ )
{
Eigen::Vector2d A = polygon2D.at(i);
Eigen::Vector2d B;
if( i == polygon2D.size()-1 )
{
B = polygon2D.at(0);
}
else
{
B = polygon2D.at(i+1);
}
Eigen::Vector2d seg = B-A;
double U =
(((P[0]-A[0])*seg[0])+((P[1]-A[1])*seg[1]))/(seg.norm()*seg.norm());
double distance;
if( U < 0 )
{
distance = (A-P).norm();
}
else if( U > 1 )
{
distance = (B-P).norm();
}
else
{
Eigen::Vector2d Ph = A + U*seg;
distance = (Ph-P).norm();
}
// testing boos distance here
xsegment_t segment;
geom::append(segment,geom::make_point(A[0],A[1]));
geom::append(segment,geom::make_point(B[0],B[1]));
double distance2 =
geom::distance(segment,geom::make_point(P[0],P[1]));
std::cout << "Distance comparison : " << distance
<< " / " << distance2 << std::endl;
if( distance < minDist )
{
minDist = distance;
}
}
return minDist;
}
Result obtained:
Distance comparison : 36.6926 / 4.37843
Distance comparison : 19.5823 / 4.37843
Distance comparison : 20.6683 / 4.37843
Distance comparison : -nan / 4.37843 --> two vertices are at the same
point
Distance comparison : 12.2823 / 4.37843
2016-04-21 3:51 GMT+02:00 Adam Wulkiewicz <adam.wulkiewicz_at_[hidden]>:
> Hi Juliette,
>
> Juliette Pera wrote:
>
> Dear all,
>
> I am currently trying to use the boost library in order to measure the
> shortest distance between a point and a list of segments.
>
> I am declaring a segment to which I append the two points of my segment
> and the I calculate the distance from my point P to the segment.
>
> xsegment_t segment;
> geom::append(segment,geom::make_point(A[0],A[1]));
> geom::append(segment,geom::make_point(B[0],B[1]));
> double distance2 = geom::distance(segment,geom::make_point(P[0],P[1]));
>
> The issue is that I measure every time the same distance even if the
> segment is different.
>
> Does anyone knows from where that issue can come from?
>
>
> Sorry, but I don't have enough data to say what's the problem. It'd be the
> best if you could share some small but complete example showing this issue.
>
> Does the algorithm return this result when geometries of types
> bg::model::segment and bg::model::point are passed?
> What coordinate system do you use?
>
> Or do you use your own types adapted to Segment and Point concepts?
> If the answer is yes, then I'd start from checking if the adaptation was
> done correctly.
>
> Regards,
> Adam
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net