Как добавить нормальный закон распределения в координаты точки принадлежащей заданным значениям массива

Имеется круг (синий) , описанный сферическими координатами (x1=rcos(theta),x2=rsin(theta)) с координатам центра (0;0) и радиусом R. На некоторой точке круга (координаты X1[n],X2[n]) имеется точка B (красный круг) с координатам центра соответствующими положению на круге X1[n],X2[n] (координаты точки B строго привязаны к массивам точек круга X1[0..N],X2[0..N]).

введите сюда описание изображения

Как добавить ошибку в координаты точки B распределенной по нормальному закону распределения при этом чтобы точки всегда принадлежали кругу ? (см. функцию draw_point)

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import pylab
x0=0; y0 = 0; h=10
r = np.sqrt(2.0) 
fig, ax = plt.subplots(1)
class PointA(object):
    def __init__(self, x,y):
        self.x = x; self.y = y
class PointB(object):
    def __init__(self, x,y):
        self.x = x; self.y = y;
class circle(object):
    def __init__(self, r):
        #self.x1 = x1; self.x2 = x2; 
        self.r = r; 
def line(PointA, PointB, t):
    m = PointB.x - PointA.x
    n = PointB.y - PointA.y
    point = [0,0]
    point[0] = PointA.x + m*t 
    point[1] = PointA.y + n*t 
    return point
PointB1 = PointB(0,0)
circle1=circle(r)
theta = np.linspace(0, 2*np.pi, 100)
def draw_circle(r,ax):
    x1 = x0+r*np.cos(theta) 
    x2 = y0+r*np.sin(theta)
    ax.plot(x1, x2, color="b")
    return(x1,x2)
draw_circle(r,ax)
x1, x2 = draw_circle(r,ax)
def draw_point(x, y, ax):
    x_point = x1[0]+r/10*np.cos(theta) 
    y_point = x2[0]+r/10*np.sin(theta) 
    ax.plot(x_point, y_point, color="r")
draw_point(PointB1.x, PointB1.y, ax)
ax.set_aspect(1)
plt.grid(linestyle='--')
plt.xlim(-2,20)
plt.ylim(-2,2)
plt.show()

Ответы (1 шт):

Автор решения: passant

Да уж высочайшее неумение внятно сформулировать вопрос - отличительная черта вопросов последнего (карантинного) времени. Видать многим школьникам делать нечего - кинулись изучать Python. По видеоурокам. К тому-же дивно написанная программка, когда в функцию

draw_point(x, y, ax)

передаются параметры, которые вообще внутри функции не задействованы. В общем, одни слезы.

Предположу (!!!), что вам требуется примерно вот такой результат

введите сюда описание изображения

По крайней мере - "точки всегда принадлежали кругу" (на самом деле, конечно, окружности), а координаты (на самом деле - угол тета) - распределены по нормальному закону. Достигнуть этого можно примерно вот так:

def draw_point1(ax):
    a=theta[0]+random.normalvariate(0,0.25)
    x_point = x0+r*math.cos(a) 
    y_point = y0+r*math.sin(a) 
    ax.scatter(x_point, y_point, color="r")
for i in range(30):
    draw_point1(ax) 

А уж под свою задачу - донастраивайте сами.

→ Ссылка