2017-09-26 5 views
1

Ich versuche, ein Raster von Punkten aus seinen 4 Ecken zu generieren. Da diese Ecken frei platziert werden können, sieht das Gitter wie eine Perspektive aus.Erstellen Sie ein Gitter in Perspektive aus 4 Ecken

I den folgenden Code in Verarbeitung geschrieben haben, wo Ecken im Uhrzeigersinn sind (beginnend am oberen linken)

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; 
} 

dies ein Gitter mit interpolierten Punkte erzeugt, aber es entspricht nicht ein perspektivisches Gitter. Alle Inline-Punkte sind äquidistant, während in der Perspektive am nächsten liegende Punkte mehr getrennt als am weitesten entfernt sein sollten.

würde ich eine gewisse Orientierung, wenn möglich, zu schätzen wissen, in Java/Verarbeitung

EDIT

meine Antwort zu klären. Ich definiere 4 zufällige Eckpunkte, ich möchte alle Punkte erhalten, die eine perspective deformed grid erstellen. Beachten Sie, dass wegen der Perspektive dX1! = DX2 sowie dY1! = DY2. Der Code, den ich geschrieben habe, hat diesen Effekt nicht (ich weiß das, aber ich weiß nicht, wie ich das machen soll), da Punkte interpoliert werden, was zu dX1 = dX2 = ... = dXi und dY1 = dY2 = ... = dYi führt

Ich habe gelesen über Perspektive transformieren, aber ich brauche kein Bild zu transformieren, ich brauche nur die grid points coordinates.

+0

Ich bin nicht wirklich sicher, was du fragst. Kannst du bitte eine [mcve] anstelle einer getrennten Funktion posten? Kannst du bitte eine Kopie von dem, was du versuchst, veröffentlichen? Welche Codezeile verhält sich anders als erwartet? –

+0

Ich habe versucht, mich ein bisschen besser zu erklären und fügte eine Zeichnung des gewünschten Ergebnisses hinzu, das ich erreichen möchte – markusand

Antwort

0

In Ihrem Beispielbild wird der perspektivische Effekt erreicht, indem die Anzahl der Linien invariant entlang Kanten unterschiedlicher Länge gehalten wird. Das ist, was Ihre Implementierung macht, also sehe ich ehrlich gesagt das Problem nicht.

Hier ist eine Skizze Ihre setGrid() aufrufen:

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; 
} 

... und das Ergebnis sieht fast genauso aus wie Ihr Zielbild. Wenn Sie etwas anderes sehen, erstellen Sie vielleicht Gitter mit sehr ähnlichen Kantenlängen?

Wenn Sie Perspektive auf einer regelmäßigen Trapez projizieren wollen - wie ein Gehweg Rückzug in die Ferne - dann diesen Ansatz betrachten statt:

+0

Das Ergebnis der Methode, die ich geteilt habe, ist nicht das, was ich wirklich brauche. Die Entfernung zwischen Punkten in der gleichen Spalte oder Reihe ist äquidistant, während es größer sein sollte, je "näher" die Punkte zum Betrachter sind, und je kleiner die "weiter" sind. Ich bin mir nicht sicher, ob es einen Algorithmus gibt, der diesen 3D-Effekt in 2D-Szenen simuliert. – markusand

+0

Es gibt einen solchen Algorithmus - wie in der mathematischen.stackexchange-Antwort, die ich oben verlinkt habe - allerdings müssen Sie die Pseudo-3D-Informationen bereitstellen . Seht die Selbstantwort dort. – JeremyDouglass

Verwandte Themen