[ Goq @ 12.07.2003. 13:45 ] @
Ljudi, da li neko ima proceduru za TextureMapping u 2D prostoru (bez 3D korekcija i sl, samo da se razvuce slika).
Najbolje da je pisana na pascal-delphi jeziku.

Prevrnuh pola interneta ali nisam nasao neku normalnu proceduru. Najbolje sto sam nasao je ovo:

// Make sure to add Math to your uses clause.

procedure TForm1.bmp_rotate(src,dst:tbitmap;angle:extended);
var
c1x,c1y,c2x,c2y:integer;
p1x,p1y,p2x,p2y:integer;
radius,n:integer;
alpha:extended;
c0,c1,c2,c3:tcolor;
begin
//calculate the angle to pi-format
angle := (angle / 180) * pi;

// calculate the central points
c1x := src.width div 2;
c1y := src.height div 2;
c2x := dst.width div 2;
c2y := dst.height div 2;

// number of steps
if c2x < c2y then
n := c2y
else
n := c2x;
dec (n,1);

// starting rotation
for p2x := 0 to n do begin
for p2y := 0 to n do begin
if p2x = 0 then
alpha:= pi/2
else
alpha := arctan2(p2y,p2x);
radius := round(sqrt((p2x*p2x)+(p2y*p2y)));
p1x := round(radius * cos(angle+alpha));
p1y := round(radius * sin(angle+alpha));

c0 := src.canvas.pixels[c1x+p1x,c1y+p1y];
c1 := src.canvas.pixels[c1x-p1x,c1y-p1y];
c2 := src.canvas.pixels[c1x+p1y,c1y-p1x];
c3 := src.canvas.pixels[c1x-p1y,c1y+p1x];

dst.canvas.pixels[c2x+p2x,c2y+p2y]:=c0;
dst.canvas.pixels[c2x-p2x,c2y-p2y]:=c1;
dst.canvas.pixels[c2x+p2y,c2y-p2x]:=c2;
dst.canvas.pixels[c2x-p2y,c2y+p2x]:=c3;
end;
application.processmessages
end;
end;

// Here is how to call it
procedure TForm1.bmpRotateClick(Sender: TObject);
Var
RAngle : Extended;
begin
RAngle := StrToFloat(Edit1.Text);
bmp_rotate(Image1.Picture.Bitmap,Image2.Picture.Bitmap, RAngle);
end;

Smesno, i uz to sporo (:.)
[ bokash @ 13.07.2003. 04:32 ] @
Ako ti treba samo razvlacenje onda koristi Blt.
Ova funkcija dole je koliko sam shvatio za rotiranje bitmape.
Sta ti treba preciznije?
[ Goq @ 13.07.2003. 10:14 ] @
Hvala sto, zelis da mi pomognes. Nisam bio najprecizniji : meni treba procedura sledeceg oblika:

procedure map(t1,t2,t3,t4:Tpoint,.....)

Slika treba da se razvuce izmedju 4 tacke. Blt funkcija iscrtava slike pod pravim uglom (BitBlt recimo).


[ bokash @ 15.07.2003. 05:34 ] @
AKo hoces deformaciju slike u nepravilnom cetvorouglu
onda algoritam mora da negde duplira piksele a negde
da ih oduzima i sigurno je kompleksniji od ovog za rotaciju.
Zamisli konkavan cetvorougao koji zauzima par procenata
originala.
Jedna ideja ( na dugom stapu):
Uzmes GDI+, kod njega brush moze da bude bitmapa
pa da njome crtas u regionu ili pathu. KAko ce to da ispadne
nemam pojma, nemam GDI+ dokumentaciju.
Ako bi te zadovoljilo da jednostavno odseces delove bitmape
onda radis sa regionima (pogledaj clanke o skiningu).
DirectX ima implementirane gornje pomenute algoritme
(nearest-point sampling, linear filtering, anisotropic filtering,
bilinear filtering) pri mapiranju tekstura.
Ako neko ima bolju ideju i mene bi zanimalo.