Reputation: 2604
I am trying to create a polygon from a polyline automatically So far I am stuck with the proper calculation of the extrapolated sides on each part of the polyline.
Condition - the distance between the base line, and the sides is a constant.
Upvotes: 3
Views: 946
Reputation: 170
This is my code in Qt. This works fine for me
QPolygonF projectPLineToScreenAsPolygon(QPolygonF pline, qreal halfWidth)
{
QPolygonF ret;
QLineF l2_last;
QLineF l4_last;
for(int i = 0; i < pline.size() - 2; i++){
float x1 = pline.at(i).x();
float y1 = pline.at(i).y();
float x2 = pline.at(i + 1).x();
float y2 = pline.at(i + 1).y();
float x3 = pline.at(i + 2).x();
float y3 = pline.at(i + 2).y();
float dist = sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
float dist2 = sqrt(((x3-x2)*(x3-x2))+((y3-y2)*(y3-y2)));
QLineF l1;
QLineF l2;
QLineF l3;
QLineF l4;
if(i > 0){
l1 = l2_last;
l3 = l4_last;
l2 = QLineF (QPointF(x2 + halfWidth * (y3 - y2) / dist2, y2 + halfWidth * (x2 - x3) / dist2), QPointF(x3 + halfWidth * (y3 - y2) / dist2, y3 + halfWidth * (x2 - x3) / dist2));
l4 = QLineF (QPointF(x2 - halfWidth * (y3 - y2) / dist2, y2 - halfWidth * (x2 - x3) / dist2), QPointF(x3 - halfWidth * (y3 - y2) / dist2, y3 - halfWidth * (x2 - x3) / dist2));
} else {
l2 = QLineF (QPointF(x2 + halfWidth * (y3 - y2) / dist2, y2 + halfWidth * (x2 - x3) / dist2), QPointF(x3 + halfWidth * (y3 - y2) / dist2, y3 + halfWidth * (x2 - x3) / dist2));
l4 = QLineF (QPointF(x2 - halfWidth * (y3 - y2) / dist2, y2 - halfWidth * (x2 - x3) / dist2), QPointF(x3 - halfWidth * (y3 - y2) / dist2, y3 - halfWidth * (x2 - x3) / dist2));
l1 = QLineF (QPointF(x1 + halfWidth * (y2 - y1) / dist, y1 + halfWidth * (x1 - x2) / dist), QPointF(x2 + halfWidth * (y2 - y1) / dist, y2 + halfWidth * (x1 - x2) / dist));
l3 = QLineF (QPointF(x1 - halfWidth * (y2 - y1) / dist, y1 - halfWidth * (x1 - x2) / dist), QPointF(x2 - halfWidth * (y2 - y1) / dist, y2 - halfWidth * (x1 - x2) / dist));
}
l2_last = l2;
l4_last = l4;
QPointF pi1;
if(i == 0){
ret.append(l1.p1());
ret.prepend(l3.p1());
}
if(l1.intersect(l2, &pi1) != QLineF::NoIntersection){
ret.append(pi1);
} else {
ret.append(l2.p1());
}
QPointF pi2;
if(l3.intersect(l4, &pi2) != QLineF::NoIntersection){
ret.prepend(pi2);
} else {
ret.prepend(l4.p1());
}
if(i == pline.size() - 3){
ret.append(l2.p2());
ret.append(l4.p2());
}
}
return ret;
}
Upvotes: 2
Reputation: 80287
Let's two neighbour edges (red segments) are AB and BC (intersecting in vertice B).
Find normalized (unit) vectors ab and cb.
Calc unit bisector vector
b = normalized(ab + cb) (vector normalizing)
Calc length of bisector segments (red point-blue point) as l=d/sin(fi)
where d is offset, and fi is angle between vectors b and ab:
fi = atan2(crossproduct(b,ab), dotproduct(b,ab))
Find offset (blue) points
B' = B + l * b
B'' = B - l * b
Upvotes: 1