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

如何基于旋转角度设置R stars包的仿射变换参数

用已知旋转角度设置stars网格的仿射变换参数

要实现已知旋转角度(逆时针为正,0代表正北)来设置stars网格的仿射参数,核心是通过三角函数将角度转换为斜切(shear)参数,对应stars中affine的两个值。

核心原理

stars的affine = c(a1, a2)参数定义了网格的斜切规则:

  • a1:每一行(y方向步进1个单位)对应的x方向偏移量
  • a2:每一列(x方向步进1个单位)对应的y方向偏移量

示例中从斜切参数反推角度的公式是atan2(a1, dim) * 180/pi,其中dim是单元格边长。反过来,已知旋转角度rot,需先将角度转换为弧度,再计算斜切参数:

  1. 将角度转换为弧度:theta_rad <- rot * pi / 180
  2. 计算斜切参数:a1 <- dim * tan(theta_rad),a2 <- dim * tan(theta_rad)

注意:当旋转角度大于180度时,tan值会重复周期特性,需结合坐标系方向调整y轴的步进方向(比如旋转265度时,y轴需要向南递减)。

修改后的完整代码

library(stars)
library(ggplot2)

# 定义网格参数
xorg <- 576206  
yorg <- 4412742
nrows <- 8 
ncols <- 5
dim <- 10   # 单元格大小

####
rot <- 265   # 旋转角度(度),相对于正北,逆时针为正
theta_rad <- rot * pi / 180
# 计算仿射变换参数
aff_mat <- c(dim * tan(theta_rad), dim * tan(theta_rad))

# 根据旋转角度调整y轴方向:当角度>180度时,y轴向南递减
if (rot > 180) {
  y <- seq(yorg, yorg - ((nrows-1)*dim), -dim)
} else {
  y <- seq(yorg, yorg + ((nrows-1)*dim), dim)
}
####

# 构建x轴序列
x <- seq(xorg, xorg + ((ncols-1)*dim), dim)

# 创建stars对象
d <- st_dimensions(x = x, y = y, .raster = c("x", "y"), affine = aff_mat)
m <- matrix(seq(1, length(x)*length(y), 1), length(x), length(y))
r1 <- st_as_stars(r = m, dimensions = d)

# 绘图
p <- ggplot() + 
  geom_stars(data = r1) + 
  coord_equal() +
  scale_fill_viridis_c() +
  theme_void() +
  theme(legend.position = 'none') 

p

效果说明

上述代码通过计算仿射参数并调整y轴方向,实现的网格倾斜效果与print(p, vp=grid::viewport(angle=rot))的旋转效果一致,符合stars vignette中的斜切变换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:55:53