2016-07-02 10 views
0

Angenommen, die Abmessungen meines Fensters betragen 400 x 600.Wie erzeugt man zufällige Punkte außerhalb eines Rechtecks?

Es ist relativ leicht, einen beliebigen Punkt auf einer einzigen Seite zu erzeugen, lassen Sie sich mit der Spitze an sagen:

random.randint(0, width) 

Aber was wäre der klügste Weg, dies für alle 4 Seiten zur Arbeit zu kommen, so dass ein Random Point wird außerhalb eines Rechtecks ​​generiert?

Wenn ich

pos_x = [random.randint(0, width)] 
pos_y = [random.randint(0, height)] 

tun Sie zeigen nur an den Ecken nach oben, was Sinn macht. Der einzige Weg, an den ich denken kann, ist, zufällig einen Punkt innerhalb des Rechtecks ​​zu erzeugen, zu vergleichen, welche Achse am nächsten an einer Grenze ist, und dann zu klammern. Tatsache ist, dass ich nicht weiß, wie ich das elegant machen kann, ohne 4 Kontrollen für jede Seite zu machen (was sich überflüssig anfühlt). Ich habe das Gefühl, dass es eine einfachere Lösung dafür gibt?

Hier ist eine Lösung, die fast funktioniert, aber es ist so langatmig. Habe gerade gemerkt, dass dies weniger Punkte in den Ecken bekommt.

# Create a random point inside the rectangle 
pos_x = random.randint(0, width) 
pos_y = random.randint(0, height) 

# Get a distance for each side 
left_border = pos_x 
right_border = width-pos_x 
top_border = pos_y 
bottom_border = height-pos_y 

borders = [left_border, right_border, top_border, bottom_border] 

index_1 = 0 
index_2 = 2 
closest_side = 0 

# Get closest from left/right borders 
if right_border < left_border: 
    index_1 = 1 

# Get closest from top/bottom borders 
if bottom_border < top_border: 
    index_2 = 3 

# Get closest border 
if borders[index_1] < borders[index_2]: 
    closest_side = index_1 
else: 
    closest_side = index_2 

if closest_side == 0: 
    obj.pos.x = 0 # Clamp to left wall 
elif closest_side == 1: 
    obj.pos.x = width # Clamp to right wall 
elif closest_side == 2: 
    obj.pos.y = 0 # Clamp to top wall 
else: 
    obj.pos.y = height # Clamp to bottom wall 
+0

Wo ist (0, 0), die obere linke Ecke des Recrangle? – ayhan

+0

@ayhan Ja, das ist richtig. –

+1

Möglicherweise verwandt: [Pythonic Weg, um zufällig gleichmäßig verteilt Punkte innerhalb hohlen quadratischen Lamina zu erzeugen] (http://StackOverflow.com/q/37101001/190597) – unutbu

Antwort

1

Sorry; hat die Frage beim ersten Mal völlig falsch interpretiert.

Wenn Sie nur einen Punkt zufällig auf der Kante ein Rechteck holen wollen, versuchen Sie so etwas wie diese:

p = random.randint(0, width + width + height + height) 
if p < (width + height): 
    if p < width: 
    obj.pos.x = p 
    obj.pos.y = 0 
    else: 
    obj.pos.x = width 
    obj.pos.y = p - width 
else: 
    p = p - (width + height) 
    if p < width: 
    obj.pos.x = width - p 
    obj.pos.y = height 
    else: 
    obj.pos.x = 0 
    obj.pos.y = height - (p - width) 

einfach, nimmt er einen beliebigen Punkt auf einer Linie, die die gleiche Länge wie der Umfang des Rechtecks ​​umschließt dann diese Zeile um das Rechteck herum, um x- und y-Koordinaten zu erhalten.

Um sicherzustellen, dass die Verteilung an den Ecken gleich bleibt, wird jedes der vier Segmente als ausschließlich-exklusive Intervalle (kann 0 sein, kann nicht Breite oder Höhe sein) und sie sind so platziert, dass jeder von ihnen beginnt in einer anderen Ecke.

+0

Vielen Dank für das Zurückkommen, ich werde das bald überprüfen. –

+0

Gerade in Java getestet. Es ist eine kluge Idee, es so als eine einzige Linie "auszupacken". Danke für die Hilfe! –