Как нарисовать лучший эллипс с учетом количества точек? - PullRequest
1 голос
/ 17 октября 2019

Учитывая векторы p, q и количество точек n, я хочу максимально приблизить форму эллипса с этими n точками. Для этого я использую параметрическое уравнение эллипса и меняю радиус и угол в двойном цикле for:

n = 10000
points = []
p = [300, 0]
q = [0, 200]
root = int(math.sqrt(n))
for a in range(root):
    for b in range(root):
        x = 400 + (a/root)*(p[0] - q[0])*math.cos(2*math.pi*b/root)
        y = 300 - (a/root)*(p[1] - q[1])*math.sin(2*math.pi*b/root)
        points.append([x, y])
for w in points:
    pygame.draw.circle(screen, (200, 50, 75), (int(w[0]), int(w[1])), 1)

Здесь я использую Pygame для рисования, но это не имеет значения. С учетом этих параметров мой эллипс выглядит так:

ellipse 1

с n = 100000. Он выглядит так: ellipse 2

Учитывая природу эллипса тамбольше точек в середине, используя базовую параметризацию радиуса и угла. Из-за этого мне нужно очень большое n, чтобы получить хорошую картинку. Как я могу изменить параметризацию, чтобы точки лучше распределялись по всей области?

1 Ответ

1 голос
/ 17 октября 2019

Возможно, создать точки равномерно и затем отфильтровать те, которые находятся вне эллипса?

import numpy as np
from math import sqrt
import matplotlib.pyplot as plt

def filter_points(h, k, a, b, x, y): 
  mask = ((x-h)**2)/(a**2) + ((y-k)**2)/(b**2) <= 1
  return x[mask], y[mask]

h = 0
k = 0
a = 4
b = 5
N = 10000
n = int(sqrt(N))

X, Y = np.meshgrid(
  np.linspace(-a,a,n),
  np.linspace(-b,b,n)
)

X, Y = filter_points(h, k, a, b, X[:], Y[:])
points = np.asarray([X, Y]).T

plt.figure
plt.plot(X,Y,'.')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...