[Tools]UDP时间监测

1.关掉双方的防火墙
2.下载iperf工具 https://iperf.fr/iperf-download.php
3.在服务器端进入 下载后的目录,运行 iperf3 -s -p 5201 应该会显示
———————————————————–
Server listening on 5201
———————————————————–
4.同样的方法客户端 运行 iperf3 -c <服务器IP> -u -b 1M -t 10 –udp-counters-64bit –get-server-output //不包含<>符号


iperf3 -c 10.8.0.6 -u -b 5M -t 10 -l 1400 -p 5201 -i 1
5.客户端会输出

[Tools]shotcut操作

1.打开文件夹,将图片导入
2.点击“属性”,选择“图像序列”
3.点击“时间线”,在“ 三 ”样式的地方(显示附加操作菜单)选择 “添加视频轨道”,点击“√”样式(覆盖剪辑到当前轨道)
5.点击“输出”,选择H.264 baseline ,点击“输出文件”,保存到相应位置

[linux]开机运行文件

//bp sudo vi /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “exit 0” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/local/bin/load_module.sh

#xset s off
#xset -dpms

#while ! ip route | grep -q “default”; do
# echo “Waiting for default gateway…”
# sleep 1
# done

# echo “Default gateway is set.”

#sudo ip route del default via 192.168.43.1 dev usb0

//sp

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “exit 0” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/usr/local/bin/load_module.sh

#while ! ip route | grep -q “default”; do
# echo “Waiting for default gateway…”
# sleep 1
# done

# echo “Default gateway is set.”

#sudo ip route del default via 192.168.43.1 dev usb0

//bp /usr/local/bin/load_module.sh

#!/bin/bash

source /etc/profile
source ~/.bash_profile

chmod 777 /dev/spidev3.0
sleep 1
insmod /home/orangepi/wlanuav.ko rtw_country_code=”CN”
#sleep 1
#sudo iw dev wlx7822884b2787 set type AP
#sleep 2
#nmcli dev set wlx7822884b2787 managed no
#sleep 2
#sudo /usr/sbin/hostapd /usr/sbin/1.config -B
#sleep 2
#sudo ifconfig wlx7822884b2787 192.168.16.7
sleep 1

#while ! ip route | grep -q “default”; do
# echo “Waiting for default gateway…”
# sleep 1
# done
# echo “Default gateway is set.”

#sudo ip route del default via 192.168.43.1 dev usb0
#sleep 8
sudo /usr/sbin/openvpn –config /home/orangepi/baseport.ovpn –daemon
sleep 20
su – orangepi -c “/home/orangepi/bp” &

//sp

#!/bin/bash
sleep 1
insmod /home/orangepi/wlanuav.ko rtw_country_code=”CN”
sleep 1
sudo iw dev wlx7822884b2786 set type AP
sleep 2
nmcli dev set wlx7822884b2786 managed no
sleep 2
sudo /usr/sbin/hostapd /usr/sbin/1.config -B
sleep 2
sudo ifconfig wlx7822884b2786 192.168.16.1
sleep 2
sudo openvpn –config /home/orangepi/skyport.ovpn –daemon
sleep 2
echo “autorun init done”

[Matlab]基础

Π – pi
幂运算 – ^
平方根 – sqrt()
e的x次方 – exp(x)

[符号]
大于 >
小于<
大于等于 >=
小于等于 <=
等于 ==
不等于 ~=

与 &
或 |
非 ~

[函数]
rand(m,n) 随机数
ans(x) 绝对值
min(x)
size(x) 矩阵元素数
sqrt(x) 平方根
log(x) 自然对数
log2(x) 以2为底的对数
sort(x) 排序
rank(x) 秩
det(x) 行列式
real(x) 求实部
image(x) 求虚部
angle(x) 相角
pow2(x) 求2的x次幂
length(x) 求向量长度

sin(x) 正弦
cos(x) 余弦
tan(x) 正切
asin(x) 反正弦
acos(x) 反余弦
atan(x) 反正切

