Registriert seit: 25. Mai 2006
98 Beiträge
Delphi 7 Personal
|
[erledigt] Scanline - was ist falsch?
24. Apr 2008, 18:58
Hallo Leute, ich arbeite mich gerade in den Umgang mit Scanline ein und habe folgende Prozedur:
Delphi-Quellcode:
procedure Transform(i1,i2:timage; p:pointarray);
type tvector=record
x,y:double;
end;
function vector(vx,vy:double):tvector;
begin
result.x:=vx;
result.y:=vy;
end;
function makevector(v:tpoint):tvector;
begin
vector(v.x,v.y);
end;
function multiply(vektor:tvector; number:double):tvector;
begin
result:=vector(vektor.x*number,vektor.y*number);
end;
function add(v1,v2:tvector):tvector;
begin
result:=vector(v1.x+v2.x,v1.y+v2.y);
end;
function sub(v1,v2:tvector):tvector;
begin
result:=vector(v1.x-v2.x,v1.y-v2.y);
end;
procedure setzen(n1,n2:tpoint; b1,b2:tbitmap);
type PixArray = array [1..3] of Byte;
var p1,p2: ^PixArray;
begin
p1:=b1.scanline[n1.y];
inc(p1,n1.X);
p2:=b2.scanline[n2.y];
inc(p2,n2.X);
p2^[1]:=p1^[1];
p2^[2]:=p1^[2];
p2^[3]:=p1^[3];
end;
var A,B,C,D,v,x:tvector;
i,j:integer;
b1,b2:tbitmap;
begin
if length(p)<>4 then
begin
showmessage('Kein Rechteck festgelegt');
exit;
end;
b1:=i1.Picture.Bitmap;
b2:=i2.Picture.Bitmap;
b1.PixelFormat:= pf24Bit;
b2.PixelFormat:= pf24Bit;
A:=makevector(p[0]); D:=makevector(p[3]);
B:=makevector(p[1]); C:=makevector(p[2]);
for i:=0 to i2.Width-1 do
begin
v:=sub(add(B,multiply(sub(C,B),i/i2.Width)),add(A,multiply(sub(D,A),i/i2.Width)));
for j:=0 to i2.Height-1 do
begin
x:=add(add(A,multiply(sub(D,A),i/i2.Width)),multiply(v,j/i2.Height));
//i2.Canvas.Pixels[i,j]:=i1.canvas.Pixels[round(x.X),round(x.Y)];
setzen(point(i,j),point(round(x.x),round(x.y)),b1,b2); //Das hier soll das eine Zeile darüber bewirken
end;
end;
i2.Refresh;
i2.Repaint;
end;
Und es funktioniert soweit alles wenn ich die gerade wegkommentierte Zeile benutze, also nicht mit der Prozedur "setze" arbeite.
"Setze" soll bewirken, dass der Punkt n2 auf Bitmap b2 die gleiche Farbe erhält wie der Punkt n1 auf dem Bitmap b1, ich bekommen aber eine "Bereichsüberschreitung bei Zeilenindex" - weiß aber nicht wo ich diese zu suchen habe.
Wo liegt der Fehler? Ist die "setze" Prozedur überhaupt in den Anfängen schonmal richtig?
mfg, mr.winkle
„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“
Projekte: Gasteilchen 3D / Einparken mit Anhänger / 4Gewinnt 3D mit KI / Aspirin
|