坐标变换的缩放

Scaling for coordinate transformation

我在矩形 space 中有一组点。缩放 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='.')

我想将这些点缩放成抛物线,以便 y= 0 附近的点的 x 值比 y= 750 附近的 x 值更接近,本质上是扭曲图像:

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

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

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

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

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

随着 SC 接近无穷大,绘制的 space 接近原始矩形:

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

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

我想创建一个变量 T,将 SC 从 0 缩放到 1。我基本上不知道随着 SC 变大,翘曲程度如何变化.

在我看来,指定 T = 0 的函数会产生抛物线,而 T = 1 会产生矩形。我可以将 T 乘以 10,000 并使用它(只是假设结果足够接近矩形),但是 T = 0T = 0.1 之间的差异将比T = 0.9T = 1.0 之间的区别。我想 T 线性缩放 'warping' 的度数。关于(线性缩放)T 与翘曲的数学关系可能是什么以及如何在此处对其进行编码,只是有点迷失。

我考虑过在数学论坛上发布这个,但认为它对于 Whosebug 来说仍然足够合适。

虽然我最初从未解决过这个问题(事实证明我不需要)我只是碰巧遇到了这个问题(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='.')