如何确定圆上某个点远离圆的方向矢量?

时间:2019-08-27 15:56:50

标签: python pygame

我需要获取方向矢量[x,y],使其指向与该点所在的圆完全相反的方向。

我试图仅将x和y坐标分配给该点,但这将它们都指向同一方向

r = 70 # radius of circle
a = 0 # angle var

#create a while loop as long as the angle is bellow 2pi
while a < pi*2:
    # create an x and a y coordinate around the circle
    x = int(r * cos(a)) + 200
    y = int(r * sin(a)) + 200

    # add a ray class on that point # \/ I want to figure out these vectors
    rays += [(rayClass.Ray(x, y, 1, [direction x, direction y]))]

    # increment the angle slightly
    a += 0.01

ray类只是将在给定的xy坐标上投射一条直线的点

我需要x和y方向精确指向它们所在的圆的中心。我将如何计算它们?

2 个答案:

答案 0 :(得分:1)

从圆心到点的方向向量为:

dx, dy = cos(a), sin(a)

此方向与从法线向量到圆上的点的方向相同。因此可以通过以下方式设置射线:

x = round(r * dx) + 200
y = round(r * dy) + 200

rays += [(rayClass.Ray(x, y, 1, [dx, dy]))] 

请注意,在这种情况下,方向向量是Unit vector(单位向量的长度是1),因此分量是浮点数。

如果方向必须是整数,并且其长度必须是圆的半径:

rx, ry = round(r * cos(a)), round(r * sin(a))
x, y   = rx + 200, ry + 200

rays += [(rayClass.Ray(x, y, 1, [rx, ry]))]

另一种可能性是在PyGame中使用pygame.math.Vector2进行矢量运算。

可以通过-运算来计算方向向量,而Unit vector可以得到.normalize()(单位向量的长度为1):

circle_center   = pygame.math.Vector2(200, 200)
point_on_circle = pygame.math.Vector2(x, y)
direction       = point_on_circle  - circle_center
unit_direction  = direction.normalize()
rays += [(rayClass.Ray(x, y, 1, [unit_direction[0], unit_direction[1]]))]

答案 1 :(得分:0)

您从在该点结束的半径获得方向。从您的稀疏代码演示中,我收集到您的圆以原点为中心,并且您的“射线”主要由端点和射线上的任何其他点定义。

这很简单:射线的斜率(方向)是

m = (y-0)/(x-0)

,起始点为(x,y)。因此,包含射线的线的方程为

y' = mx'   for variables x', y', x' >= x

因此,您的射线微不足道:(x, y)的端点(您已经知道)和[x,y]的方向向量。为了安全起见,我建议将其倍增,以确保后者指向射线上的点(圆之外)。

(x, y, 1, [2*x, 2*y])

我不确定,因为您完全无法定义类,但这给了您第二个点,恰好是圆外的一个半径。