You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言实现已知两平面夹角的三维直线绘制及角度差异统计比较

三维线段确定、绘制与组间角度差异统计方法

已知条件

  • 核心需求:三维空间中已知线段长度、线段与两个参考平面的夹角,需确定并绘制对应三维直线,同时统计比较多组线段的平均角度差异,要求基于R语言实现。
  • 已知线段oA的长度、与两个平面的夹角a1、a2,参考示意图如下:
    手绘问题示意图
  • 目前已通过几何计算得到线段端点的(X,Y,Z)坐标,计算逻辑参考示意图如下:
    几何计算过程示意图

三维线段确定与绘制

已知线段长度、线段与两个正交参考平面(默认取XY平面、XZ平面)的夹角时,可直接解算端点坐标:

  • 设线段总长度为L,与XY平面的夹角为a1,与XZ平面的夹角为a2
  • Z轴方向分量:z = L * sin(a1)
  • Y轴方向分量:y = L * sin(a2)
  • X轴方向分量:x = sqrt(L^2 - y^2 - z^2)
  • 若线段起点为原点o(0,0,0),则端点A坐标为(x,y,z),调用R的rgl包即可完成三维线段绘制。

多组线段角度差异统计(R实现)

三维线段的方向差异以方向向量的夹角为核心统计指标,实现流程如下:

  • 将所有线段统一转换为起点在原点的方向向量,消除长度差异对角度比较的干扰
  • 分别计算两组线段的平均方向向量
  • 计算两个平均方向向量的夹角,作为组间平均角度差异值
  • 通过置换检验判断差异的统计显著性,无需对角度分布做预设假设

可直接运行的示例代码:

# 加载三维可视化依赖包
library(rgl)

# ----------------------
# 示例数据构造(可替换为实际计算得到的端点坐标)
# 每行对应1条线段的端点坐标,所有线段起点统一为原点(0,0,0)
set.seed(123)
# oA组共30条线段
group_A <- data.frame(
  x = rnorm(30, 1, 0.2),
  y = rnorm(30, 0.5, 0.2),
  z = rnorm(30, 0.3, 0.1)
)
# oB组共30条线段
group_B <- data.frame(
  x = rnorm(30, 0.8, 0.2),
  y = rnorm(30, 0.7, 0.2),
  z = rnorm(30, 0.4, 0.1)
)

# ----------------------
# 组间角度差异计算
# 计算两组的平均方向向量
mean_vec_A <- colMeans(group_A)
mean_vec_B <- colMeans(group_B)

# 计算平均方向的夹角(输出为角度制)
cos_theta <- sum(mean_vec_A * mean_vec_B) / (sqrt(sum(mean_vec_A^2)) * sqrt(sum(mean_vec_B^2)))
# 处理浮点误差避免越界
mean_angle_diff <- acos(pmin(pmax(cos_theta, -1), 1)) * 180/pi

# 置换检验计算差异显著性
perm_angle_test <- function(g1, g2, perm_num = 999){
  obs_diff <- mean_angle_diff
  all_data <- rbind(g1, g2)
  perm_diffs <- replicate(perm_num, {
    sample_idx <- sample(nrow(all_data), nrow(g1))
    perm_m1 <- colMeans(all_data[sample_idx, ])
    perm_m2 <- colMeans(all_data[-sample_idx, ])
    perm_cos <- sum(perm_m1*perm_m2)/(sqrt(sum(perm_m1^2))*sqrt(sum(perm_m2^2)))
    acos(pmin(pmax(perm_cos, -1), 1))*180/pi
  })
  p_val <- (sum(perm_diffs >= obs_diff) + 1)/(perm_num + 1)
  return(list(组间平均角度差异 = mean_angle_diff, 显著性p值 = p_val))
}

test_result <- perm_angle_test(group_A, group_B)
print(test_result)

# ----------------------
# 三维可视化
# 绘制原点
plot3d(0,0,0, xlim = c(-1.5,1.5), ylim = c(-1.5,1.5), zlim = c(-1.5,1.5), 
       col = "black", size = 8, xlab = "X", ylab = "Y", zlab = "Z")
# 绘制A组所有线段(半透明红色)
for(i in 1:nrow(group_A)){
  lines3d(c(0, group_A$x[i]), c(0, group_A$y[i]), c(0, group_A$z[i]), 
          col = rgb(1,0,0,0.3))
}
# 绘制B组所有线段(半透明蓝色)
for(i in 1:nrow(group_B)){
  lines3d(c(0, group_B$x[i]), c(0, group_B$y[i]), c(0, group_B$z[i]), 
          col = rgb(0,0,1,0.3))
}
# 绘制两组平均方向(加粗实线)
lines3d(c(0, mean_vec_A[1]), c(0, mean_vec_A[2]), c(0, mean_vec_A[3]), 
        col = "red", lwd = 4)
lines3d(c(0, mean_vec_B[1]), c(0, mean_vec_B[2]), c(0, mean_vec_B[3]), 
        col = "blue", lwd = 4)
  • 结果说明:输出的组间平均角度差异为两组线段平均方向的夹角数值,单位为度;显著性p值小于0.05时可认为两组线段的角度分布存在统计学差异。

内容的提问来源于stack exchange,提问作者Yann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:54:09