python - 偏移平行于给定线的线/向量
问题描述
给定一些 XY 坐标,我试图创建与原始坐标平行的新线。
但是,当向量“返回”时,它们似乎相交,如下所示:
这是完整的python代码。
import numpy as np
import matplotlib.pyplot as plt
xN = [11.86478, 24.851482, 75.38245, 84.50359, 58.3, 58.001]
yN = [4.3048816, 3.541581, 4.0219164, 2.854434, 0.0, 0.001]
newX = []
newY = []
d = 1
for i in range(len(xN)-1):
r = np.sqrt((xN[i+1]-xN[i])**2+(yN[i+1]-yN[i])**2)
dx = d/r*(yN[i]-yN[i+1])
dy = d/r*(xN[i+1]-xN[i])
newX.append(xN[i]+dx)
newY.append(yN[i]+dy)
plt.plot(xN, yN)
plt.plot(newX, newY)
plt.show()
是否有一些算法/技术可以在不与原始线相交的情况下实现平行偏移?谢谢
更新:
虽然添加abs()
到 dx/dyd/r*abs(yN[i]-yN[i+1])
解决了第一部分,但如果我想一路走,它仍然相交,因为线的大小相同。
解决方案
我认为您必须使用绝对值,就像这样
dx = d/r*abs(yN[i]-yN[i+1])
dy = d/r*abs(xN[i+1]-xN[i])
这使
你在寻找这个结果吗?
编辑:
又看了一遍,挺有意思的。要仅在一侧延伸,您需要考虑沿线的“惯用手”。我认为它是一条微分几何曲线,切线向量t (dx, dy) 及其法线n (dy, -dx) (您在代码中使用过)跨越第三个向量,我认为它被称为副法向量b=txn。由于您只想扩展一侧的线,因此您将不得不考虑b的行为:它是否“翻转”,即曲线是否改变方向?我已将此添加到代码中(做得不好,可能需要抛光但说明了重点,s3
是b的 z 分量因为我只检查“翻转”,所以还添加了说明点):
import numpy as np
import matplotlib.pyplot as plt
xN = [11.86478, 24.851482, 75.38245, 84.50359, 58.3, 0.4]
yN = [4.3048816, 3.541581, 4.0219164, 2.854434, 0.0, 1.0]
newX = []
newY = []
d = 1
dx = 1
dy = 1
s3 = dx*dx + dy*dy
for i in range(len(xN)-1):
if s3 < 0:
newX.append(xN[i]+dy)
newY.append(yN[i]-dx)
else:
newX.append(xN[i]-dy)
newY.append(yN[i]+dx)
r = np.sqrt((xN[i+1]-xN[i])**2+(yN[i+1]-yN[i])**2)
dy = d/r*(yN[i+1]-yN[i])
dx = d/r*(xN[i+1]-xN[i])
s3 = dx*dx + dy*dy # this is the cross product, z-component
if s3 < 0:
newX.append(xN[i+1]+dy)
newY.append(yN[i+1]-dx)
else:
newX.append(xN[i+1]-dy)
newY.append(yN[i+1]+dx)
plt.plot(xN, yN)
#plt.plot(newX, newY)
plt.plot(newX, newY, 'o')
plt.show()
这导致
现在所有点都在曲线的一侧。这仍然不理想 - 如果您在点之间画线 - 外线切割原始线。这来自于外部曲线所需的延长,这仍然没有考虑。我认为您可以通过在原始曲线上的急转弯周围插入更多点来解决此问题。
推荐阅读
- jmeter - Jmeter多次登录令牌
- angular - 角材料 - 找不到名称“MAT_FORM_FIELD_DEFAULT_OPTIONS”
- android - 来自 Google Play 的通知 || 安全漏洞 || 意图重定向
- javascript - 如何从对象键值中获取单独的单词?
- c# - c# VSTO 如何在 ActiveInlineResponse 中保存电子邮件
- docusignapi - 嵌入式登录 Web 应用程序
- python - Jupyter 笔记本未启动 - AttributeError:模块“时间”没有属性“时钟”
- swiftui - SwiftUI 列表内容通过选择重置
- coq - 分割向量的尾部并附加相同向量的头部
- r - 在 for 循环中改变