由折线生成多边形?

3

我正在尝试自动从折线创建多边形。目前,我在适当计算折线的每个部分上外推边缘方面遇到了困难。

条件-基线和侧面之间的距离是恒定的。

Polyline from Polygon blueprint

  • 如何从基准点(红色点)计算出侧面的角点(蓝色点)?

这些折线的长度是多少? - david strachan
1
你想要对折线进行缓冲 - geocodezip
折线的长度大约每段约100米,整个长度大约为几千公里。 - Yordan Yanakiev
2个回答

2

这是我的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();

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

1

假设有两个相邻的边(红色线段)AB和BC(在顶点B相交)。
找到标准化(单位)向量abcb
计算单位角平分线向量
b = 标准化(ab + cb) (向量标准化)
计算角平分线段(红点-蓝点)的长度为l=d/sin(fi)
其中d是偏移量,fi是向量bab之间的夹角:

fi = atan2(crossproduct(b,ab), dotproduct(b,ab))

查找偏移(蓝色)点

B' = B + l * b

B'' = B - l * b


1
我猜应该是Math.atan2() - 最好能提供一个实际的代码示例。 - davidkonrad
我不确定如何进行规范化,也不确定B'和B"。您能否在这个主题上发布一些代码片段?提前感谢您的帮助 :) - Yordan Yanakiev
你是否处理过向量代数?对于几何工作来说,这是绝对必要的。链接已添加。 - MBo
有时将本地代数函数转换为JavaScript很困难 :) - Yordan Yanakiev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接