Obrót obrazka o dowolny kąt.

0

Witam wszytskich programistów;] mam nadzieję, że uzyskam tutaj odpowiedzi na moje pytania. Mimo, ze jestem amatorem w Delphi to udało mi się zrobić następujący program(z pomocą internetu oczywiście;])

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, ExtDlgs, StdCtrls, Buttons, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
BitBtn1: TBitBtn;
OpenPictureDialog1: TOpenPictureDialog;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Image2: TImage;
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if OpenPictureDialog1. Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName)
else ShowMessage('Nie wybrano żadnego obrazka!!!');
end;

procedure TForm1.Button1Click(Sender: TObject);

var alfa,cosa, sina, sina90, cosa90:real;
x,y,x1,y1,ox,oy:integer;
begin
{pobranie kąta podanego w radianach}
alfa:=strtofloat(edit1.text);
{wyliczenie potrzebnych funkcji trygonometrycznych, żeby zmniejszyć
czas wykonania pętli}
cosa:=cos(alfa);
sina:=sin(alfa);
cosa90:=cos(alfa+pi/2);
sina90:=sin(alfa+pi/2);
{Zdefiniowanie punktu wokół którego ma odbywać się obrót- w tym
przypadku jest to środek obrazka}
ox:=image1.Picture.width div 2;
oy:=image1.Picture.height div 2;
{pętla rysująca}
for x:=0 to image1.picture.width-1 do
for y:=0 to image1.picture.height-1 do begin
{wyliczenie współrzędnych po obrocie}
x1:=round(cosa*(x-ox)+cosa90*(y-oy));
y1:=round(sina*(x-ox)+sina90*(y-oy));
{narysowanie na płótnie odpowiedniego pixela}
canvas.pixels[x1+60,y1+60]:=image2.picture.bitmap.canvas.pixels[x,y];
canvas.pixels[x1+61,y1+60]:=image2.picture.bitmap.canvas.pixels[x,y];
{60,60 będzie punktem odpowiadającym punktowi znajdującemu się na
osi obrotu}
end;
end;

end.

I moje pytania są następujące:

  • jak zrobić aby już obrócony obraz pojawiał się w okienku IMAGE 2
  • w okienku po wpisaniu nie wartości liczbowej tylko np tekstu lub coś podobnego wyskakiwał komunikat ERROR
  • a także jakby ktoś wklepał ten program do Delphi to obrócony obrazek jest nie wyraźny... tak jakby pixele się nie obracały i wychodzą różne "kwiatuszki".
    Bardzo proszę o pomoc!!
0

Kod niesformatowany to nawet nie czytam, jak nie umiesz formatować - wspomóż się chociażby: http://olesio.eu/delfor . Co do sprawdzania czy tekst jest prawidlową liczbą całkowitą to Val lub TryStrToInt a co do obracania obrazu to chyba jest art na 4p. Tworzysz obiekt TBitmap, pobierasz Assignem do niego Bitmapę z Image, obracasz Bitmapę własnym kodem albo znalezionym na sieci, przypisujesz z powrotem bitmapę do Image, bo chyba o to Tobie chodzi. Na google znajdziesz przykłady.

EDIT: wcześniej był zły link do programu. Ma być oczywiście http://olesio.eu/delfor bo /fb to program do czego innego, nad którego dopracowaniem siedzialem ostatnio prawie cały dzień, więc odruchowo podałem ten lin :)

2

http://delphi.about.com/cs/adptips2001/a/bltip1201_4.htm

if not ((ord(key) in [48..57]) or (ord(key) = 8)) then key:=#0;// w evencie keypress

nie chcę mi się patrzec na ten kod.

1

@up
Przecież Key jest typu Char więc można prościej i czytelniej

if not (Key in[#8, #48..#57]) then Key := #0;

1 użytkowników online, w tym zalogowanych: 0, gości: 1