C#2D游戏,在椭圆上的一个点上以切线角度旋转

时间:2014-11-27 12:29:17

标签: c#

我正在制作一个2D游戏,其中三角形枪在圆顶上移动,使用drawArc绘制圆顶,这是椭圆的一半。我已经计算了x和y坐标,以便三角形的中间跟随曲线并且偏移使得它漂浮在圆顶上方,就像一个平面。 问题是它必须旋转到切点的角度,我相信我的数学是正确的,但它不起作用。现在,它做了一些根本没有意义的怪异轮换。

以下是我希望它如何移动的图: https://app.box.com/s/lh689tnhdjcduzxt0mp5

这是我正在使用的数学: https://app.box.com/s/ee0isbjnjds2yg32toqd

以下是代码:

计算类的方法

    public static double TangentialAngel(float XCoordinateInPoint, float YCoordinateInPoint, int centerToArcY, int centerToArcX, int centerCoordinateX, int centerCoordinateY)
    {
        return Math.Atan(-((Math.Pow(centerToArcX, 2) * (XCoordinateInPoint - centerCoordinateX)) / (Math.Pow(centerToArcY, 2) * (centerCoordinateY - YCoordinateInPoint))));
    }
来自OnPaint的

代码

    startLine = new Point(spacing, this.Size.Height - 10);//Angir starten på linjen i bunnen av grafikken, trekker fra 10 forde jeg ønkser at det skal vere mellomrom mellom bunn av vindu og linja.
            endLine = new Point(this.Size.Width - spacing, this.Size.Height - 10);//Angir slutten på linjen i bunnen av grafikken

            startPointArcRect = new Point(spacing, this.Size.Height - 10 - this.Size.Height / (arcSizeDynamicModifier * 2) - arcSizeStaticModifier / 2);//Angir start pungtet til rektangeles som Arcen lages etter
            sizeArcRect = new Size(this.Size.Width - spacing * 2, this.Size.Height / arcSizeDynamicModifier + arcSizeStaticModifier);//Angir størrelsen på rektangeles som Arcen lages etter

            solidBlackBrush = new SolidBrush(Color.Black); //En solid svart brush som brukes flere steder
            solidBackPen = new Pen(solidBlackBrush, 2);//En solid svart pen som brukes flere steder

            //Tegner Linje og arc       
            e.Graphics.DrawLine(solidBackPen, startLine, endLine);
            arc.Draw(e.Graphics, solidBackPen, new Rectangle(startPointArcRect, sizeArcRect));

            int transformX = spacing*2; int transformY = this.Height - 10;

            foreach (House house in houses)
            {
                if (transformX < this.Width - house.Width * 2 - 10)
                {
                    e.Graphics.TranslateTransform(transformX, transformY - house.Height);
                    house.Draw(solidBackPen, e.Graphics);
                    transformX += house.Width*2;
                    e.Graphics.ResetTransform();

                }

            }



            offsetGunY = plane.Height; //Definerer hvor mye Y kordinatet må flyttes for at flyet skal sveve over linen ikke under.
            offsetGunX = plane.Width / 2; //Definerer hvor mye X kordiatet må flyttes for at rotasjonskpungtet til pistolen skal havne på mitten ikke gjørnet.



            //Henter vinkele til flyet
            planeLocationAngle = plane.LocationAngle;

            //Beregner radius i pungtet
            radiusInPoint = Compute.RadiusInPoint(arc.CenterToArcY, arc.CenterToArcX, planeLocationAngle);

            xCoordinateInPoint = Compute.XCoordinateInPoint(arc.CenterX, radiusInPoint, planeLocationAngle);
            yCoordinateInPoint = Compute.YCoordinateInPoint(arc.CenterY, radiusInPoint, planeLocationAngle);

            plane.RotationAngle = Compute.TangentialAngel(xCoordinateInPoint, yCoordinateInPoint, arc.CenterToArcY, arc.CenterToArcX, arc.CenterY, arc.CenterX);
            planeRotationAngle = plane.RotationAngle;

            foreach (Bullet bullet in bullets)
            {
                bullet.Draw(solidBackPen, e.Graphics);
            }

            //Flytter 0 slik at pistolen havner på rett sted
            e.Graphics.TranslateTransform(xCoordinateInPoint, yCoordinateInPoint);
            e.Graphics.RotateTransform((float)Compute.RadianToDegree(planeRotationAngle));

            //Flytter 0 slik at pistolen havner på linja ikke under
            e.Graphics.TranslateTransform(-offsetGunX, -offsetGunY);

            //Tegner pistol og resetter transformasjon
            plane.Draw(e.Graphics);
            e.Graphics.DrawString("0", new Font("Times new roman", 10, FontStyle.Regular), new SolidBrush(Color.Blue), 0, 0);
            //TODO Fjern resetTransform før innlevering vis den ikke er nødvendeig da
            e.Graphics.ResetTransform();

1 个答案:

答案 0 :(得分:0)

我修正了数学,并在此过程中输入了一个致命的拼写错误。 错误是我在arc.CenterX,arc.CenterY上切换位置。这就是它应该是这样的:

plane.RotationAngle = Compute.TangentialAngel(xCoordinateInPoint, yCoordinateInPoint, arc.CenterToArcY, arc.CenterToArcX, arc.CenterX, arc.CenterY);

这是完成的数学方法:

public static double TangentialAngel(float XCoordinateInPoint, float YCoordinateInPoint, int centerToArcY, int centerToArcX, int centerCoordinateX, int centerCoordinateY)
    {
        double centerToArcYPowTwo = Math.Pow(centerToArcY, 2);
        double centerToArcXPowTwo = Math.Pow(centerToArcX, 2);
        float XcoordinateInCero = XCoordinateInPoint - centerCoordinateX;
        float YcoordinateInCero = centerCoordinateY - YCoordinateInPoint;

        return Math.Atan((centerToArcYPowTwo * XcoordinateInCero) / (centerToArcXPowTwo * YcoordinateInCero));
    }