我正在制作一个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();
答案 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));
}