round(x) 四舍五入
fix(x) 去小数点
floor(x) 向下取整
ceil(x) 向上取整

[转换]
str2num(‘str’) 字符串转数值
num2str(num) 数值转字符串
str2mat(‘s1′,’s2′,’s3’) 字符串转矩阵
dec2bin(23) 十进制转二进制
dec2base(12,2) 十进制12转为2进制
bin2dec
lower(‘str’) 转为小写
str2double(‘num’)
int2str(num)
setstr(ascii)
dec2hex
base2dec
uppper(‘str’) 转为大写
sprintf(‘%x’,num)

[矩阵]

行使用空格或,隔开
列使用回车或;隔开
A = [10,20,30;4,5,6;7,8,9]

A = [1:3:15] //起始值:步长:结束值 实际最后一个值会≤结束值
A = 1 4 7 10 13

A=linspace(n1,n2,k) %n1为初始值 n2为终值 k为元素个数
A=linspace(3,18,5) %

A =[3.0000 6.7500 10.5000 14.2500 18.0000]

A=logspace(n1,n2,k) %从10^n1 ~ 10^n2 间共k个数
A=logsapce(1,3,3) % A=[10 100 1000]

取元素
a=A(1,2) %取1行 2列的元素 (从1开始)
b=A(1,:) %取第1行
c=A(1,3:5) %取第1行的 3-5列元素
扩展
A=[1 2 3 ; 4 5 6]
A(3,4) =20
A = [1 2 3 0;4 5 6 0; 0 0 0 20] %不足位置补0

[矩阵计算]

1.秩
rank(A)
2.逆矩阵
inv(a)
3.求解
6×1 + 3×2 + 4×3 = 3
-2×1+5×2 + 7×3 = -4
8×1 -4×2 -3×3 = -7

A = [6 3 4;-2 5 7;8 -4 -3]
B = [3;-4;-7]

x=A\B

x=0.6 ; 7.0;-5.4

[Win]计划重启

右键“此电脑” → “管理”

左侧导航到:系统工具 → 任务计划程序

点击右侧 “创建任务”(不是“创建基本任务”)

在 “常规” 选项卡:

勾选 “不管用户是否登录都要运行”

勾选 “使用最高权限运行”

选择 “配置为:Windows 10”(根据系统)

在 “触发器” 选项卡:

新建 → 开始任务:按计划

设置:每天,时间:3:00:00

在 “操作” 选项卡:

新建 → 操作:启动程序

程序/脚本:shutdown

参数:/r /f /t 0

[OpenVpn]新建client

cd ~/openvpn-ca
./easyrsa gen-req client_name nopass
./easyrsa sign-req client client_name

将client_name.crt和client_name.key文件拷贝到openvpn文件
分别位于~/openvpn-ca/pki/issued/client_name.crt
~/openvpn-ca/pki/private/client1.key

[VPN]配置

client
dev tun
proto udp
remote IP PORT
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
route 10.8.0.0 255.255.255.0 enx020c29a39b6d
route-nopull
tls-auth ta.key 1
# OpenVPN 加密配置
#data-ciphers AES-256-GCM:AES-128-GCM
#data-ciphers-fallback AES-256-CBC
#data-ciphers-fallback BF-CBC
#comp-lzo no
#auth SHA256
verb 4


—–BEGIN CERTIFICATE—–
KEY
—–END CERTIFICATE—–


—–BEGIN CERTIFICATE—–
KEY
—–END CERTIFICATE—–


—–BEGIN PRIVATE KEY—–
KEY
—–END PRIVATE KEY—–


—–BEGIN OpenVPN Static key V1—–
KEY
—–END OpenVPN Static key V1—–

[Matlab]椭球拟合+正圆修正+Qt转换

