0
votes

Générer des points aléatoires hors d'un triangle

J'ai le code suivant pour générer des points aléatoires sur une carte donnée. Je veux éviter d'avoir des points dans la région du lac (coin supérieur droit). Je divisai le lac dans un rectangle et un triangle. Pour le rectangle, je pourrais déterminer comment éviter d'avoir des points là-bas. Mais pour le triangle (montré avec la ligne rouge), je n'ai pas trouvé de solution. Toute suggestion? Vous pouvez trouver le "carte.png" ci-dessous du code.

 Entrez la description de l'image ici xxx

 ici


8 commentaires

La solution la plus simple à laquelle je puisse penser est d'utiliser un cercle avec juste le rayon et la position de la droite, les intersections de points de polygone peuvent devenir assez difficiles!


@Richardbamford, le lac serait une partie du cercle. C'est une option possible d'aller avec. Souhaitez-vous aller pour une réponse codante?


@ GoodDeeds, voir la Boîte Bbox pour les limites.


Je ne peux pas écrire de python détaillé parce que je suis sur une tablette. Mais vous souhaitez avoir une liste de cercles où vous ne voulez pas de points, alors tout ce que vous faites est de boucler sur ces cercles et de vérifier la distance entre le point sur le centre des cercles. Si cette distance est inférieure au rayon du cercle, rejeter le point.


Je viens de mettre à jour avec la fonction actuelle point_generator .


@Richardbamford, plusieurs cercles ne semblent pas être efficaces car ils nécessiteront plusieurs chèques. Au lieu de cela, je pensais avoir un cercle beaucoup plus grand hors de la carte qu'une partie de celui-ci couvre le lac.


Ok, alors vous évitez votre carré maintenant, faites de la même chose pour un triangle ... vous pouvez faire les maths pour un triangle droit?


@ user8028576 Vérification réelle des distances est l'une des méthodes les plus efficaces de faire ce type de choses. Tout ce dont vous avez besoin est d'utiliser le théorum Pythagore qui est 2 maths.pows et 1 math.SQRT


3 Réponses :


0
votes

Un moyen simple mais correct de réaliser cela consiste à générer des points aléatoires dans toute la surface, puis à éliminer les points aléatoires tombés dans les zones non désirées. De cette façon, étant donné que la distribution est uniforme dans tous les domaines, la distribution restante est toujours uniforme.


0 commentaires

0
votes

Je ne connais pas vraiment les pandas, mais vous pourriez peut-être obtenir les coordonnées (x1, y1) du point de départ que vous souhaitez supprimer, puis les coordonnées du point final Vous voulez (x2, y2) puis créer un rectangle avec le rectangle que vous avez créé, comme (x1, y1) - (x2, y2) est un côté des heures de côté > (x2, y2) - (x2, y1) est l'autre côté que vous multipliez avec vous pour obtenir un rectangle. La moitié et vous avez eu la ligne côtière montrée dans votre image. L'hypoténuse est la côte réelle

  • rectangle: (x2, y1) - (x1, y1)) * (x2, y1) - (x2, y2) - (x2, y2)) = E (rect)

  • triangle: E (rect) / 2 = e (triangle)

  • littoral: ((x1, y1) - (x1, y1)) ** 2 + (x2, y1) - (x2, y2) - (x2, y2)) ** 2 = hypoténuse (littoral) < / code>

  • Représentation graphique:

    Alors maintenant, vous avez la surface que vous ne voulez pas que des points apparaissent à l'intérieur et les coordonnées qui composent cette surface.


0 commentaires

1
votes

Vous pouvez utiliser la couleur sous-jacente de l'image pour vérifier si vos points sont légitimes.

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

def bBoxPointToColor(px,w,h,BBox,point):
    row = int(((BBox[3]-point[1])/(BBox[3]-BBox[2]))*h)
    col = int(((point[0]-BBox[0])/(BBox[1]-BBox[0]))*w)
    return sum(abs(k[0]-k[1]) for k in zip(px[col,row],(159, 214, 255))) < 10

def point_generator(number,BBox):
    img = Image.open('Chicago.jpg')
    px = img.load()
    xlist,ylist = [], []
    for i in range(number):
        x = np.random.uniform(BBox[0],BBox[1])
        y = np.random.uniform(BBox[2],BBox[3])
        while bBoxPointToColor(px,img.width,img.height,BBox,[x,y]):
            x = np.random.uniform(BBox[0],BBox[1])
            y = np.random.uniform(BBox[2],BBox[3])
        xlist.append(x); ylist.append(y)
    return(xlist,ylist)

BBox = ((-89.541239, -87.541239,      
         40.773460, 42.498943))

im = plt.imread('Chicago.jpg')


fig, ax = plt.subplots(figsize = (15,15))
ax.set_xlim(BBox[0],BBox[1])
ax.set_ylim(BBox[2],BBox[3])


xs,ys = point_generator(1500,BBox)
plt.plot(xs,ys, '.b')
ax.imshow(im, zorder=0, extent = BBox, aspect= 'equal',alpha=0.5)
plt.show()


2 commentaires

Le codage des couleurs pourrait être utile pour éliminer celles sur les rivières mais ne semble pas avoir beaucoup de succès sur le lac comme vous l'avez pointé (étiquettes).


J'ai créé des boîtes plus petites sur les étiquettes et avons également supprimé ces zones. Je pourrais également résoudre le problème avec le codage de couleur mais je n'y ai jamais pensé. Merci beaucoup!