• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

Wie kann man eine Poisson Disc Sampler?

Tobero

Tobero

Mitglied
Ich habe sehr lange im Internet gesucht, habe aber kein Beispiel für Java gefunden. Kann mir jemand eins geben?
 
Tobero

Tobero

Mitglied
Ich hab jetzt jetzt einen code geschrieben, aber benötige vom Vector2 das sqrMagnitude. Ich weiß nicht wie ich das machen soll.
Der Code fürs Poisson Disc Sampling:
public static List<Vector2> GeneratePoints(float radius, Vector2 sampleRegionSize, int numSamplesBeforeRejection)
    {
        float cellSize = (float) (radius / Math.sqrt(2));

        int[][] grid = new int[(int) Math.ceil(sampleRegionSize.x / cellSize)][(int) Math.ceil(sampleRegionSize.y / cellSize)];
        List<Vector2> points = new ArrayList<Vector2>();
        List<Vector2> spawnPoints = new ArrayList<Vector2>();

        spawnPoints.add(sampleRegionSize.div(2));
        while (spawnPoints.size() > 0)
        {
            int spawnIndex = Utils.getRandom(0, spawnPoints.size());
            Vector2 spawnCentre = spawnPoints.get(spawnIndex);
            boolean candidateAccepted = false;

            for (int i = 0; i < numSamplesBeforeRejection; i++)
            {
                float angle = (float) (new Random().nextFloat() * Math.PI * 2);
                Vector2 dir = new Vector2(Math.sin(angle), Math.cos(angle));
                Vector2 candidate = spawnCentre.add(dir.mul(Utils.getRandom(radius, 2 * radius)));
                if (IsValid(candidate, sampleRegionSize, cellSize, radius, points, grid))
                {
                    points.add(candidate);
                    spawnPoints.add(candidate);
                    grid[(int)(candidate.x / cellSize)][(int)(candidate.y / cellSize)] = points.size();
                    candidateAccepted = true;
                    break;
                }
            }
            if (!candidateAccepted)
            {
                spawnPoints.remove(spawnIndex);
            }

        }

        return points;
    }

    static boolean IsValid(Vector2 candidate, Vector2 sampleRegionSize, float cellSize, float radius, List<Vector2> points, int[][] grid)
    {
        if (candidate.x >= 0 && candidate.x < sampleRegionSize.x && candidate.y >= 0 && candidate.y < sampleRegionSize.y)
        {
            int cellX = (int)(candidate.x / cellSize);
            int cellY = (int)(candidate.y / cellSize);
            int searchStartX = Math.max(0, cellX - 2);
            int searchEndX = Math.min(cellX + 2, grid.length - 1);
            int searchStartY = Math.max(0, cellY - 2);
            int searchEndY = Math.min(cellY + 2, grid.length - 1);

            for (int x = searchStartX; x <= searchEndX; x++)
            {
                for (int y = searchStartY; y <= searchEndY; y++)
                {
                    int pointIndex = grid[x][y] - 1;
                    if (pointIndex != -1)
                    {
                        float sqrDst = (candidate.sub(points.get(pointIndex))).sqrMagnitude;
                        if (sqrDst < radius * radius)
                        {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
 
H

httpdigest

Top Contributor
In diesem Code:
Java:
float sqrDst = (candidate.sub(points.get(pointIndex))).sqrMagnitude;
if (sqrDst < radius * radius) {
  ...
}
steht das "sqr" in `sqrDst` für "square" (also ein Wert zum Quadrat) und "Dst" steht hier in diesem Kontext für "Distance".
Also: Das Quadrat der Distanz.
Und hier ist damit einfach die euklidische Distanz/Länge des Vektors, zum Quadrat, gemeint.
Dieser Wert wird ja dann auch mit dem Radius zum Quadrat verglichen.
Die Länge zum Quadrat statt der eigentlichen euklidischen Distanz zu verwenden ist ein berühmter Trick, um die Laufzeit von einer Quadratwurzel zu sparen, weil man die Werte nur komparativ vergleichen will.
Das heisst, du brauchst hier nur das innere/skalar-Produkt des Vektors auszurechnen.
 
D

dress19

Mitglied
Was er dir damit sagen will, schreib einfach if ((candidate.sub(points.get(pointIndex))).magnitude < radius) { return false; }.
 
H

httpdigest

Top Contributor
Nein. Woher soll ich denn wissen, ob ein Instanzfeld namens "magnitude" überhaupt auf dem statischen Typ des Ausdrucks existiert?
Und ausserdem: Wenn dieses Instanzfeld (genauso wie sqrMagnitude) existiert, dann ist es eine ziemlich schlechte/ineffiziente Implementierung eines Vektors, weil ja bei jeder Erzeugung einer neuen Vektor-Instanz dieses Feld berechnet werden müsste. Und wenn es soetwas wie ein "magnitude" Instanzfeld gäbe, müsste hier auch jedesmal die Quadratwurzel berechnet werden. Das will der eigentliche Code ja gerade vermeiden, nehme ich an.
Wir wissen also gar nicht, von welchen Klassen hier überhaupt die Rede ist...
 
Tobero

Tobero

Mitglied
Hab es jetzt hingekriegt. Vector2 hält einfach nur zwei floats, X, Y

PoissonDiscSampling:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class PoissonDiscSampling {
    
    public static List<Vector2> GeneratePoints(float radius, final Vector2 sampleRegionSize, int numSamplesBeforeRejection)
    {
        float cellSize = (float) (radius / Math.sqrt(2));       
        
        int[][] grid = new int[(int) (sampleRegionSize.x / cellSize)][(int) (sampleRegionSize.y / cellSize)];
        List<Vector2> points = new ArrayList<Vector2>();
        List<Vector2> spawnPoints = new ArrayList<Vector2>();

        spawnPoints.add(new Vector2(sampleRegionSize.x / 2, sampleRegionSize.y / 2));
        while (spawnPoints.size() > 0)
        {
            int spawnIndex = Utils.getRandom(0, spawnPoints.size() - 1);
            Vector2 spawnCentre = spawnPoints.get(spawnIndex);
            boolean candidateAccepted = false;

            for (int i = 0; i < numSamplesBeforeRejection; i++)
            {
                float angle = (float) (new Random().nextFloat() * Math.PI * 2);
                Vector2 dir = new Vector2(Math.sin(angle), Math.cos(angle));
                Vector2 candidate = spawnCentre.add(dir.mul(Utils.getRandom(radius, 2 * radius)));
                                
                if (IsValid(candidate, sampleRegionSize, cellSize, radius, points, grid))
                {
                    points.add(candidate);
                    spawnPoints.add(candidate);
                    try {
                        grid[(int)(candidate.x / cellSize)][(int)(candidate.y / cellSize)] = points.size();                       
                    } catch (Exception e) {}
                    candidateAccepted = true;
                    break;
                }
            }
            if (!candidateAccepted)
            {
                spawnPoints.remove(spawnIndex);
            }

        }

        return points;
    }

    static boolean IsValid(Vector2 candidate, Vector2 sampleRegionSize, float cellSize, float radius, List<Vector2> points, int[][] grid)
    {
        if (candidate.x >= 0 && candidate.x < sampleRegionSize.x && candidate.y >= 0 && candidate.y <= sampleRegionSize.y)
        {
            int cellX = (int)(candidate.x / cellSize);
            int cellY = (int)(candidate.y / cellSize);
            int searchStartX = Math.max(0, cellX - 2);
            int searchEndX = Math.min(cellX + 2, grid.length - 2);
            int searchStartY = Math.max(0, cellY - 2);
            int searchEndY = Math.min(cellY + 2, grid.length - 2);
            for (int x = searchStartX; x <= searchEndX; x++)
            {
                for (int y = searchStartY; y <= searchEndY; y++)
                {
                    int pointIndex = -1;
                    try {
                        pointIndex = grid[x][y] - 1;
                    } catch (Exception e) {}
                    if (pointIndex != -1)
                    {
                        float sqrDst = (candidate.sub(points.get(pointIndex))).magnitude();
                        sqrDst = (float) Math.sqrt(sqrDst);
                        if (sqrDst < radius * radius)
                        {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}

Meine Magnitude Lösung:
public float magnitude()
    {
        return (float)Math.sqrt(x*x + y*y);
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
I Eine Anwendung so gut wie möglich beschützen Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
R bei eclipse von java in eine andere programmiersprache wechseln? Allgemeine Java-Themen 2
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
S wie rufe ich mit .jar datei eine .bat auf? Allgemeine Java-Themen 15
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
E Methoden Hat jemand eine gute Lösung? Allgemeine Java-Themen 5
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
Exdroid BlueJ Wie bekomme ich die Ausgabe in eine TXT Datei? Allgemeine Java-Themen 2
0 Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
Tausendsassa Interface Eine Gui von einer anderen schließen lassen Allgemeine Java-Themen 3
S Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..? Allgemeine Java-Themen 3
S Best Practice Brauche eine Idee für eine Java Projekt! Allgemeine Java-Themen 11
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
V Gibt es eine Möglichkeit die Internet auslastung mit Java auszulesen Allgemeine Java-Themen 11
L Drop Emails von Outlook in eine JList Allgemeine Java-Themen 5
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
P Dezimalzahl in eine Binärzahl umrechnen Allgemeine Java-Themen 12
M Eine static-Methode verlassen Allgemeine Java-Themen 2
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Thallius Wie mache ich eine Java App mit Icon startbar die mehr Heap Speicher braucht? Allgemeine Java-Themen 3
M Eclipse Eine xhtml aus einem JSF Projekt starten Allgemeine Java-Themen 2
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
Sogomn Klassen Alle in eine Klasse Allgemeine Java-Themen 11
S Eine Klasse die jeden String nur einmal annimmt Allgemeine Java-Themen 4
J Fehler beim parsens eine Datums Allgemeine Java-Themen 3
L Leerzeichen zu string hinzufügen, um eine gerade zahl zu erhalten Allgemeine Java-Themen 9
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
A Eine Spezifikation für meine Bachelorarbeit! Allgemeine Java-Themen 3
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
J Ist eine Instanz von einem bestimmten Object Typ? Allgemeine Java-Themen 6
O Prüfen ob String eine Zahl mit maximal 2 Nachkommastellen ist Allgemeine Java-Themen 4
X Schauen ob eine bestimmte .exe geöffnet ist Allgemeine Java-Themen 7
C Eine Frage zur Bearbeitungszeit Allgemeine Java-Themen 8
M Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
J kann eine .jar sich selbst verschieben? Allgemeine Java-Themen 6
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
P Sinnfragen, um eine riesige Verzeichnisstruktur zu durchsuchen und zu verarbeiten Allgemeine Java-Themen 20
A eine test thread.join() frage Allgemeine Java-Themen 2
C Was bekomme ich eine Nullpointerexception? (Apache POI) Allgemeine Java-Themen 3
S Datentypen Eine Variable von String zu Int ändern Allgemeine Java-Themen 5
L Eine jar verwenden, die intern auf eine andere jar zugreift Allgemeine Java-Themen 7

Ähnliche Java Themen

Anzeige

Neue Themen


Oben