% 已知三组数据(三个坐标平面上的截线) 椭球拟合
x1 = [-267, -215, -140, -99, -65, -90, -110, -128, -164, -222, -258, -390, -456, -506, -542, -559, -549, -509, -462, -395, -335];
y1 = [-276, -251, -213, -147, -74, 11, 43, 64, 106, 137, 154, 141, 114, 67, 3, -34, -110, -177, -225, -259, -273];

y2 = [-265, -227, -150, -74, -11, 43, 110, 140, 152, 138, 115, 78, 56, -8, -52, -131, -182, -238, -263, -281, -274];
z2 = [197, 286, 346, 365, 358, 340, 260, 214, 165, 36, -16, -58, -84, -123, -116, -98, -68, -13, 47, 109, 158];

x3 = [-514, -528, -506, -484, -472, -425, -388, -365, -335, -296, -241, -151, -126, -114, -66, -72, -99, -135, -214, -325, -383, -469, -518];
z3 = [113, 170, 251, 272, 300, 339, 362, 372, 363, 377, 354, 344, 318, 288, 208, 71, 17, -43, -73, -92, -60, -9, 65];

fprintf(‘开始椭球拟合…\n’);

% 方法:使用数值优化直接拟合椭球参数
% 椭球方程: (x-x0)²/a² + (y-y0)²/b² + (z-z0)²/c² = 1

% 初始参数估计
x0_est = mean([x1, x3]);
y0_est = mean([y1, y2]);
z0_est = mean([z2, z3]);
a_est = std([x1, x3]);
b_est = std([y1, y2]);
c_est = std([z2, z3]);

initial_params = [x0_est, y0_est, z0_est, a_est, b_est, c_est];
fprintf(‘初始参数: 中心(%.1f,%.1f,%.1f), 半径(%.1f,%.1f,%.1f)\n’, initial_params);

% 使用优化方法
options = optimset(‘Display’, ‘iter’, ‘MaxFunEvals’, 10000, ‘TolX’, 1e-6);
optimal_params = fminsearch(@(p) ellipsoid_error(p, x1, y1, y2, z2, x3, z3), initial_params, options);

x0 = optimal_params(1);
y0 = optimal_params(2);
z0 = optimal_params(3);
a = optimal_params(4);
b = optimal_params(5);
c = optimal_params(6);

fprintf(‘\n=== 椭球拟合结果 ===\n’);
fprintf(‘椭球方程: (x-%.2f)²/%.2f² + (y-%.2f)²/%.2f² + (z-%.2f)²/%.2f² = 1\n’, x0, a, y0, b, z0, c);
fprintf(‘椭球中心: (%.2f, %.2f, %.2f)\n’, x0, y0, z0);
fprintf(‘半轴长度: a=%.2f, b=%.2f, c=%.2f\n’, a, b, c);

% 生成椭球面(确保实数)
[x_ell, y_ell, z_ell] = generate_simple_ellipsoid(x0, y0, z0, a, b, c, 30);

% 计算三个平面的截线椭圆
theta = linspace(0, 2*pi, 100);

% XY平面截线 (z=0)
xy_x = x0 + a * cos(theta);
xy_y = y0 + b * sin(theta);

% YZ平面截线 (x=0)
yz_y = y0 + b * cos(theta);
yz_z = z0 + c * sin(theta);

% XZ平面截线 (y=0)
xz_x = x0 + a * cos(theta);
xz_z = z0 + c * sin(theta);

% 可视化结果
figure(‘Position’, [100, 100, 1400, 1000]);

% 子图1: 三维椭球与数据点
subplot(2,3,1);
surf(x_ell, y_ell, z_ell, ‘FaceAlpha’, 0.2, ‘EdgeColor’, ‘none’, ‘FaceColor’, ‘cyan’);
hold on;

% 绘制数据点
scatter3(x1, y1, zeros(size(x1)), 60, ‘r’, ‘filled’, ‘MarkerEdgeColor’, ‘k’);
scatter3(zeros(size(y2)), y2, z2, 60, ‘g’, ‘filled’, ‘MarkerEdgeColor’, ‘k’);
scatter3(x3, zeros(size(x3)), z3, 60, ‘b’, ‘filled’, ‘MarkerEdgeColor’, ‘k’);

