內容來源於互聯網 原文地址https://www.it1352.com/825785.html
僅作爲學習筆記用
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
Polyline from Polygon blueprint
How to calculate the corner points of the sides (blue points) from the base points (red ones )?
我試圖從多段線自動創建一個多邊形
到目前爲止,我堅持正確計算多段線每個部分上的外推邊。
條件 - 基線和邊線之間的距離是一個常數。
- 如何計算邊(藍點)的角點基點(紅色)?
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; }