【问题标题】:polygon from polyline?折线的多边形?
【发布时间】:2014-05-23 07:34:51
【问题描述】:

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

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

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

【问题讨论】:

  • 折线的长度是多少?
  • 你想buffer折线。
  • 折线的长度大约每条长达100米,整体大约有几千公里。

标签: google-maps math google-maps-api-3


【解决方案1】:

这是我在 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;
}

【讨论】:

    【解决方案2】:

    让我们的两个相邻边(红色线段)是 AB 和 BC(在顶点 B 相交)。
    查找归一化(单位)向量 abcb
    计算单位平分线向量
    b = normalized(ab + cb) (vector normalizing)
    计算平分线段的长度(红点-蓝点)为l=d/sin(fi)
    其中 d 是偏移量,fi 是向量 bab 之间的角度:

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

    找到偏移(蓝色)点

    B' = B + l * b

    B'' = B - l * b

    【讨论】:

    • 我猜应该是Math.atan2() - 一个实际的代码示例会很好。
    • 我不知道如何规范化它,也不是关于 B' 和 B" 能否请您发布一些关于该主题的代码片段。在此先感谢 :)
    • 已添加链接。你处理过向量代数吗?这对于几何工作是绝对必要的。
    • 有时很难将原生代数函数翻译成 JavaScript :)
    猜你喜欢
    • 2012-09-27
    • 2020-06-20
    • 1970-01-01
    • 2018-01-17
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2014-09-14
    相关资源
    最近更新 更多