scatter3(x0, y0, z0, 120, ‘k’, ‘filled’, ‘Marker’, ‘x’, ‘LineWidth’, 3);
title(‘三维椭球与截线数据点’);
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);
legend(‘椭球’, ‘XY平面数据’, ‘YZ平面数据’, ‘XZ平面数据’, ‘椭球中心’);
grid on; axis equal;

% 子图2: XY平面截线
subplot(2,3,2);
plot(xy_x, xy_y, ‘r-‘, ‘LineWidth’, 3);
hold on;
scatter(x1, y1, 50, ‘r’, ‘filled’);
scatter(x0, y0, 80, ‘k’, ‘x’, ‘LineWidth’, 2);
title(‘XY平面截线 (z=0)’);
xlabel(‘X’); ylabel(‘Y’);
legend(‘拟合椭圆’, ‘数据点’, ‘中心’);
grid on; axis equal;

% 子图3: YZ平面截线
subplot(2,3,3);
plot(yz_y, yz_z, ‘g-‘, ‘LineWidth’, 3);
hold on;
scatter(y2, z2, 50, ‘g’, ‘filled’);
scatter(y0, z0, 80, ‘k’, ‘x’, ‘LineWidth’, 2);
title(‘YZ平面截线 (x=0)’);
xlabel(‘Y’); ylabel(‘Z’);
legend(‘拟合椭圆’, ‘数据点’, ‘中心’);
grid on; axis equal;

% 子图4: XZ平面截线
subplot(2,3,4);
plot(xz_x, xz_z, ‘b-‘, ‘LineWidth’, 3);
hold on;
scatter(x3, z3, 50, ‘b’, ‘filled’);
scatter(x0, z0, 80, ‘k’, ‘x’, ‘LineWidth’, 2);
title(‘XZ平面截线 (y=0)’);
xlabel(‘X’); ylabel(‘Z’);
legend(‘拟合椭圆’, ‘数据点’, ‘中心’);
grid on; axis equal;

% 计算拟合误差
fprintf(‘\n=== 拟合质量分析 ===\n’);

% XY平面误差
errors_xy = zeros(size(x1));
for i = 1:length(x1)
errors_xy(i) = ((x1(i)-x0)^2/a^2 + (y1(i)-y0)^2/b^2) – 1;
end

% YZ平面误差
errors_yz = zeros(size(y2));
for i = 1:length(y2)
errors_yz(i) = ((y2(i)-y0)^2/b^2 + (z2(i)-z0)^2/c^2) – 1;
end

% XZ平面误差
errors_xz = zeros(size(x3));
for i = 1:length(x3)
errors_xz(i) = ((x3(i)-x0)^2/a^2 + (z3(i)-z0)^2/c^2) – 1;
end

fprintf(‘XY平面 – 平均绝对误差: %.4f, 最大误差: %.4f\n’, mean(abs(errors_xy)), max(abs(errors_xy)));
fprintf(‘YZ平面 – 平均绝对误差: %.4f, 最大误差: %.4f\n’, mean(abs(errors_yz)), max(abs(errors_yz)));
fprintf(‘XZ平面 – 平均绝对误差: %.4f, 最大误差: %.4f\n’, mean(abs(errors_xz)), max(abs(errors_xz)));

% 子图5: 拟合误差分布
subplot(2,3,5);
all_errors = [errors_xy, errors_yz, errors_xz];
histogram(all_errors, 20, ‘FaceColor’, ‘m’, ‘FaceAlpha’, 0.7);
xlabel(‘拟合误差’); ylabel(‘频数’);
title(‘拟合误差分布’);
grid on;

