如何围绕两点绘制矩形
How to draw a rectangle around two points
我正在使用 pygame 和数学模块尝试围绕两点绘制一个矩形。这就是我的意思:
从点到矩形端点的距离被指定为 class 的属性。我已经尝试了很多方法才能将它放到它所在的位置,显示的角度可能是唯一的工作角度。这是我的 class 矩形:
def Pol(x, y):
"""Converts rectangular coordinates into polar ones"""
if x == 0: # This might be the source of my problems, but without it, it raises ZeroDivisionErrors at certain places
if y >= 0:
return [y, 90]
else:
return [-y, 270]
r = math.sqrt(x**2+y**2)
angle = (math.degrees(math.atan((y/x))))%360
return [r, angle]
class Path(pygame.sprite.Sprite):
def __init__(self, start, end, color, width, **options):
self.__dict__.update(options)
self.start = start
self.end = end
self.color=color
# Call the parent class (Sprite) constructor
super().__init__()
# Pass in the color of the blob, and its x and y position, width and height
# Set the background color and make it transparent
self.width = width
# Draw the path
self.redraw()
# Fetch the rectangle object that has the dimensions of the image.
self.rect = self.image.get_rect()
self.rect.x, self.rect.y = (self.start[0]-self.width//2+self.ix,
self.start[1]-self.width//2+self.iy)
if self.inversed:
self.rect.y-=(math.ceil(self.image.get_rect()[3]/2)-self.iy)
def redraw(self):
dis, angle = Pol(self.end[0]-self.start[0], self.end[1]-self.start[1])
dis += self.width
_image = pygame.Surface([dis, self.width])
_image.fill([255, 255, 255])
_image.set_colorkey([255, 255, 255])
pygame.draw.rect(_image, self.color, pygame.Rect(0, 0, dis, self.width))
nangle = (180-angle)%360
self.inversed = nangle>=180
self.image = pygame.transform.rotate(_image, nangle)
i1 = _image.get_rect()
i2 = self.image.get_rect()
ix = i2[2]-i1[2]
iy = i2[3]-i1[2]
self.ix = ix//2
self.iy = iy//2
所以,我给了它一些分数,它负责所有繁重的工作和绘图。我在图像中通过它的点是 (100, 100) and (200, 200)
。然后我用 (300, 300) and (200, 200)
试了一下,结果半成功:
上面的代码,您可以尝试使用其他值,但您会发现它很快就会出现问题。总结一下,我的问题是,是否有一种可靠的方法可以在给定的两个点周围绘制一个矩形?我试过:
- 画粗线,但 pygame 线在某些角度被打断,并有水平结尾
- 用这些值一遍又一遍地测试和播放,我试过的都不起作用
- 更改反向 if 语句。按照我认为应该发生的,已经落后了
问题是函数 math.atan()
,其中 returns 角度范围 [-pi/2,+pi/2]。
使用 math.atan2()
(参见 math)其中 returns 范围 [-pi,+pi] 中的角度。因此这个函数一次给出正确的角度,你不需要任何修正:
angle = (math.degrees(math.atan((y/x))))%360
angle = math.degrees(math.atan2(y, x))
另见 What is the difference between atan and atan2 in C++?
我正在使用 pygame 和数学模块尝试围绕两点绘制一个矩形。这就是我的意思:
从点到矩形端点的距离被指定为 class 的属性。我已经尝试了很多方法才能将它放到它所在的位置,显示的角度可能是唯一的工作角度。这是我的 class 矩形:
def Pol(x, y):
"""Converts rectangular coordinates into polar ones"""
if x == 0: # This might be the source of my problems, but without it, it raises ZeroDivisionErrors at certain places
if y >= 0:
return [y, 90]
else:
return [-y, 270]
r = math.sqrt(x**2+y**2)
angle = (math.degrees(math.atan((y/x))))%360
return [r, angle]
class Path(pygame.sprite.Sprite):
def __init__(self, start, end, color, width, **options):
self.__dict__.update(options)
self.start = start
self.end = end
self.color=color
# Call the parent class (Sprite) constructor
super().__init__()
# Pass in the color of the blob, and its x and y position, width and height
# Set the background color and make it transparent
self.width = width
# Draw the path
self.redraw()
# Fetch the rectangle object that has the dimensions of the image.
self.rect = self.image.get_rect()
self.rect.x, self.rect.y = (self.start[0]-self.width//2+self.ix,
self.start[1]-self.width//2+self.iy)
if self.inversed:
self.rect.y-=(math.ceil(self.image.get_rect()[3]/2)-self.iy)
def redraw(self):
dis, angle = Pol(self.end[0]-self.start[0], self.end[1]-self.start[1])
dis += self.width
_image = pygame.Surface([dis, self.width])
_image.fill([255, 255, 255])
_image.set_colorkey([255, 255, 255])
pygame.draw.rect(_image, self.color, pygame.Rect(0, 0, dis, self.width))
nangle = (180-angle)%360
self.inversed = nangle>=180
self.image = pygame.transform.rotate(_image, nangle)
i1 = _image.get_rect()
i2 = self.image.get_rect()
ix = i2[2]-i1[2]
iy = i2[3]-i1[2]
self.ix = ix//2
self.iy = iy//2
所以,我给了它一些分数,它负责所有繁重的工作和绘图。我在图像中通过它的点是 (100, 100) and (200, 200)
。然后我用 (300, 300) and (200, 200)
试了一下,结果半成功:
上面的代码,您可以尝试使用其他值,但您会发现它很快就会出现问题。总结一下,我的问题是,是否有一种可靠的方法可以在给定的两个点周围绘制一个矩形?我试过:
- 画粗线,但 pygame 线在某些角度被打断,并有水平结尾
- 用这些值一遍又一遍地测试和播放,我试过的都不起作用
- 更改反向 if 语句。按照我认为应该发生的,已经落后了
问题是函数 math.atan()
,其中 returns 角度范围 [-pi/2,+pi/2]。
使用 math.atan2()
(参见 math)其中 returns 范围 [-pi,+pi] 中的角度。因此这个函数一次给出正确的角度,你不需要任何修正:
angle = (math.degrees(math.atan((y/x))))%360
angle = math.degrees(math.atan2(y, x))
另见 What is the difference between atan and atan2 in C++?