from math import radians as rad
import numpy as np
import plotly.graph_objects as go
listz = []
listX = [] # 用来存储所有绘图x坐标的数组
listY = []
listZ = []
listzz = [] # 用来存储层之间z坐标的数组
listzzz = [] # 用于提前算出下一层的φ值
listqbx = []
listqby = []
listqbz = []
a = 30 # 椭球赤道半径长半轴,11111111111111
b = 30 # 椭球赤道半径短半轴,222222222222222
c = 10 # 椭球极半径,33333333333333333
l = 0.5 # 层间距,44444444444444
zfs = 360 # 每一层划分的精细程度,同层内步距,555555555555555
nn = 20 # 层之间划分的份数,66666666666666666
jjfx = -1 # 控制进给运动方向(设为1逆时针或者-1顺时针),77777777777777
n = c / l # 走的层数
k = 0 # 辅助将层之间的z值加入
z = 0 # 初始高度
zz = 0
D = 0 # 用于累加弧长的寄存器
f = 270 # 用于分散下压点,选择起始加工点0,90,180,270,888888888888888888
s = 0 # 用于分散下压点
u3 = 90 # 层之间运算角度寄存器3的角度φ,形参
ii = 1
def tongceng(u):
t = f
global jj
jj = 0
while t <= 360 + f:
x = a * np.cos(rad(jjfx * t)) * 1 / np.cos(u) # u相当于控制不同层椭球轨迹的φ,
y = b * np.sin(rad(jjfx * t)) * 1 / np.cos(u) # 此处给xy赋的值就是椭球参数方程
t += 360 / zfs
listx.append(x)
listy.append(y)
jj += 1
listX.append(listx)
listY.append(listy)
def cengzhijian(f, uu, cu3, ss): # 层之间的z控制还是使用等角度φ
du = (uu - cu3) / nn # nn层之间划分的份数
for j in range(nn - 1):
f += (ss / nn)
sx = a * np.cos(jjfx * rad(f)) * 1 / np.cos((cu3 + (j + 1) * du))
sy = b * np.sin(jjfx * rad(f)) * 1 / np.cos((cu3 + (j + 1) * du))
listX.append(sx)
listY.append(sy)
z = c * (np.tan((cu3 + (j + 1) * du)) - np.pi / 3) # 加减的东西是用来控制双曲线延伸段的,即同样的角度区间,但是双曲线取的是哪个弯曲程度的区段
listzz.append(z)
def arrflatten(listt):
count = 1
new_listX = []
for lis in listt:
if isinstance(lis, list):
# print("第{}个长度为360的数组".format(count))
count += 1
for j in lis:
new_listX.append(j)
else:
new_listX.append(lis)
return new_listX
def xiaya(a0, b0, c0): # 最前面的螺旋下刀轨迹
for tt in range(-1080, 90, 10): # 91与后面的c0=0.09有关,后面需要注意
x0 = a0 + np.cos(rad(tt)) # a0的值与a有关,后期需要修改
y0 = b0 + np.sin(rad(tt)) - 1 # -0.5的值与a有关,后期需要修改
z0 = c0 - 0.001 * tt + 0.09
listqbx.append(x0)
listqby.append(y0)
listqbz.append(z0)
for i in np.arange(n - 1):
z -= l
u = np.arctan(z / c + np.pi / 3) # 加减的东西是用来控制双曲线延伸段的,即同样的角度区间,但是双曲线取的是哪个弯曲程度的区段
listzzz.append(u)
u0 = listzzz[0]
# if jjfx == 1:
# if f == 0:
# a0 = a * np.cos(u0-np.pi/2)
# b0 = b * np.sin(rad(f))
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
# if f == 90:
# a0 = a * np.cos(rad(f))
# b0 = b * np.sin(u0)
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
# if f == 180:
# a0 = a * np.cos(u0+np.pi/2)
# b0 = b * np.sin(rad(f))
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
# if f == 270:
# a0 = a * np.cos(rad(f))
# b0 = b * np.sin(u0+np.pi)
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
# if jjfx == -1:
# if f == 0:
# a0 = a * np.cos(u0-np.pi/2)
# b0 = b * np.sin(rad(f))
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
# if f == 90:
# a0 = a * np.cos(rad(f))
# b0 = b * np.sin(u0 + np.pi)
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
# if f == 180:
# a0 = a * np.cos(u0+np.pi/2)
# b0 = b * np.sin(rad(f))
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
# if f == 270:
# a0 = a * np.cos(rad(f))
# b0 = b * np.sin(u0)
# c0 = c * np.cos(u0)
# xiaya(a0, b0, c0)
for i in np.arange(n - 1):
zz -= l
listz.append(zz)
U = np.arctan(zz / c + np.pi / 3) # 加减的东西是用来控制双曲线延伸段的,即同样的角度区间,但是双曲线取的是哪个弯曲程度的区段
listx = []
listy = []
tongceng(U) # 形成一层的轨迹
if (ii < len(listzzz)):
u3 = listzzz[ii - 1]
u = listzzz[ii]
ii += 1
cengzhijian(f, u, u3, s) # 形成层之间的轨迹
f += s
for i in listz:
listZ.append(list(np.repeat(i, jj)))
if (k < len(listzz)):
for j in range(k, nn - 1 + k): # nn层之间划分的份数
listZ.append(listzz[j])
k += (nn - 1)
listX = arrflatten(listX) # 二维数组拉伸成一维
listY = arrflatten(listY)
listZ = arrflatten(listZ)
# print(listqbx)
# print(listqby)
# print(listqbz)
# # print(listX)
# # print(listY)
# print(listZ)
listqbx.extend(listX)
listqby.extend(listY)
listqbz.extend(listZ)
# with open("dengxiayashendujizhong.txt", 'a') as f: #用来输出数据文件
# for i in range(len(listqbx)):
# f.write('X' + str(np.around(listqbx[i], 3)) + ' ' + 'Y' + str(np.around(listqby[i], 3)) + ' ' + 'Z' + str(np.around(listqbz[i], 3)) + '\n')
# for i in range(len(listqbz)): # z坐标加高度13
# listqbz[i] += 13
fig = go.Figure(data=[
go.Scatter3d(
x=listqbx,
y=listqby,
z=listqbz,
mode='lines',
# # line=dict( # 对标记的设置
# # color="#eae170", # 颜色设置
#
# )
)
]) # 'lines', 'markers', 'text' 3种情况的组合
fig.update_layout(
scene=dict
(
xaxis_title=dict(font=dict(size=10)), # 坐标轴的标题名称及字体大小
yaxis_title=dict(font=dict(size=10)),
zaxis_title=dict(font=dict(size=10)),
aspectratio=dict(x=a, y=b, z=c * 0.5), # 改变画布空间比例为1:1:1
xaxis=dict(tickfont=dict(size=10), backgroundcolor="rgb(255, 255, 255)"), # 坐标轴刻度数字的字体大小
yaxis=dict(tickfont=dict(size=10), backgroundcolor="rgb(255, 255, 255)"),
zaxis=dict(tickfont=dict(size=10), backgroundcolor="rgb(255, 255, 255)"),
)
)
fig.update_traces(line=dict(color='black')) # 线条颜色改成黑色
fig.show()
# ,marker=dict(size=1.0) # 控制点的大小,加在mode后
可以参考一下这个画图的方法
最新发布