gpt4 book ai didi

python - 如何从 x、y 点列表和偏移距离中获取偏移样条曲线的 x、y 坐标

转载 作者:太空狗 更新时间:2023-10-30 00:39:39 24 4
gpt4 key购买 nike

我需要制作翼型轮廓曲线的偏移平行封闭,但我无法弄清楚如何使所有点与主轮廓曲线上的点在所需距离处等距。

这是我的示例机翼剖面 enter image description here

这是我最好但不是很好的方法 enter image description here

编辑 @Patrick 距离 0.2 的解决方案 enter image description here

最佳答案

您必须使用无穷大/零的特殊斜率,但基本方法是使用插值法计算一个点的斜率,然后找到垂直斜率,然后计算该距离处的点。

我修改了 here 中的示例添加第二个图表。它适用于 data file you provided , 但您可能需要更改不同信封的符号计算。

编辑 根据您关于希望信封是连续的评论,我在末尾添加了一个俗气的半圆,非常接近为您执行此操作。本质上,在创建信封时,您可以将其做得越圆越凸,效果就越好。此外,您需要重叠开头和结尾,否则会有间隙。

此外,几乎可以肯定它可以变得更高效——无论如何我都不是 numpy 专家,所以这只是纯 Python。

def offset(coordinates, distance):
coordinates = iter(coordinates)
x1, y1 = coordinates.next()
z = distance
points = []
for x2, y2 in coordinates:
# tangential slope approximation
try:
slope = (y2 - y1) / (x2 - x1)
# perpendicular slope
pslope = -1/slope # (might be 1/slope depending on direction of travel)
except ZeroDivisionError:
continue
mid_x = (x1 + x2) / 2
mid_y = (y1 + y2) / 2

sign = ((pslope > 0) == (x1 > x2)) * 2 - 1

# if z is the distance to your parallel curve,
# then your delta-x and delta-y calculations are:
# z**2 = x**2 + y**2
# y = pslope * x
# z**2 = x**2 + (pslope * x)**2
# z**2 = x**2 + pslope**2 * x**2
# z**2 = (1 + pslope**2) * x**2
# z**2 / (1 + pslope**2) = x**2
# z / (1 + pslope**2)**0.5 = x

delta_x = sign * z / ((1 + pslope**2)**0.5)
delta_y = pslope * delta_x

points.append((mid_x + delta_x, mid_y + delta_y))
x1, y1 = x2, y2
return points

def add_semicircle(x_origin, y_origin, radius, num_x = 50):
points = []
for index in range(num_x):
x = radius * index / num_x
y = (radius ** 2 - x ** 2) ** 0.5
points.append((x, -y))
points += [(x, -y) for x, y in reversed(points)]
return [(x + x_origin, y + y_origin) for x, y in points]

def round_data(data):
# Add infinitesimal rounding of the envelope
assert data[-1] == data[0]
x0, y0 = data[0]
x1, y1 = data[1]
xe, ye = data[-2]

x = x0 - (x0 - x1) * .01
y = y0 - (y0 - y1) * .01
yn = (x - xe) / (x0 - xe) * (y0 - ye) + ye
data[0] = x, y
data[-1] = x, yn
data.extend(add_semicircle(x, (y + yn) / 2, abs((y - yn) / 2)))
del data[-18:]

from pylab import *

with open('ah79100c.dat', 'rb') as f:
f.next()
data = [[float(x) for x in line.split()] for line in f if line.strip()]

t = [x[0] for x in data]
s = [x[1] for x in data]


round_data(data)

parallel = offset(data, 0.1)
t2 = [x[0] for x in parallel]
s2 = [x[1] for x in parallel]

plot(t, s, 'g', t2, s2, 'b', lw=1)

title('Wing with envelope')
grid(True)

axes().set_aspect('equal', 'datalim')

savefig("test.png")
show()

关于python - 如何从 x、y 点列表和偏移距离中获取偏移样条曲线的 x、y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32772638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com