SMS多表面同步透镜设计

SMS多表面同步透镜设计

一、设计原理

1、Snell定律的矢量形式

折射定律又称Snell定律,主要包括两个方面:一是入射光线、法线和折射光线共面,二是入射角和折射角满足以下关系:

n 1 s i n θ 1 = n 2 s i n θ 2 n_1 sin{\theta_1} = n_2 sin{\theta_2} n1sinθ1=n2sinθ2

式中, n 1 n_1 n1是入射光所在介质的折射率, n 2 n_2 n2是折射光所在介质的折射率, θ 1 \theta_1 θ1入射角, θ 2 \theta_2 θ2是折射角。在LED二次光学设计中,斯涅尔(Snell)定律是最为简单也是最为重要的定律自由曲面模型的计算主要是通过采用折射光线、入射光线和法线矢量之间的等量关系建立方程,并联立角度与自由曲面间的关系,求解出一系列离散点,最终确定曲面的模型。

所有光线都遵循Snell定律,接下来讨论一下Snell定律的矢量形式,如下图所示:


折射定律矢量示意图

原始的折射定律可以写成如下的矢量等式:

n ′ = ( O u t × N ) = n ∗ ( I n × N ) n' = (Out \times N) = n * (In \times N) n=(Out×N)=n(In×N)

式中 O u t Out Out I n In In分別是折射率为 n ′ n' n n n n时入射光线和折射光线的单位矢量,对上式进行化简,则有

O u t × N = I n × N Out \times N = In \times N Out×N=In×N

对上式进行变换可得

( O u t − I n ) ∗ N = 0 (Out - In) * N = 0 (OutIn)N=0

在上式中,因为 ( O u t ′ − I n ′ ) (Out' - In') (OutIn) N N N不可能为零,所以则有这两个矢量是共线或是平行的,于是上式可以被写成如下形式:

O u t − I n = K ∗ N Out - In = K * N OutIn=KN

式中 K K K为待定常数。

给上式的等式两边同时点乘 N N N,则有

K = O u t ∗ N − I n ∗ N = n ′ c o s ( θ 1 ) − n c o s ( θ 2 ) K = Out * N - In * N = n' cos(\theta_1) - n cos(\theta_2) K=OutNInN=ncos(θ1)ncos(θ2)

对上式分析可知:当 n ′ > n n' > n n>n时, K > 0 K > 0 K>0,说明矢量 O u t ′ Out' Out I n ′ In' In是同向的,反之,则是反向。通常情况下,在己知两种介质的折射率及入射角需要我们求解折射角时,此时上式可以化为:

K = n ′ 2 − n 2 + n c o s θ 1 2 − n c o s θ 1 K = \sqrt{n'^2 - n ^ 2 + n cos{\theta_1} ^ 2} - n cos{\theta_1} K=n′2n2+ncosθ12 ncosθ1

推导获得矢量形式:

n ′ I n − n O u t = ( n ′ I n − n O u t ) ∗ N 2 n' In - n Out = (n' In - n Out) * N ^ 2 nInnOut=(nInnOut)N2

将上式展开:

n ′ I n − n O u t = ( n ′ ∣ I n ∣ ∗ ∣ N ∣ c o s θ 2 − n ∣ O u t ∣ ∗ ∣ N ∣ c o s θ 1 ) 2 ∗ N n' In - n Out = \sqrt{(n' |In| * |N| cos{\theta_2} - n |Out| * |N| cos{\theta_1}) ^ 2} * N nInnOut=(nInNcosθ2nOutNcosθ1)2 N

通过进一步化简,得到最终形式:

n ′ 2 + n 2 − 2 n ′ n ( O u t ∗ I n ) ∗ N = n O u t ′ − n ′ I n \sqrt{n'^2 + n ^ 2 - 2 n' n (Out * In)} * N = n Out' - n' In n′2+n22nn(OutIn) N=nOutnIn

上式即为Snell定律的矢量形式。

2、多表面同步设计法

