吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1741|回复: 2
收起左侧

[Python 转载] 【Python】 圆角四边形三轴联动仿真 用于印刷用的

[复制链接]
0821fzh 发表于 2021-3-15 19:35
记录项目中仿真测试的代码,效果图如下:


欢迎一起学习和讨论

主要代码如下:

import numpy as np
from math import sqrt, atan, pi, tan, sin, cos, fabs
import matplotlib.pyplot as plt
from matplotlib import animation

plt.rcParams['figure.figsize'] = [6, 6]  # for square canvas
plt.rcParams['figure.subplot.left'] = 0
plt.rcParams['figure.subplot.bottom'] = 0
plt.rcParams['figure.subplot.right'] = 1
plt.rcParams['figure.subplot.top'] = 1
plt.rcParams['animation.convert_path'] = r'E:\Program Files\ImageMagick-7.0.11-Q16-HDRI\magick.exe'


def angle_translate(angle):
    while angle > 360.0:
        angle -= 360.0

    while angle < 0.0:
        angle += 360.0

    return angle


def platform(point, resolution):
    high_temp = []

    for j in range(resolution + 1):
        loc = 0.0
        scope = 90.0 * (resolution / 360.0)
        dis = 0
        for i in range(int(j - scope), int(j + scope)):

            i = int(angle_translate(i))

            temp = point[2] * cos((i - j) * pi / 180.0)

            if temp > loc:
                loc = temp
                dis = point[2] * sin((i - j) * pi / 180.0)

        high_temp.append([loc, dis])

    return high_temp


def refresh_data(num):
    global angle_count, angle_scale, resolution, x_transfer, tool_vel, tool_pos

    if angle_count >= 360.0:
        print(temp)
        angle_count = 0

    tool_dis = high_arr[int(angle_count + angle_scale)][1]

    if fabs(tool_pos - tool_dis) > tool_vel:

        if tool_pos > tool_dis:
            tool_pos -= tool_vel
        else:
            tool_pos += tool_vel

    else:
        tool_pos = tool_dis
        angle_count += angle_scale

    x_pic_offset = tool_x + tool_pos
    y_pic_offset = tool_y + high_arr[int(angle_count)][0]
    tool.set_data(x_pic_offset, y_pic_offset)

    workpiece.set_data(point[2] * np.sin((point[3] - angle_count + offset_angle) * pi / 180.0),
                       point[2] * np.cos((point[3] - angle_count + offset_angle) * pi / 180.0))

    halftone.set_data([-50, 50], high_arr[int(angle_count)][0])


def modeling(a, b, r, resolution=360):
    point = []

    # 倒角区域角度
    area_angle_l = atan((a / 2.0 - r) / (b / 2)) * 180.0 / pi
    area_angle_s = atan((b / 2.0 - r) / (a / 2)) * 180.0 / pi

    # 变换比例
    if 90.0 - (area_angle_l + area_angle_s) != 0:
        scale = 90.0 / (90.0 - (area_angle_l + area_angle_s))
    else:
        scale = 0

    # 参数初始化
    x = y = 0

    point = []
    for i in range(resolution + 1):
        angle = i / (resolution / 360)

        # 上侧边
        if 0 <= angle < area_angle_l or 360 - area_angle_l < angle < 360:
            x = (b / 2) * tan(angle * pi / 180)
            y = b / 2
        # 第一圆弧区
        if area_angle_l <= angle < 90 - area_angle_s:
            angle_temp = (angle - area_angle_l) * scale
            x = (a / 2) - r + (r * sin(angle_temp * pi / 180))
            y = (b / 2) - r + (r * cos(angle_temp * pi / 180))
        # 右侧边
        elif (90 - area_angle_s) <= angle < 90 + area_angle_s:
            x = a / 2
            y = (a / 2) * tan((90 - angle) * pi / 180)
        # 第二圆弧区
        elif 90 + area_angle_s <= angle < 180 - area_angle_l:
            angle_temp = (angle - 90 - area_angle_s) * scale + 90
            x = (a / 2) - r + (r * sin(angle_temp * pi / 180))
            y = -((b / 2) - r) + (r * cos(angle_temp * pi / 180))
        # 下侧边
        elif 180 - area_angle_l <= angle < 180 + area_angle_l:
            x = -(b / 2) * tan(angle * pi / 180)
            y = - b / 2
        # 第三圆弧区
        elif 180 + area_angle_l <= angle < 270 - area_angle_s:
            angle_temp = (angle - 180 - area_angle_l) * scale + 180
            x = -((a / 2) - r) + (r * sin(angle_temp * pi / 180))
            y = -((b / 2) - r) + (r * cos(angle_temp * pi / 180))
        # 左侧边
        elif 270 - area_angle_s <= angle < 270 + area_angle_s:
            x = -a / 2
            y = -(a / 2) * tan((270 - angle) * pi / 180)
        # 第四圆弧区
        elif 270 + area_angle_s <= angle < 360 - area_angle_l:
            angle_temp = (angle - 270 - area_angle_s) * scale + 270
            x = -(a / 2.0) + r + (r * sin(angle_temp * pi / 180))
            y = (b / 2.0) - r + (r * cos(angle_temp * pi / 180))
        radius = sqrt(x ** 2.0 + y ** 2.0)
        point.append([x, y, radius, angle])

    return point


# 长度
a = 15
# 深度
b = 15
# 倒角
r = 4

resolution = 360
angle_scale = 360.0 / resolution
angle_count = 0
offset_angle = 0
distance = 0
x_transfer = 0
tool_vel = 0.4
tool_pos = 0
step = 0

point = modeling(a, b, r, resolution)
point = np.array(point)
point = np.hsplit(point, 4)

high_arr = platform(point, resolution)

fig, ax = plt.subplots()

ax.set_xlim(-a, a)
ax.set_ylim(-a, a)

workpiece, = ax.plot([], [], 'gray')

tool, = ax.plot([], [], 'green')
tool_x = np.array([-1.0, 0.0, 1.0, -1.0])
tool_y = np.array([4.0, 0.0, 4.0, 4.0])

halftone, = ax.plot([], [], 'blue')

ani = animation.FuncAnimation(fig=fig, func=refresh_data, frames=425, interval=1)
# Writer = animation.ImageMagickFileWriter()
# Writer.fps = 30
# ani.save('h.gif', writer=Writer,)

plt.grid()
plt.show()

演示图

演示图

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

han99 发表于 2021-3-15 20:20
第一次见,不明觉历,MARK
ciker_li 发表于 2021-3-15 21:10
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 19:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表