C#围绕图像旋转图像';s位置,相对于鼠标位置

C#围绕图像旋转图像';s位置,相对于鼠标位置,c#,image,rotation,cursor,C#,Image,Rotation,Cursor,我在相对于鼠标位置旋转图像时遇到了一些问题。我只能让图像围绕它自己的点旋转,而不是在它上面旋转 下图说明了我要做的事情: 这是我的代码: Image sprite = Image.FromFile("1.png"); private Point spritePos; public Enemy(Point Position) { spritePos = Position; } public void Render(Graphics dc) { dc.TranslateTran

我在相对于鼠标位置旋转图像时遇到了一些问题。我只能让图像围绕它自己的点旋转,而不是在它上面旋转

下图说明了我要做的事情:

这是我的代码:

Image sprite = Image.FromFile("1.png");
private Point spritePos;

public Enemy(Point Position)
{
    spritePos = Position;
}

public void Render(Graphics dc)
{
    dc.TranslateTransform(spritePos.X, spritePos.Y); //Sets rotation point

    float angle = CalcAngle(Cursor.Position);

    dc.RotateTransform(angle); //Rotates the graphics transform

    dc.DrawImage(sprite, spritePos);

    dc.TranslateTransform(-(spritePos.X), -(spritePos.Y));
}

private float CalcAngle(Point TargetPos)
{
    Point ZeroPoint = spritePos;
    if (TargetPos == ZeroPoint)
    {
        return 0;
    }

    double angle;
    double hypotenuse;

    //Calculates the hypotenuse using Phytagoras(a^2 + b^2 = c^2)
    hypotenuse = Math.Sqrt(                                      //hypotenuse = squared(c^2)
                           Math.Pow((TargetPos.Y), 2) + //a^2  +
                           Math.Pow((TargetPos.X), 2)); //        b^2

    angle = Math.Acos((TargetPos.X) / hypotenuse); //Calculates the angle in radians
    angle = angle * 180 / Math.PI;                          //Converts the radians to degree's

    //If the cursor's y position is negative('above' the player), the returned angle is also negative
    if (TargetPos.Y < 0)
    {
        return -(float)angle;
    }
    else
    {
        return (float)angle;
    }
}
Image sprite=Image.FromFile(“1.png”);
私用点spritePos;
公敌(点位)
{
spritePos=位置;
}
公共无效渲染(图形dc)
{
dc.TranslateTransform(spritePos.X,spritePos.Y);//设置旋转点
浮动角度=角(光标位置);
dc.RotateTransform(角度);//旋转图形变换
dc.DrawImage(精灵、精灵);
dc.TranslateTransform(-(spritePos.X),-(spritePos.Y));
}
专用浮动卡角(Point TargetPos)
{
点零点=spritePos;
如果(TargetPos==零点)
{
返回0;
}
双角度;
双斜边;
//使用Phytagoras(a^2+b^2=c^2)计算斜边
斜边=数学.Sqrt(//斜边=平方(c^2)
Math.Pow((TargetPos.Y),2)+//a^2+
Math.Pow((TargetPos.X),2));//b^2
角度=数学.Acos((TargetPos.X)/斜边);//以弧度计算角度
角度=角度*180/Math.PI;//将弧度转换为度
//如果光标的y位置为负值(“在播放器上方”),则返回的角度也为负值
如果(目标位置Y<0)
{
返回(浮动)角;
}
其他的
{
返回(浮动)角;
}
}

一些指向正确方向的指针将是非常感谢的:)

你的基本想法是正确的,但顺序是错误的

首先,您应该将
dc
转换为0,0。然后旋转,然后平移回原始位置

dc.TranslateTransform(-spritePos.X, -spritePos.Y); //Sets rotation point

float angle = CalcAngle(Cursor.Position);

dc.RotateTransform(angle); //Rotates the graphics transform

dc.DrawImage(sprite, spritePos);

dc.TranslateTransform((spritePos.X), (spritePos.Y));

当前,您正在将精灵放置在距离原点两倍的位置,然后旋转,然后将其移回原始位置。

您应该将其平移到图像的中间:

dc.TranslateTransform(-spritePos.X, -spritePos.Y); //Sets rotation point

float angle = CalcAngle(Cursor.Position);

dc.RotateTransform(angle); //Rotates the graphics transform

dc.DrawImage(sprite, spritePos);

dc.TranslateTransform((spritePos.X), (spritePos.Y));
dc.TranslateTransform(-spritePos.X / 2, -spritePos.Y / 2);
float angle = CalcAngle(Cursor.Position);

dc.RotateTransform(angle); //Rotates the graphics transform

dc.DrawImage(sprite, spritePos);

dc.TranslateTransform((spritePos.X / 2), (spritePos.Y / 2));

Thx的答案,但它并没有真正解决我的问题,它仍然表现出相同的方式