同步多表面设计法又称 Minano-Benitez设计方法、SMS(simultaneously multiple surface)设计法,来源于其允许对多个光学表面同时进行设计的性质。

一般的非成像光学设计方法都是以点光源为基础,不考虑光源的尺寸,这可以大大降低设计的难度,但在实际应用中多采用扩展光源,从而导致实际效果与设计预期效果存在偏差。但是在 SMS 设计方法中,光学表面按顺序的反射或折射全部来自于扩展光源端点发出的边缘光线。在光源尺寸确定的情况,保证光展恒定的前提下,由起点顺序地按照法线方向应用反射定律或者折射定律,在计算机程序的辅助下可以得到待定光学表面上的参数,由样条曲线的拟合最终确定曲面形状。

根据透镜的上顶点和光线经过该顶点后的路径,利用折射定律可以确定光线在透镜下表面的折射点及其法线方向。

接着,根据等光程原则,从接收面的另一侧作为光线的起点,以透镜下表面的折射点为参照,求解出透镜上表面的另一个关键点。重复这一操作,可以确定透镜的多个关键节点。最终,通过使用NURBS曲线拟合,确定透镜的表面形状。

根据透镜下表面的第一个点及其法线方向,用圆弧来拟合透镜下表面。然后,使用等光程方法及关键节点的计算方法,确定透镜上表面的形状。

3、等光程原理

在确定光线从透镜上顶点穿过透镜并经过折射到达接收面边缘后,可以计算出整个过程的光程。SMS的一个重要原则是等光程,后续的光线计算,如光线在透镜中的光程和光线在另一表面的折射点等,都需要依据等光程原则进行。


透镜等光程示意图

