如何在圆周上找到点

时间:2018-01-03 16:50:34

标签: python math pygame

如何在圆周上找到用户定义的点数量。然后,当找到它时,将其放在二维数组中供以后使用。为了更好地观察它:

enter image description here

感谢所有帮助:)

3 个答案:

答案 0 :(得分:1)

你想找到点(x,y),这些点是方程x ^ 2 + y ^ 2 = R ^ 2的解的点。

首先请注意,x和y都必须在[-R,R]中,当你选择x(或y)时,可以通过求解y = sqrt(R ^ 2 - x ^ 2)找到另一个。

另一种方法是使用角度θ和x = R * cos(θ),y = R * sin(theta)。你只需要在[0,2 * PI]弧度中求解theta(sin,cos通常使用弧度,PI弧度为180度)。 这取决于你是否想要使用三角函数(sin / cos是超越函数)。

您可以将这些点(x,y)转换为新的中心(xc,yc),只需将(x1,y1)添加到(x,y)以获得转换点(xt,yt)=(x + xc) ,Y + YC)。

答案 1 :(得分:1)

我假设您希望这些点均匀分布。

圆圈围绕中心360度,或2pi弧度。

你需要将2pi除以你想要的点数。说4 - > 2PI / 4

是从一个点到下一个点的弧度数。

计算x和y坐标使用这两个方程r = sqrt(x2 + y2),和 θ= tan-1(y / x)

其中θ1= 0 * 2 * pi / 4,θ2= 1 * 2 * pi / 4,θ3= 2 * 2 * pi / 4,θ4= 3 * 2 * pi / 4

一些代码看起来像这样:

import numpy as np

def get_points(radius, number_of_points):
    radians_between_each_point = 2*np.pi/number_of_points
    list_of_points = []
    for p in range(0, number_of_points):
        list_of_points.append( (radius*np.cos(p*radians_between_each_point),radius*np.sin(p*radians_between_each_point)) )
    return list_of_points

答案 2 :(得分:1)

您也可以使用pygame' Vector2课程。只需旋转半径长度的矢量,然后将其添加到圆心即可得到圆周上的点。

import pygame as pg
from pygame.math import Vector2


def points(number, center, radius):
    angle = 360/number
    point_list = []
    for i in range(number):
        # Create a vector with the length of the radius, rotate it
        # and add it to the center point to get a point on the circumference.
        vec = center + Vector2(radius, 0).rotate(i*angle)
        # pygame.draw.circle needs ints, so we have to convert the vector.
        point_list.append([int(vec.x), int(vec.y)])
    return point_list


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    center = (320, 240)
    radius = 150
    number = 2
    point_list = points(number, center, radius)

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_c:
                    number += 1 # Increment the number and generate new points.
                    point_list = points(number, center, radius)

        screen.fill((30, 30, 30))
        pg.draw.circle(screen, (220, 120, 0), center, radius, 2)
        for pos in point_list:
            pg.draw.circle(screen, (0, 120, 250), pos, 20, 2)
        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()