% 子图6: 数据点与拟合椭圆距离
subplot(2,3,6);
plot(1:length(errors_xy), abs(errors_xy), ‘ro-‘, ‘LineWidth’, 1.5, ‘MarkerSize’, 4);
hold on;
plot(length(errors_xy)+1:length(errors_xy)+length(errors_yz), abs(errors_yz), ‘go-‘, ‘LineWidth’, 1.5, ‘MarkerSize’, 4);
plot(length(errors_xy)+length(errors_yz)+1:length(all_errors), abs(errors_xz), ‘bo-‘, ‘LineWidth’, 1.5, ‘MarkerSize’, 4);
xlabel(‘数据点索引’); ylabel(‘绝对误差’);
title(‘各数据点拟合误差’);
legend(‘XY平面’, ‘YZ平面’, ‘XZ平面’);
grid on;

% 显示拟合优度
fprintf(‘总体平均绝对误差: %.4f\n’, mean(abs(all_errors)));

% 辅助函数:椭球误差计算
function error = ellipsoid_error(params, x1, y1, y2, z2, x3, z3)
x0 = params(1); y0 = params(2); z0 = params(3);
a = params(4); b = params(5); c = params(6);

total_error = 0;

% XY平面数据误差 (z=0)
for i = 1:length(x1)
error_val = ((x1(i)-x0)^2/a^2 + (y1(i)-y0)^2/b^2) – 1;
total_error = total_error + error_val^2;
end

% YZ平面数据误差 (x=0)
for i = 1:length(y2)
error_val = ((y2(i)-y0)^2/b^2 + (z2(i)-z0)^2/c^2) – 1;
total_error = total_error + error_val^2;
end

% XZ平面数据误差 (y=0)
for i = 1:length(x3)
error_val = ((x3(i)-x0)^2/a^2 + (z3(i)-z0)^2/c^2) – 1;
total_error = total_error + error_val^2;
end

error = total_error;
end

% 辅助函数:生成简单椭球面
function [x, y, z] = generate_simple_ellipsoid(x0, y0, z0, a, b, c, n)
theta = linspace(0, 2*pi, n);
phi = linspace(0, pi, n);
[Theta, Phi] = meshgrid(theta, phi);

% 生成椭球坐标(确保实数)
x = x0 + a * sin(Phi) .* cos(Theta);
y = y0 + b * sin(Phi) .* sin(Theta);
z = z0 + c * cos(Phi);

% 确保所有坐标都是实数
x = real(x);
y = real(y);
z = real(z);
end

//正圆修正

% 原始椭球参数
x0_orig = -303.51;
y0_orig = -60.65;
z0_orig = 132.76;
a_orig = 237.59;
b_orig = 215.39;
c_orig = 241.03;

fprintf(‘=== 原始椭球参数 ===\n’);
fprintf(‘中心: (%.2f, %.2f, %.2f)\n’, x0_orig, y0_orig, z0_orig);
fprintf(‘半轴长度: a=%.2f, b=%.2f, c=%.2f\n’, a_orig, b_orig, c_orig);

% 步骤1: 将椭球平移到原点
% 新坐标 = 原始坐标 – 中心坐标
fprintf(‘\n=== 坐标平移 ===\n’);
fprintf(‘平移向量: (%.2f, %.2f, %.2f)\n’, -x0_orig, -y0_orig, -z0_orig);

% 步骤2: 计算平均半径并生成正圆
r_avg = (a_orig + b_orig + c_orig) / 3;
fprintf(‘\n=== 半径归一化 ===\n’);
fprintf(‘原始平均半径: %.2f\n’, r_avg);
fprintf(‘目标半径: %.2f (正圆)\n’, r_avg);

% 生成原始椭球(用于对比)
[x_orig, y_orig, z_orig] = generate_ellipsoid(x0_orig, y0_orig, z0_orig, a_orig, b_orig, c_orig, 40);

% 生成平移后的椭球(中心在原点)
[x_centered, y_centered, z_centered] = generate_ellipsoid(0, 0, 0, a_orig, b_orig, c_orig, 40);

