我在矩形空间中有一组点.缩放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='.')
Run Code Online (Sandbox Code Playgroud)

我想将这些点缩放为抛物线,使得近点的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='.')
Run Code Online (Sandbox Code Playgroud)

然而,有时候,我不想要一个完整的抛物线.我希望有一个缓冲区:
SC <- 200
x_scale_200 = x * (y + SC)
y_scale_200 = y * (y + SC)
plot(x_scale_200, y_scale_200, pch='.')
Run Code Online (Sandbox Code Playgroud)

随着SC接近无穷大,绘制的空间接近原始矩形:
SC <- 10000
x_scale_10k = x * (y + SC)
y_scale_10k = y * (y + SC)
plot(x_scale_10k, y_scale_10k, pch='.')
Run Code Online (Sandbox Code Playgroud)

我想创建一个从0到1 T扩展的变量SC.我基本上不知道变形程度随着SC变大而变化.
在我看来,一个函数指定T = 0会产生一个抛物线,其中T = 1会产生一个矩形.我可以乘T10,000和使用(只是做假设的结果是足够接近矩形),但之间的区别T = 0,并T = 0.1会比之间的差异更大T = 0.9和T = 1.0.我想T线性地扩大'翘曲'的程度.T关于翘曲的数学关系(线性缩放)可能是什么以及如何在这里编码,只是有点迷失.
我考虑在数学论坛中发布这个,但认为它仍适合stackoverflow.
虽然我最初从未解决过这个问题(事实证明我不需要),但我只是碰巧遇到了这个问题(四年后),答案对我来说似乎很明显。
一种解决方案是使用 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='.')
Run Code Online (Sandbox Code Playgroud)