来自多段线的多边形? [英] polygon from polyline?

查看:231
本文介绍了来自多段线的多边形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从多段线自动创建一个多边形
到目前为止,我坚持正确计算多段线每个部分上的外推边。



条件 - 基线和边线之间的距离是一个常数。




  • 如何计算边(蓝点)的角点基点(红色)?


解决方案

这是我在Qt中的代码。这对我来说很好

  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(); ((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));

float dist = sqrt ((x3-x2)*(x3-x2))+((y3-y2)*(y3-y2)));
float dist2 = sqrt

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 - 半宽*(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 - 半宽*(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-半宽*(y2-y1)/ dist,y1-半宽*(x1-x2)/ dist),QPointF(x2-半宽*(y2-y1)/ dist,y2 - 半宽*(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;
}


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.

  • How to calculate the corner points of the sides (blue points) from the base points (red ones )?

解决方案

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;
}

这篇关于来自多段线的多边形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