python - barplot - pandas plot
Python-Genera vértices aleatorios alrededor de la posición central(x, y) (2)
Puede usar la biblioteca random
para muestrear al azar en coordenadas polares. Muestra una orientación, luego muestra una distancia radial. En el siguiente ejemplo elegí que la orientación se distribuiría uniformemente en [0, 2*pi]
y que el radio se distribuiría normalmente con la media de entrada del usuario y la desviación estándar.
import random
import math
def generate_points(center_x, center_y, mean_radius, sigma_radius, num_points):
points = []
for i in range(num_points):
theta = random.uniform(0, 2*math.pi)
radius = random.gauss(mean_radius, sigma_radius)
x = center_x + radius * math.cos(theta)
y = center_y + radius * math.sin(theta)
points.append([x,y])
return points
Como un ejemplo de cómo llamarlo
>>> generate_points(5.0, 7.0, 1.0, 0.1, 8)
[[4.4478263120757875, 6.018608023032151],
[4.407825651072504, 6.294849028359581],
[5.0570272843718085, 6.17834681191539],
[5.307793789416231, 6.156715230672773],
[4.368508167422119, 7.712616387293795],
[5.327972045495855, 5.917733119760926],
[5.748935178651789, 6.437863588580371],
[3.9312163910881033, 6.388093041756519]]
Si quiere que los puntos se enrollen en un orden particular, entonces usaría algo como numpy.linspace
para caminar en sentido horario o antihorario para muestrear theta. Por ejemplo
import random
import math
import numpy as np
def generate_points(center_x, center_y, mean_radius, sigma_radius, num_points):
points = []
for theta in np.linspace(0, 2*math.pi - (2*math.pi/num_points), num_points):
radius = random.gauss(mean_radius, sigma_radius)
x = center_x + radius * math.cos(theta)
y = center_y + radius * math.sin(theta)
points.append([x,y])
return points
Si no quieres instalar numpy
, puedes escribir tu propia versión similar de linspace
def linspace(start, stop, num_steps):
values = []
delta = (stop - start) / num_steps
for i in range(num_steps):
values.append(start + i * delta)
return values
No he podido encontrar un artículo o una pregunta de stackoverflow sobre este tema cuando lo necesito.
Estoy haciendo un juego en 2D y quiero generar un asteroide en forma aleatoria. Cada asteroide tiene un centro, una posición X, Y
, quiero generar, digamos 8 vértices a su alrededor (el número de vértices es variable)
Si puedo lograr esta forma ahora, quiero agregar un elemento aleatorio, digamos una distancia variable y aleatoria desde el centro para crear una forma de roca aleatoria.
Investigué un concepto de trigonometría llamado Polar a coordenadas cartesianas, pero no he podido averiguar cómo aplicarlo a este objetivo. Aunque hay tutoriales en Javascript, usa bibliotecas y funciones que tendría que hacer en Python desde cero.
EDITAR: Entonces tu respuesta se centra en explicar la fórmula para obtener los vértices en el centro, estas son las cosas que ya sé cómo hacer,
1) Dibuje un polígono en la biblioteca de gráficos que estoy usando 2) Obtenga números aleatorios
¡Muchas gracias de antemano!
Una manera fácil sería elegir al azar uno o dos o tres vértices no adyacentes, y simplemente moverlos una cantidad aleatoria que no sea más que la distancia al vértice más cercano.