坐标变换的缩放

问题描述 投票:5回答:1

我在一个矩形空间内有一组点。X 坐标的比例是以 0 为中心的。

#original points
x <- scale(runif(10000, min= 0, max= 1000), scale=FALSE)
y <- runif(10000, min= 0, max= 750)

plot(x, y, pch='.')

plot_1

我想把这些点缩放成一条抛物线 这样,在X坐标附近的点的X值就会变成 y= 0 比x值接近于 y= 750,本质上是扭曲了图像。

#SC = scale
SC <- 0
x_scale = x * (y + SC)
y_scale = y * (y + SC)

plot(x_scale,y_scale, pch='.')

plot_2

然而,有时候,我并不想要一个完整的抛物线。我希望有一点缓冲区。

SC <- 200 
x_scale_200 = x * (y + SC)
y_scale_200 = y * (y + SC)

plot(x_scale_200, y_scale_200, pch='.')

plot_3

就像... SC 接近于无穷大,绘制的空间接近于原来的矩形。

SC <- 10000
x_scale_10k = x * (y + SC)
y_scale_10k = y * (y + SC)

plot(x_scale_10k, y_scale_10k, pch='.')

plot_4

我想创建一个变量 T规模 SC 从0到1,我基本上不知道翘曲程度是如何变化的。SC 越来越大。

在我看来,一个函数指定 T = 0 将导致一条抛物线,其中 T = 1 会导致一个矩形。我可以直接乘以 T 乘以10,000,然后使用这个(只是做了一个假设,即结果足够接近于一个矩形),然而,这两者之间的差异 T = 0T = 0.1 将远远大于 T = 0.9T = 1.0. 我想 T 以线性缩放'翘曲'的程度。只是有点不明白,(线性缩放)的数学关系是什么?T 到翘曲可能是以及如何在这里编码。

我考虑过把这个贴在数学论坛上,但觉得还是适合放在stackoverflow上。

r scale
1个回答
0
投票

虽然我最初从未解决过这个问题(事实证明我不需要),但我只是碰巧遇到了这个问题(4年后),答案对我来说似乎很明显。

一个解决方案是使用logit函数来转换输入(在这种情况下,需要使用0.5到1,而不是0到1,但这也可以缩放。由于R不喜欢Inf(logit(1)的结果),所以必须从1中减去一个小值,然后将其缩放为1000(根据一些摆弄选择),以从抛物线缩放为矩形。

sc_fun <- function(x)
{
  if (x == 1)
  {
    x1 <- x - 0.0000000000001
  } else {
    x1 <- x
  }
  SC <- boot::logit(x1) * 1000

  return(SC)
}

SC <- sc_fun(0.5)

x_scale_fun = x * (y + SC)
y_scale_fun = y * (y + SC)
plot(x_scale_fun, y_scale_fun, pch='.')

SC <- sc_fun(1)

x_scale_fun = x * (y + SC)
y_scale_fun = y * (y + SC)
plot(x_scale_fun, y_scale_fun, pch='.')
© www.soinside.com 2019 - 2024. All rights reserved.