光程 = { A P 1 + n P 1 Q 0 + Q 0 D A P 2 + n P 2 Q 1 + Q 1 D B P 1 + n P 1 Q 1 + Q 1 C B P 0 + n P 0 Q 0 + Q 0 C 光程 = \begin{cases} A P_1 + n P_1 Q_0 + Q_0 D \\ A P_2 + n P_2 Q_1 + Q_1 D \\ B P_1 + n P_1 Q_1 + Q_1 C \\ B P_0 + n P_0 Q_0 + Q_0 C \end{cases} 光程= AP1+nP1Q0+Q0DAP2+nP2Q1+Q1DBP1+nP1Q1+Q1CBP0+nP0Q0+Q0C

二、设计目标

  1. 通过SMS多表面同步设计方法设计一个能将扩展光源半径为 a = 300 m m a = 300mm a=300mm,在目标面距离为 H = 3000 m m H = 3000mm H=3000mm处,打出一个目标面光斑半径为 r = 500 m m r = 500mm r=500mm的透镜。

三、设计步骤

1、设计参数

H = 3000 m m r = 500 m m a = 300 m m \begin{matrix} H = 3000mm \\ r = 500mm \\ a = 300mm \end{matrix} H=3000mmr=500mma=300mm

2、编写matlab程序,计算光学母线

main.m

%% 初始化
clc
clear

%% 初始参数设定
H = 3000; % 接收面到光源距离
r = 500; % 光斑半径
a = 300; % 光源半径
d = 2000; % 初始高度
n = 5; % 分段数量
l1 = 250; % B穿过PO后折线光线长度

%% 计算透镜上下表面坐标
[Q, P] = SMSchar(d, l1, H, r, a, n);

%% 绘制图像
plot(Q(:, 1), Q(:, 2), '-r');
axis equal;
grid on;
hold on;
plot(P(:, 1), P(:, 2), '-b');

%% 处理坐标数据并保存
z_r = zeros(length(Q), 1);
Q = [Q z_r];
z_r = zeros(length(P), 1);
P = [P z_r];
save('SMS上表面数据.txt', 'P', '-ascii');
save('SMS下表面数据.txt', 'Q', '-ascii');

SMSchar.m

function [Q, P] = SMSchar(d, l1, H, r, a, n)
    % 计算透镜上下表面的坐标
    % d 是 p0 的高度
    % l1 是 B 穿过 PO 后折线光线长度
    % H 是接收面到光源距离
    % a 是光源半宽
    % n 是分段数量
    % 圆心设在接收面中点
    
    % 参数定义
    p = zeros(n, 2);
    p(1, :) = [0 d];
    A = [-a H];
    B = [a H];
    C = [-r 0];
    D = [r 0];
    r1 = p(1, :) - B;
    n1 = 1; % 介质 1 的折射率
    n2 = 1.5; % 介质 2 的折射率
    
    F = zeros(n, 2);
    lb = zeros(n, 2);
    rb = zeros(n, 2);
    N = zeros(n, 2);
    
    rb(1, :) = r1 / norm(r1); % rb 表示从 B 点到 P 点的入射光线单位向量
    N(1, :) = [0 1]; % 法线单位向量,奇数为 P 点法线,偶数为 Q 点法线
    lb(1, :) = ref(rb(1, :), N(1, :));
    
    Q = zeros(n, 2);
    Q(1, :) = p(1, :) + l1 * lb(1, :); % Q1 点坐标
    K = n1 * (norm(B - p(1, :)) + norm(C - Q(1, :))) + n2 * norm(p(1, :) - Q(1, :)); % 求光程
    
    % 计算循环
    m = 1;
    for i = 1:n
        F(m, :) = C - Q(i, :); % QC 向量
        F(m, :) = F(m, :) / norm(F(m, :));
        k = -n1 * F(m, :) + n2 * lb(m, :);
        m = m + 1;
    
        rb(m, :) = (Q(i, :) - D) / norm(Q(i, :) - D); % DQ 光线
        N(m, :) = k;
        N(m, :) = N(m, :) / norm(N(m, :));
        lb(m, :) = ref(rb(m, :), N(m, :));
        L = (H - Q(i, 2)) / abs(lb(m, 2)); % lb 已归一化其 y 坐标即为角度 sin 值或者 -sin 值
        b = Q(i, :);
        a = Q(i, :) + L * lb(m, :);
        iter_count = 0;
        
        while true % 二分法求解 P 坐标
            iter_count = iter_count + 1;
            if iter_count > 1000
                break;
            end
            p(i + 1, :) = (a + b) / 2;
            Kn = n1 * (norm(A - p(i + 1, :)) + norm(D - Q(i, :))) + n2 * norm(p(i + 1, :) - Q(i, :));
            if Kn - K < -1e-6
                b = (a + b) / 2;
            elseif Kn - K > 1e-6
                a = (a + b) / 2;
            else
                break;
            end
        end
    
        rb(m + 1, :) = (p(i + 1, :) - B) / norm(p(i + 1, :) - B);
        F(m, :) = (A - p(i + 1, :)) / norm(A - p(i + 1));
        k = -n1 * F(m, :) + n2 * lb(m, :);
        N(m + 1, :) = k;
        N(m + 1, :) = N(m + 1, :) / norm(N(m + 1, :));
        lb(m + 1, :) = ref(rb(m + 1, :), N(m + 1, :));
        L = p(i + 1, 2) / abs(lb(m + 1, 2));
        b = p(i + 1, :);
        a = p(i + 1, :) + L * lb(m + 1, :);
        iter_count = 0;
        
        while true % 二分法求解 Q 坐标
            iter_count = iter_count + 1;
            if iter_count > 1000
                break;
            end
            Q(i + 1, :) = (a + b) / 2;
            Kn = n1 * (norm(B - p(i + 1, :)) + norm(C - Q(i + 1, :))) + n2 * norm(p(i + 1, :) - Q(i + 1, :));
            if Kn - K < -1e-6
                b = (a + b) / 2;
            elseif Kn - K > 1e-6
                a = (a + b) / 2;
            else
                break;
            end
        end
        m = m + 1;
    
        if Q(i + 1, 1) - Q(i, 1) > 0
            o = 1:n;
            ind = (o > i);
            Q(ind, :) = [];
            p(ind, :) = [];
            break;
        end
    end
    
    clear P
    num = 90;
    Qx = [];
    Qy = [];
    P = zeros(n, 2);
    rq = [];
    Oqy = [];
    x = [];
    y = [];
    dx = abs(2 * Q(1, 1)) / num;
    
    % 只保存 Q1 到 0 位置上的作为光学母线
    i = 1;
    x = 0:-dx:Q(i, 1);
    rq(1) = abs(Q(i, 1)) / abs(N(2, 1));
    Oqy(i) = Q(i, 2) + abs(N(2, 2)) * rq(i);
    y = -(rq(i)^2 - x.^2).^(1/2) + Oqy(i);
    Qx = [Qx x];
    Qy = [Qy y];
    
    h1 = length(x);
    
    % 为了求出 P1 到 P2 间所有点需要对 Q1 做对称 Q1' 来求出初始点
    i = 1;
    x = -Q(1, 1) - dx:-dx:Q(1, 1); % 为了防止重复,右端点不取
    rq(1) = -Q(1, 1) / -abs(N(2, 1));
    Oqy(1) = Q(1, 2) + N(2, 2) * rq(1);
    y = -(rq(1)^2 - x.^2).^(1/2) + Oqy(1);
    
    h = length(x);
    clear lb Q
    lb = zeros(n, 2);
    Q = zeros(n, 2);
    Q = [Qx', Qy'];
    
    % 计算从 Q1' 到 Q1 透射到 P1 到 P2 部分
    for g = 1:h
        nQg = [x(g) y(g)] - [0 Oqy(i)];
        nQg = nQg / norm(nQg);
        rbg = [x(g) y(g)] - D; % 入射光线为
        rbg = rbg / norm(rbg);
    
        lb(g, :) = ref(rbg, nQg);
    
        L = (H - y(g)) / abs(lb(g, 2));
        b = [x(g) y(g)];
        a = [x(g) y(g)] + L * lb(g, :);
        iter_count = 0;
        
        while true % 二分法求解 P 坐标
            iter_count = iter_count + 1;
            if iter_count > 1000
                disp(Kn - K);
                break;
            end
            Pi = (a + b) / 2;
            Kn = n1 * (norm(A - Pi) + norm(D - [x(g) y(g)])) + n2 * norm(Pi - [x(g) y(g)]);
            if Kn - K < -1e-6
                b = (a + b) / 2;
            elseif Kn - K > 1e-6
                a = (a + b) / 2;
            else
                break;
            end
        end
        
        % Px 和 Py 用来存储最终的 P 点坐标
        P(g, :) = Pi;
    end

    clear F N rbig
    F = zeros(n, 2);
    N = zeros(n, 2);
    rbig = zeros(n, 2);
    
    m = 1;
    
    % 重新使用 F 储存 PA 矢量,计算法线
    % 清空 N 储存法线
    for v = 0:n
        for i = 1:h
            rbig(i, :) = P(v * h + i, :) - B;
            rbig(i, :) = rbig(i, :) / norm(rbig(i, :));
            F(i, :) = (A - P(v * h + i, :)) / norm(A - P(v * h + i, :));
            N(i, :) = -n1 * F(i, :) + n2 * lb(i, :);
            N(i, :) = N(i, :) / norm(N(i, :));
            
            % lb((v + 1) * h + i, :) 表示第 v+1 次的第 i 个折射光线计算
            lb(i, :) = ref(rbig(i, :), N(i, :));
            
            L = P(v * h + i, 2) / abs(lb(i, 2));
            b = P(v * h + i, :);
            a = P(v * h + i, :) + L * lb(i, :);
            iter_count = 0;
            
            while true % 二分法求解 Q 坐标
                iter_count = iter_count + 1;
                if iter_count > 1000
                    break;
                end
                Q(h1 + v * h + i, :) = (a + b) / 2;
                Kn = n1 * (norm(B - P(v * h + i, :)) + norm(C - Q(h1 + v * h + i, :))) + n2 * norm(P(v * h + i, :) - Q(h1 + v * h + i, :));
                if Kn - K < -1e-6
                    b = (a + b) / 2;
                elseif Kn - K > 1e-6
                    a = (a + b) / 2;
                else
                    break;
                end
            end
    
            m = m + 1;
    
            F(i, :) = C - Q(h1 + v * h + i, :); % QC 向量
            F(i, :) = F(i, :) / norm(F(i, :));
            N(i, :) = -n1 * F(i, :) + n2 * lb(i, :);
            N(i, :) = N(i, :) / norm(N(i, :));
            rbig(i, :) = (Q(h1 + v * h + i, :) - D) / norm(Q(h1 + v * h + i, :) - D); % DQ 光线
            lb(i, :) = ref(rbig(i, :), N(i, :));
    
            L = (H - Q(h1 + v * h + i, 2)) / abs(lb(i, 2));
            b = Q(h1 + v * h + i, :);
            a = Q(h1 + v * h + i, :) + L * lb(i, :);
            iter_count = 0;
    
            while true % 二分法求解 P 坐标
                iter_count = iter_count + 1;
                if iter_count > 1000
                    break;
                end
                P((v + 1) * h + i, :) = (a + b) / 2;
                Kn = n1 * (norm(A - P((v + 1) * h + i, :)) + norm(D - Q(h1 + v * h + i, :))) + n2 * norm(P((v + 1) * h + i, :) - Q(h1 + v * h + i, :));
                if Kn - K < -1e-6
                    b = (a + b) / 2;
                elseif Kn - K > 1e-6
                    a = (a + b) / 2;
                else
                    break;
                end
            end
    
            m = m + 1;
        end
    end

ref.m

function r3 = ref(incidence, N)
     % 计算折射光线
     % incidence 是入射光线单位矢量,指向界面的方向
     % N 是法线单位矢量
     % 默认从 n1=1 的介质入射到 n2=1.5 的介质
     
     n1 = 1;
     n2 = 1.5;
     r1 = -incidence;
     n = N;
     sintheta1 = r1(1) * n(2) - r1(2) * n(1);
     sintheta2 = n1 * sintheta1 / n2;
     theta2 = -asin(sintheta2);
     r3 = -n;
     R = [cos(theta2), -sin(theta2); sin(theta2), cos(theta2)];
     r3 = R * r3';
     r3 = r3';
end

计算得到光学母线:


光学母线

3、将计算好的光学母线数据导入SolidWorks,建立透镜模型


SD建立透镜模型

4、在SolidWorks中保存零件为.sat(R20)格式,并导入TracePro中


tracepro光线追迹示意图


辐照度分析图

从辐照度分析图可以看出,该透镜的光效为 91.95 % 91.95 \% 91.95%左右,整体均匀度大致在 50 % 50 \% 50%以上,在中心位置处均匀度在 95 % 95 \% 95%左右。

四、误差分析

目标光斑在边缘处呈现的光强较弱,或许是因为边缘处的光线根据等光程原理,在透镜中经过的光程更长,被透镜吸收的光强相比中心位置处更多。

五、总结

整体而言,本次设计成功实现了对扩展光源的SMS同步多表面透镜的设计,该透镜对于拓展光源打在目标面的光斑大小、光效表现良好,均满足设计目标。通过对折射定律、SMS同步多表面生成以及等光程原理的深入分析,对拓展光源的光学设计有了一定的理论基础。建立模型后,通过matlab计算光学母线,solidworks建立透镜模型以及tracepro进行光学仿真,展示了设计从理论到实践的转化过程。

六、参考

  1. 张航, 严金华. 非成像光学设计[M]. 北京: 科学出版社, 2016.
  2. 胡甜甜. 自由曲面菲涅尔面TIR透镜的设计及其应用[D].苏州大学,2020.DOI:10.27351/d.cnki.gszhu.2019.001237.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/764285.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arm-linux-gnueabihf-gcc:Command not found 解决办法

问题描述 使用虚拟机交叉编译程序&#xff0c;当使用了sudo去编译, 出现arm-linux-gnueabihf-gcc&#xff1a;Command not found的问题。明明已经安装并配置好环境了&#xff0c;发现还是提示找不到编译器。 原因分析&#xff1a; 特意去查了一下sudo方法&#xff0c;我们在sud…

linux中的进程以及进程管理

程序和进程的区别和联系 程序&#xff08;Program&#xff09;&#xff1a; 程序是一组指令的集合&#xff0c;通常存储在磁盘或其他存储设备上&#xff0c;是一种静态的概念。程序本身并没有运行&#xff0c;它只是一个可执行的文件或脚本&#xff0c;包含了一系列的指令和数…

Listary:文件搜索,一键即达

名人说&#xff1a;莫道谗言如浪深&#xff0c;莫言迁客似沙沉。 ——刘禹锡《浪淘沙》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Listary2、核心功能 二、下载安装1、下载2、安装 三、使用方…

mysql8.0.19安装zip版本

下载地址https://downloads.mysql.com/archives/community/ 下载版本 下载后解压&#xff0c;不包括data 和my.ini文件。其中data 文件是自动生成的【mysqld --initialize --console】&#xff0c;my.ini需要自己编写设置。 新建my.ini文件 需要自己设置 basedirG:\soft\mysql…

Hubstudio指纹浏览器:海外代理IP新选择,IPXProxy为何备受推崇?

许多人都会把Hubstudio指纹浏览器和代理IP进行搭配使用&#xff0c;为了保证网络操作的顺利进行&#xff0c;例如亚马逊的多账号管理。那有没有好用的海外代理IP呢&#xff0c;如何在Hubstudio指纹浏览器中使用代理IP呢&#xff1f; 下面就给大家推荐好用的一家海外IP代理&…

【linux】网络基础(2)——udp协议

文章目录 引言udp协议的特点udp的头部结构UDP的工作原理简单的UDP网络程序套接字的认识udp服务端代码udp客户端代码服务端运行 引言 用户数据报协议&#xff08;User Datagram Protocol, UDP&#xff09;是一种无连接的传输层协议。它是因特网协议家族的一部分&#xff0c;定义…

windows USB设备驱动开发-开发USB 设备端驱动

USB 设备是通过单个端口连接到计算机的外设&#xff0c;例如鼠标设备和键盘。 USB 客户端驱动程序是计算机上安装的软件&#xff0c;该软件与硬件通信以使设备正常运行。 如果设备属于 Microsoft 支持的设备类&#xff0c;Windows 会为该设备加载 Microsoft 提供的 USB 驱动程序…

2024上半年全国各地电子签章政策汇总,契约锁助力政企数字化转型

当前&#xff0c;全社会的数字化建设已经进入关键时期&#xff0c;各行各业都在加速推进业务数字化转型&#xff0c;电子签章作为业务全程数字化网办的关键一公里在政务服务、组织管理等各项工作中的应用价值逐渐凸显。今年上半年&#xff0c;电子签章在各地政府机关的全力推动…

AI新功能发布:AI生成数据库和AI规划任务,CoCodeAI再添新成员!

Hi&#xff0c;大家好&#xff0c;好久不见&#xff01; 我是CoCodeAI智能助手CoCo。 CoCodeAI智能助手CoCo 我无比荣幸地为大家揭晓 CoCode开发云的璀璨新星&#xff1a; AI生成数据库AI规划任务。 近日&#xff0c;CoCode开发云旗下Co-Project V3.8智能项目管理平台重磅发…

红酒与高尔夫:球场上的优雅之选

在绿茵茵的高尔夫球场上&#xff0c;每一个挥杆的瞬间都充满了优雅与力量。而当这种运动与红酒相遇&#xff0c;便是一场关于品味与格调的很好邂逅。今天&#xff0c;就让我们一起探讨红酒与高尔夫这对球场上的优雅之选&#xff0c;感受它们交织出的不同魅力。 一、高尔夫&…

Flink 容错机制

一致性检查点&#xff08;checkpoint&#xff09; 什么是 Checkpoint &#xff1f; Flink 故障恢复机制的核心&#xff0c;就就是应用状态的一致性检查点&#xff1b;有状态流应用的一直检查点&#xff0c;其实就是所有任务的状态&#xff0c;在某一时间点的一份拷贝&#xff…

视创云展3D虚拟艺术展:重塑艺术观赏的未来体验

在数字化浪潮汹涌的今天&#xff0c;3D虚拟艺术展览正迅速崛起&#xff0c;成为艺术爱好者的新宠儿。这种前沿的艺术呈现方式&#xff0c;不仅极大地提升了观赏的便捷性&#xff0c;还凭借其创新功能&#xff0c;为艺术探索与理解开启了全新篇章。 1、前所未有的便利性&#xf…

如何借助物联网实现农情监测与预警

如何借助物联网实现农情监测与预警&#xff1f; 物联网技术&#xff0c;作为信息技术与传统行业的深度融合产物&#xff0c;正逐步变革着农业生产的管理模式&#xff0c;特别是在农情监测与预警领域展现出巨大潜力。其核心在于通过感知层的各类传感器、通信层的数据传输技术以…

策略模式(Strategy Pattern)

策略模式 &#xff08;Strategy Pattern&#xff09; 定义 它是将定义的算法家族、分别封装起来&#xff0c;让它们之间可以相互替换&#xff0c;从而让算法的变化不会影响到使用算法的用户。 可以避免多重分支的 if-else、switch语句。 属于行为型模式。 适用场景 如果系…

Go - 7.const 使用指南

目录 一.引言 二.定义 三.实践 1. 常量的分组定义 2.枚举常量 3.常量类型 四.总结 一.引言 在编程中&#xff0c;常量&#xff08;constant&#xff09;是指在程序运行期间其值不会改变的变量。常量在代码中有助于提高可读性和维护性&#xff0c;因为它们提供了一个明确…

探索视觉世界:深入了解目标检测算法的奥秘

目标检测算法 一、介绍目标检测算法的背景和意义1.1 目标检测的定义和应用场景1.2 目标检测算法的发展历程 二、目标检测算法分类2.1 传统目标检测算法2.1.1 基于分类器的目标检测算法2.1.2 基于模板匹配的目标检测算法 2.2 深度学习目标检测算法2.2.1 两阶段目标检测算法2.2.2…

【渗透工具】远控工具Brute Ratel C4 1.4.5 --使用教程一(木马上线)

免责申明 本公众号的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息…

【Python爬虫】Python爬取喜马拉雅,爬虫教程!

一、思路设计 &#xff08;1&#xff09;分析网页 在喜马拉雅主页找到自己想要的音频&#xff0c;得到目标URL&#xff1a;https://www.ximalaya.com/qinggan/321787/ 通过分析页面的网络抓包&#xff0c;最终的到一个比较有用的json数据包 通过分析&#xff0c;得到了发送json…

Python海量数据处理脚本大集合:pyWhat

pyWhat&#xff1a;精简海联数据&#xff0c;直达数据弱点要害- 精选真开源&#xff0c;释放新价值。 概览 pyWhat是Github社区上一款比较实用的开源Python脚本工具。它能够快速提取信息中的 IP 地址、邮箱、信用卡、数字货币钱包地址、YouTube 视频等内容。当你遇到了一串莫名…

elementUI 年份范围选择器实现

elementUI 不支持年份范围的选择器&#xff0c;依照下面的文章进行修改和完善 el-year-picker&#xff1b; element日期选择范围、选择年份范围_elemet 两个日期 选择的年份范围必须在三年之内-CSDN博客 el-year-picker 组件&#xff1a; 依赖包&#xff1a;moment 属性&…