gpt4 book ai didi

java - 从 4 个角创建透视网格

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:29 25 4
gpt4 key购买 nike

我正在尝试从 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 .

最佳答案

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

这是一个调用 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;
}

...结果看起来几乎与您的目标图像一模一样。如果您看到不同的东西,也许您正在创建边长非常相似的网格?

如果您想将透视投影到一个规则的梯形上——就像一条逐渐远去的人行道——那么请考虑这种方法:

关于java - 从 4 个角创建透视网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46430716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com