% 生成正圆球体
[x_sphere, y_sphere, z_sphere] = generate_sphere(0, 0, 0, r_avg, 40);

% 可视化结果
figure(‘Position’, [100, 100, 1500, 500]);

% 子图1: 原始椭球
subplot(1,3,1);
surf(x_orig, y_orig, z_orig, ‘FaceAlpha’, 0.3, ‘EdgeColor’, ‘none’, ‘FaceColor’, ‘blue’);
hold on;
scatter3(x0_orig, y0_orig, z0_orig, 100, ‘r’, ‘filled’, ‘Marker’, ‘x’, ‘LineWidth’, 3);
scatter3(0, 0, 0, 100, ‘k’, ‘filled’, ‘Marker’, ‘o’);
title(‘原始椭球’);
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);
legend(‘原始椭球’, ‘椭球中心’, ‘坐标原点’);
grid on; axis equal;

% 子图2: 平移后的椭球(中心在原点)
subplot(1,3,2);
surf(x_centered, y_centered, z_centered, ‘FaceAlpha’, 0.3, ‘EdgeColor’, ‘none’, ‘FaceColor’, ‘green’);
hold on;
scatter3(0, 0, 0, 100, ‘r’, ‘filled’, ‘Marker’, ‘x’, ‘LineWidth’, 3);
title(‘平移后椭球(中心在原点)’);
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);
legend(‘平移椭球’, ‘中心(0,0,0)’);
grid on; axis equal;

% 子图3: 正圆球体
subplot(1,3,3);
surf(x_sphere, y_sphere, z_sphere, ‘FaceAlpha’, 0.3, ‘EdgeColor’, ‘none’, ‘FaceColor’, ‘red’);
hold on;
scatter3(0, 0, 0, 100, ‘r’, ‘filled’, ‘Marker’, ‘x’, ‘LineWidth’, 3);
title(sprintf(‘正圆球体 (半径=%.2f)’, r_avg));
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);
legend(‘正圆球体’, ‘中心(0,0,0)’);
grid on; axis equal;

% 坐标变换函数
fprintf(‘\n=== 坐标变换公式 ===\n’);
fprintf(‘1. 坐标平移:\n’);
fprintf(‘ x_new = x_original – (%.2f)\n’, x0_orig);
fprintf(‘ y_new = y_original – (%.2f)\n’, y0_orig);
fprintf(‘ z_new = z_original – (%.2f)\n’, z0_orig);

fprintf(‘\n2. 半径归一化(生成正圆):\n’);
fprintf(‘ 目标半径 R = %.2f\n’, r_avg);
fprintf(‘ 对于任意点 (x, y, z),正圆坐标为:\n’);
fprintf(‘ magnitude = sqrt(x² + y² + z²)\n’);
fprintf(‘ scale = %.2f / magnitude\n’, r_avg);
fprintf(‘ x_sphere = x * scale\n’);
fprintf(‘ y_sphere = y * scale\n’);
fprintf(‘ z_sphere = z * scale\n’);

% 验证变换
fprintf(‘\n=== 变换验证 ===\n’);
test_points = [x0_orig, y0_orig, z0_orig; % 原始中心点
x0_orig + a_orig, y0_orig, z0_orig; % X轴端点
x0_orig, y0_orig + b_orig, z0_orig; % Y轴端点
x0_orig, y0_orig, z0_orig + c_orig]; % Z轴端点

for i = 1:size(test_points, 1)
x_orig = test_points(i, 1);
y_orig = test_points(i, 2);
z_orig = test_points(i, 3);

% 坐标平移
x_centered = x_orig – x0_orig;
y_centered = y_orig – y0_orig;
z_centered = z_orig – z0_orig;

% 半径归一化
magnitude = sqrt(x_centered^2 + y_centered^2 + z_centered^2);
scale = r_avg / magnitude;
x_sphere = x_centered * scale;
y_sphere = y_centered * scale;
z_sphere = z_centered * scale;
sphere_radius = sqrt(x_sphere^2 + y_sphere^2 + z_sphere^2);

