2017-09-26 98 views
1

我试图从其4个角生成网格点。由于这个角落可以自由放置,它会看起来像网格有一个透视。从4个角度创建网格透视

我已经写在处理中,其中角部按顺时针顺序将下面的代码(起始于左上角)

PVector[][] setGrid(PVector[] corners, int cols, int rows) { 
    PVector[][] grid = new PVector[rows][cols]; 
    for(int y = 0; y < rows; y++) { 
     float fY = (float)y/(rows - 1); 
     PVector p1 = PVector.lerp(corners[0], corners[3], fY); 
     PVector p2 = PVector.lerp(corners[1], corners[2], fY); 
     for(int x = 0; x < cols; x++) { 
      grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1)); 
     } 
    } 
    return grid; 
} 

这产生具有内插点的网格,但它不对应于透视网格。所有的在线点都是等距的,而在透视图中,最接近点应该比最远点更分离。

我希望得到一些方向,如果可能的话,在Java /加工

编辑

为了澄清我的答案。我定义了4个随机角点,我想获得所有创建perspective deformed grid的点。请注意,因为透视图dX1!= dX2以及dY1!= dY2。我写的代码不会产生这种效果(我知道这一点,但我不知道该如何去做)因为点是插值的,导致dX1 = dX2 = ... = dXi和dY1 = dY2 = ... = dYi

我已阅读有关视角变换,但我不需要变换图像,我只需要得到grid points coordinates

+0

我真的不知道是什么你问。你可以请发表[mcve]而不是断开连接的功能吗?你可以发表你想要做的模拟吗?哪一行代码的行为与您的预期不同? –

+0

我试图解释我自己一点点更好,并添加了我想要实现的所需结果的绘图 – markusand

回答

0

在您的示例图像中,透视效果是通过保持沿不同长度边缘的线数不变来实现的。这就是你的实现,所以我真的没有看到这个问题。

这里是呼唤你的setGrid()草图:

PVector[] corners; 

void setup(){ 
    size(150,100); 
    corners = new PVector[4]; 
    corners[0] = new PVector(35,20); 
    corners[1] = new PVector(15,height-30); 
    corners[2] = new PVector(width-10,height-10); 
    corners[3] = new PVector(width-30,10); 
    noLoop(); 
} 
void draw(){ 
    background(255); 
    PVector[][] results = setGrid(corners, 9, 9); 
    for(PVector[] pvs : results){ 
    for(PVector pv : pvs){ 
     ellipse(pv.x,pv.y,5,5); 
    } 
    } 
} 

PVector[][] setGrid(PVector[] corners, int cols, int rows) { 
    PVector[][] grid = new PVector[rows][cols]; 
    for(int y = 0; y < rows; y++) { 
     float fY = (float)y/(rows - 1); 
     PVector p1 = PVector.lerp(corners[0], corners[3], fY); 
     PVector p2 = PVector.lerp(corners[1], corners[2], fY); 
     for(int x = 0; x < cols; x++) { 
      grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1)); 
     } 
    } 
    return grid; 
} 

...,结果看起来非常像你的目标图像。如果您看到不同的东西,也许您正在创建边缘长度非常相似的网格?

如果要投影的角度对规则的梯形 - 就像一个人行道后退到距离 - 再考虑这种方法代替:

+0

我共享的方法的结果并不是我真正需要的。同一列或行中的点之间的距离是等距的,而点应该距离观看者越近,而“越远”越小。我不确定在2D场景中是否有某种模拟此3D效果的算法 – markusand

+0

有一种算法 - 就像我在上面链接的math.stackexchange答案中一样 - 但是您必须提供伪3D信息。在那里看到自我回答。 – JeremyDouglass