创建一个边长为任意角度的正方形

时间:2016-04-19 01:36:33

标签: python

我正在尝试创建一个旋转炮塔。炮塔正确旋转问题是当我用空格键进行炮塔射击时,子弹在每个角度都没有相同的大小或形状。我尝试使用炮塔所面对的角度进行一些三角形计算,并找到创建子弹所需的两个角点(这是一个圆圈)。我尝试过的任何东西都不会起作用。这是代码:

Barrel = [260,210,270,210,270,170,260,170]

def RotateBarrel():
    global angle
    angleChange = 2
    mountCenterX = 265
    mountCenterY = 215
    #Rotate Barrel
    cycle = 1
    while cycle < len(Barrel):
        x = Barrel[cycle-1]-mountCenterX
        y = Barrel[cycle]-mountCenterY
        Barrel[cycle-1] = (x*math.cos(angleChange*math.pi/180)-y*math.sin(angleChange*math.pi/180))+mountCenterX
        Barrel[cycle] = (x*math.sin(angleChange*math.pi/180)+y*math.cos(angleChange*math.pi/180))+mountCenterY
        cycle += 2
    angle += angleChange
    if angle == 360: angle = 0
    canvas.coords(barrel,Barrel)
    self.after(1,RotateBarrel)

def SpinningShoot(event):
    global angle
    speed = 10
    shotXpos = Barrel[6]+10*(math.cos(angle*math.pi/180))
    shotYpos = Barrel[7]-10*(math.sin(angle*math.pi/180))
    cornerX = Barrel[6]+10*(math.cos((90-angle)*math.pi/180))
    cornerY = Barrel[7]-10*(math.sin((90-angle)*math.pi/180))
    shot = canvas.create_oval(shotXpos,shotYpos,cornerX,cornerY,fill="white")
    Xmotion = speed*math.cos(angle*math.pi/180)
    Ymotion = speed*math.sin(angle*math.pi/180) 
    Shots.append(shot)
    ShotsPos.append(shotXpos)
    ShotsPos.append(shotYpos)
    ShotsMotion.append(Xmotion)
    ShotsMotion.append(Ymotion)

1 个答案:

答案 0 :(得分:0)

在我看来你的镜头不会以“镜筒”为中心,但使用(90度角)的计算将为你提供一个角度宽度

角度 - (90°角)

是2 *角度 - 90

(即根据角度的大小拍摄会更宽)。

我会想到使用(角度 - 45)和(角度+ 45),所以你的镜头始终是相同的角度宽度,并以枪管为中心。

您还需要增加第二个角落的“半径”。我对+10和-10感到困惑,不太确定他们会做什么。

可能更好的方法是计算子弹的“中心”,然后从中心绘制圆心。我确定会有一个以中心和半径为中心的功能。

radius=10
centrex= radius  * cos ( angle * math.pi /180 )
centrey= radius * sin ( angle * math. pi / 180 )

然后将这两个和一个半径传递给一个圆圈的函数

另一件小事,我建议改变这条线

if angle == 360: angle = 0

if angle >= 360: angle = angle-360

好像角度被初始化为除了偶数之外的其他任何东西,或者你改变了角度步长,你可以“错过”360,然后再也不会回绕。