rotation af et bitmap omkring et punkt i en cirkel?
Hej Eksperter.Tidligere oprettede jeg en tråd her på sitet omkring hvordan jeg fik et billede til at roterer: http://www.eksperten.dk/spm/622697
Det viser sig nu at denne metode får det pågældende bitmap til at dreje rundt på en lidt sjov måde, da der benyttes en firkant til rotationen. Jeg vil istedet gerne have at billedet skal dreje om et bestemt punkt.
Ved en søgning på google fandt jeg et interessant eksempel: www.publicjoe.f9.co.uk/csharp/card12.html+c%23+rotate+bitmap+any+angle&hl=da" target="_blank">http://66.102.9.104/search?q=cache:ZJaEnhZD0uAJ:www.publicjoe.f9.co.uk/csharp/card12.html+c%23+rotate+bitmap+any+angle&hl=da
Her beskrive der hvordan man får et bitmap til at roterer omkring det ene hjørne af billedet, men hvad nu hvis man vil have billedet til at roterer om et andet punkt? Jeg har lavet en lille tegning så I kan se hvad jeg prøver at opnår: http://www.mpforge.info/temp/demo.jpg
figuren til venstre på ovenstående url, er sådan som man kan rotere billedet vha. eks. med kortene som jeg har henvist til ovenover - altså omkring hjørnet. Til højre er så den rotation jeg gerne vil foretage: På midten af bunden af billedet også lige 2 punkter op.
For at kunne lave denne rotation må vi altså finde ud af hvor 3 af punkterne skal være istedet for kun 2 af dem. Jeg har fundet lidt matematik på google som måske kan hjælpe: http://ga.randers-hf-vuc.dk/matlex/parameter.html#cirkel
Her finder jeg formlen ( a , b ) + r( cos(t) , sin(t) interessant.
Min kode ser så pt ud som følgende:
void MainFormPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
Bitmap pic = (Bitmap)Image.FromFile(@"..\..\billeder\player_gunned.bmp");
Point location = PointToClient(MousePosition);
int x1 = 100;
int y1 = 100;
int degree = 50;
//double sinD = Math.Abs(Math.Sin(degree));
//double cosD = Math.Abs(Math.Cos(degree));
double radAngle = ((degree / 180.0) * Math.PI);
// Calculate lower left coordinate
Point lowerLeft = new Point(
x1 + (int)(0 * Math.Cos(radAngle)) - pic.Width/2,
y1 + (int)(0 * Math.Sin(radAngle)));
// Calculate upper right coordinate
Point upperRight = new Point(
x1 + (int)(pic.Height * Math.Cos(radAngle)) + pic.Width/2,
y1 + (int)(pic.Height * Math.Sin(radAngle)));
// Calculate upper left coordinate
Point upperLeft = new Point(
x1 + (int)(pic.Height * Math.Cos(radAngle)) - pic.Width/2,
y1 + (int)(pic.Height * Math.Sin(radAngle)) );
Point [] points;
points = new Point[] {
//new Point( x1, y1 ),
upperLeft,
upperRight,
lowerLeft
};
g.DrawImage(pic, points);
//g.DrawImage(pic,x1,y1,x2,y2);
label1.Text = string.Format("x,y:({0},{1}) - x,y:{2}", x1, y1, lowerLeft);
}
Sådan som koden er her, der opfører billedet sig underligt. I dette tilfælde skulle den gerne lave en rotation på 50 grader omkring midten af bunden, men istedet for bliver billedet underligt skævt... og når man drejer den 0 grader eller 180 så vises billedet slet ikke.
Nu er det 3 år siden jeg har beskæftiget mig med noget matematik som kommer det her bare lidt nært, så håbede på lidt hjælp fra jer derude som har bedre "feeling" med den del.