Fórum Girar em tantos graus? #173922
08/08/2003
0
Alguem tem alguma funcao que gira um Canvas ou um TImage ou qualquer coisa do tipo em Tantos graus iguao ao q o Paint faz?
Obrigado!
Nildo
Curtir tópico
+ 0Posts
08/08/2003
Cebikyn
ela não trabalha exatamente com o canvas, mas sim com o [b:8020d5fba5]TBitmap[/b:8020d5fba5].
FUNCTION RotateBitmapMethod1(CONST BitmapOriginal: TBitmap; CONST iRotationAxis, jRotationAxis: INTEGER; CONST AngleOfRotation: DOUBLE; // em radianos VAR RotateMilliseconds: DWORD): TBitmap; VAR cosTheta : EXTENDED; i : INTEGER; iOriginal : INTEGER; iPrime : INTEGER; j : INTEGER; jOriginal : INTEGER; jPrime : INTEGER; RowOriginal : pRGBTripleArray; RowRotated : pRGBTRipleArray; sinTheta : EXTENDED; StartTime : DWORD; begin RESULT := TBitmap.Create; RESULT.Width := BitmapOriginal.Width; RESULT.Height := BitmapOriginal.Height; RESULT.PixelFormat := pf24bit; StartTime := GetTickCount; sincos(AngleOfRotation, sinTheta, cosTheta); FOR j := RESULT.Height-1 DOWNTO 0 DO BEGIN RowRotated := RESULT.Scanline[j]; jPrime := j - jRotationAxis; FOR i := RESULT.Width-1 DOWNTO 0 DO BEGIN iPrime := i - iRotationAxis; iOriginal := iRotationAxis + ROUND(iPrime * CosTheta - jPrime * sinTheta); jOriginal := jRotationAxis + ROUND(iPrime * sinTheta + jPrime * cosTheta); IF (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND (jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1) THEN BEGIN RowOriginal := BitmapOriginal.Scanline[jOriginal]; RowRotated[i] := RowOriginal[iOriginal] END ELSE BEGIN RowRotated[i].rgbtBlue := 255; // Nessas três linhas RowRotated[i].rgbtGreen := 0; // de código você altera RowRotated[i].rgbtRed := 0; // a cor de fundo da figura final END END END; RotateMilliseconds := GetTickCount - StartTime; END;
[b:8020d5fba5]BitmapOriginal[/b:8020d5fba5]: TBitmap que será rotacionado
[b:8020d5fba5]iRotationAxis[/b:8020d5fba5], [b:8020d5fba5]jRotationAxis[/b:8020d5fba5]: Coordenadas do centro de rotação
[b:8020d5fba5]AngleOfRotation[/b:8020d5fba5]: Ângulo para rotacionar a figura. O ângulo deve ser em radianos, para converter graus para radianos use a função DegToRad.
[b:8020d5fba5]RotateMilliseconds[/b:8020d5fba5]: Variável do tipo [i:8020d5fba5]DWORD[/i:8020d5fba5] que armasenará quanto tempo foi necessário para realizar o procedimento (em milisegundos).
É necessário incluir [b:8020d5fba5]Math[/b:8020d5fba5] na seção [i:8020d5fba5]uses[/i:8020d5fba5] de sua [i:8020d5fba5]unit[/i:8020d5fba5]
Gostei + 0
09/08/2003
Marcelo Saviski
Gostei + 0
09/08/2003
Cebikyn
const MaxPixelCount = 32768; type TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple; pRGBTripleArray = ^TRGBTripleArray;
Gostei + 0
09/08/2003
Nildo
Funciono!
Gostei + 0
10/08/2003
Robotizar
const MaxPixelCount = 32768; type TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple; pRGBTripleArray = ^TRGBTripleArray;
eu num entendo de ponteiros não mais pq vc usou como ponteiro? pq num usou TRGBTripleArray de uma vez? o q ganha com isso?
se alguém poder me responder ficarei agradecido
Gostei + 0
10/08/2003
Marcelo Saviski
const MaxPixelCount = 32768; type TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple; pRGBTripleArray = ^TRGBTripleArray;
eu num entendo de ponteiros não mais pq vc usou como ponteiro? pq num usou TRGBTripleArray de uma vez? o q ganha com isso?
se alguém poder me responder ficarei agradecido[/quote:3ee9873809]
Pelo que vi, é porque BitmapOriginal.Scanline[N] tambem retorna um pointer
Gostei dessa função! uma vez estava tentando fazer alguma coisa assim, mas não dava certo, agora me deparei com esse Scanline, o que ele faz? retorna um array com todos os pixels da linha?
E como a function é rápida!, comparando com as minhas tentativas anteriores :(
Ela funcionou muito bem, mas com alguns bitmaps ficava tudo manchado, alguem saberia porque?
Gostei + 0
10/08/2003
Cebikyn
Sinceramente, eu não sei :oops: , eu apenas copiei a função de um programinha de exemplo...
[quote:41d7cf7e46=´Marcelo Saviski´]Gostei dessa função! uma vez estava tentando fazer alguma coisa assim, mas não dava certo, agora me deparei com esse Scanline, o que ele faz? retorna um array com todos os pixels da linha?[/quote:41d7cf7e46]
Sim, a função [i:41d7cf7e46]ScanLine[/i:41d7cf7e46] retorna os pixels da linha.
[quote:41d7cf7e46=´Marcelo Saviski´]Ela funcionou muito bem, mas com alguns bitmaps ficava tudo manchado, alguem saberia porque?[/quote:41d7cf7e46]
Talvez porque a função trabalha apenas com bitmaps de 24bits. Na linha de código [b:41d7cf7e46]RESULT.PixelFormat := pf24bit;[/b:41d7cf7e46] , vê-se que a função ´força´ o bitmap a ter este formato, se você estiver usando outro formato de bitmap, provavelmente esta aí o problema.
Gostei + 0
10/08/2003
Nildo
To tentando aki mas a imagem to ficando em branco...
Valews!
Gostei + 0
10/08/2003
Marcelo Saviski
Gostei + 0
11/08/2003
Nildo
Eh sempre bom contar com o forum!
Gostei + 0
07/05/2004
Marcelo Saviski
Gostei + 0
07/05/2004
Nildo
Gostei + 0
14/01/2005
Gabriela
Alguém tem algum outro código que não perca?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)