fprintf(‘点%d:\n’, i);
fprintf(‘ 原始: (%.1f, %.1f, %.1f)\n’, x_orig, y_orig, z_orig);
fprintf(‘ 平移: (%.1f, %.1f, %.1f), 距离=%.1f\n’, x_centered, y_centered, z_centered, magnitude);
fprintf(‘ 正圆: (%.1f, %.1f, %.1f), 半径=%.1f\n’, x_sphere, y_sphere, z_sphere, sphere_radius);
end

% 完整的坐标变换函数
fprintf(‘\n=== 完整变换函数 ===\n’);
fprintf(‘function [x_sphere, y_sphere, z_sphere] = transformToSphere(x, y, z)\n’);
fprintf(‘ %% 输入: 原始坐标\n’);
fprintf(‘ %% 输出: 正圆球体上的坐标\n’);
fprintf(‘ \n’);
fprintf(‘ %% 椭球参数\n’);
fprintf(‘ x0 = %.4f;\n’, x0_orig);
fprintf(‘ y0 = %.4f;\n’, y0_orig);
fprintf(‘ z0 = %.4f;\n’, z0_orig);
fprintf(‘ R = %.4f;\n’, r_avg);
fprintf(‘ \n’);
fprintf(‘ %% 坐标平移\n’);
fprintf(‘ x_centered = x – x0;\n’);
fprintf(‘ y_centered = y – y0;\n’);
fprintf(‘ z_centered = z – z0;\n’);
fprintf(‘ \n’);
fprintf(‘ %% 半径归一化\n’);
fprintf(‘ magnitude = sqrt(x_centered^2 + y_centered^2 + z_centered^2);\n’);
fprintf(‘ if magnitude > 0\n’);
fprintf(‘ scale = R / magnitude;\n’);
fprintf(‘ x_sphere = x_centered * scale;\n’);
fprintf(‘ y_sphere = y_centered * scale;\n’);
fprintf(‘ z_sphere = z_centered * scale;\n’);
fprintf(‘ else\n’);
fprintf(‘ x_sphere = R; y_sphere = 0; z_sphere = 0;\n’);
fprintf(‘ end\n’);
fprintf(‘end\n’);

% 辅助函数:生成椭球面
function [x, y, z] = generate_ellipsoid(x0, y0, z0, a, b, c, n)
theta = linspace(0, 2*pi, n);
phi = linspace(0, pi, n);
[Theta, Phi] = meshgrid(theta, phi);

x = x0 + a * sin(Phi) .* cos(Theta);
y = y0 + b * sin(Phi) .* sin(Theta);
z = z0 + c * cos(Phi);
end

% 辅助函数:生成球体
function [x, y, z] = generate_sphere(x0, y0, z0, r, n)
theta = linspace(0, 2*pi, n);
phi = linspace(0, pi, n);
[Theta, Phi] = meshgrid(theta, phi);

x = x0 + r * sin(Phi) .* cos(Theta);
y = y0 + r * sin(Phi) .* sin(Theta);
z = z0 + r * cos(Phi);
end

//Qt转换

QVector3D MainWindow::transformToSphere(double x, double y, double z)
{
// 椭球参数
const double centerX = -303.51;
const double centerY = -60.65;
const double centerZ = 132.76;
const double radius = 231.34; // 平均半径

// 坐标平移
double x_centered = x – centerX;
double y_centered = y – centerY;
double z_centered = z – centerZ;

// 半径归一化
double magnitude = std::sqrt(x_centered * x_centered +
y_centered * y_centered +
z_centered * z_centered);

if (magnitude > 1e-10) {
double scale = radius / magnitude;
return QVector3D(x_centered * scale,
y_centered * scale,
z_centered * scale);
} else {
return QVector3D(radius, 0, 0);
}
}