Naf Asked:2020-12-13 22:09:26 +0000 UTC2020-12-13 22:09:26 +0000 UTC 2020-12-13 22:09:26 +0000 UTC 在折线的左侧和右侧构建多边形 772 我在飞机上有一些虚线,有必要在给定距离的左侧和右侧构建两个多边形。 例如: 假设一条折线用红色给出,有必要重建左右多边形 A 和 B 相对于它。因此,多边形 A 和 B 似乎连接在给定的折线上。为了构建多边形,在保持折线曲率的同时,为左右部分设置了两个距离。 困难在于我需要知道折线的方向,以便在该方向上移动,在距它给定的距离处,以获得末端多边形的必要点。 初始数据的限制: 1)没有自相交的折线 2)折线不能折叠,即 例如,恰好一个点位于 X 或 Y 轴的一个值上 我用 C++ 编写 提交想法) c++ 1 个回答 Voted Best Answer Lyth 2020-12-13T22:46:17Z2020-12-13T22:46:17Z 假设有点 C = [(x1, y1), (x2, y2), ..., (xn, yn)] 是一条折线。 线段 (x1, y1) - (xn, yn) 连接第一个点和最后一个点。让它成为折线 v 的方向向量: (vx, vy) = (xn - x1, yn - y1) 并将其旋转 90 度: | 0 -1 | d = (vx, vy) * | | = (-vy, vx) | 1 0 | 这是一个任意长度的向量,垂直于折线的“方向”旋转。会有很多细微差别,但稍后再说。现在,标准化(减少到长度 1): vL = sqrt(vx*vx + vy*vy) dN = d / vL = (-vy / vL, vx / vL) 实际上,现在,有了“左”和“右”(p,q)后退的距离,我们混合每个点并得到新的折线: L= C + dN * p = [(x1 + dN.x * p, y1 + dN.y * p), ...] R= C - dN * q = [(x1 - dN.x * q, y1 - dN.y * q), ...] 要将它们捕捉到原来的多段线上,将原来的点按相反的顺序添加,否则绘制时会出现奇怪的对角线: M1 = [L1, L2, ..., Ln, Cn, Cn-1, ... C1] M2 = [R1, R2, ..., Rn, Cn, Cn-1, ... C1] 现在是细微差别。 “左”和“右”是非常相对的概念,取决于原始折线中点的顺序。如果它们通过投影设置到平面上,则可能必须翻转它们。 存在位移的多段线与原多段线相交的情况,或者无法将起点和终点与原多段线用直线连接起来,得到一个不相交的多边形。 第二种情况的例子: 移动时红色适合原件;使用绿色,不可能制作没有交点的多边形。
假设有点 C = [(x1, y1), (x2, y2), ..., (xn, yn)] 是一条折线。
线段 (x1, y1) - (xn, yn) 连接第一个点和最后一个点。让它成为折线 v 的方向向量:
(vx, vy) = (xn - x1, yn - y1)
并将其旋转 90 度:
这是一个任意长度的向量,垂直于折线的“方向”旋转。会有很多细微差别,但稍后再说。现在,标准化(减少到长度 1):
实际上,现在,有了“左”和“右”(p,q)后退的距离,我们混合每个点并得到新的折线:
要将它们捕捉到原来的多段线上,将原来的点按相反的顺序添加,否则绘制时会出现奇怪的对角线:
现在是细微差别。
“左”和“右”是非常相对的概念,取决于原始折线中点的顺序。如果它们通过投影设置到平面上,则可能必须翻转它们。
存在位移的多段线与原多段线相交的情况,或者无法将起点和终点与原多段线用直线连接起来,得到一个不相交的多边形。
第二种情况的例子:
移动时红色适合原件;使用绿色,不可能制作没有交点的多边形。