nach etlichen selbstversuchen mich in die materie einzuarbeiten bin ich bei sowas hier gelandet.
vielleicht mag es ja jemand noch weiter verfeinern.
ist total unoptimiert und bestimmt fehlerbehaftet bis zum anschlag
cpu wird böse ausgelastet.
Delphi-Quellcode:
procedure StarWarsTrapez;
var
xc,yc:Integer;
orgCoord:TPoint;
newTopEdge:Integer;
startX,stopX:Real;
mLeftSide:Real;
screenZ,screenTopY:Integer;
textY:Integer;
mg1,mg2:Real;
p1,r1,r2:TPoint;
param:Real;
begin
textY:=-30;
mg1:=textY/(orgImg.Width/2+OrgImg.Height);
mg2:=textY/(orgImg.Width/2);
screenZ:=Round(newImg.Height/(mg1-mg2));
screenTopY:=Round(mg1*screenZ);
newTopEdge:=Round(newImg.Width*orgImg.Width/(orgImg.width/2+orgImg.Height)/2);
mLeftSide:=(newTopEdge-newImg.Width)/2/newImg.Height;
startX:=(newImg.Width-newTopEdge)/2;
stopX:=newImg.Width-startX;
p1.x:=orgImg.width div 2;
p1.y:=textY;
r1.x:=OrgImg.Height;
r1.y:=0;
r2.x:=screenZ;
for yc:=1 to newimg.height do begin
startX:=startX+mLeftSide;
stopX:=stopX-mLeftSide;
r2.y:=screenTopY-yc;
param:=(p1.y*r2.x-p1.x*r2.y)/(r1.x*r2.y-r1.y*r2.x);
OrgCoord.Y:=OrgImg.Height-Round(OrgImg.Height*param);
for xc:=Round(startX) to Round(stopX) do begin
orgCoord.x:=Round((xc-startX)/(stopx-startx)*orgImg.width);
newImg.canvas.pixels[xc,yc]:=orgImg.canvas.pixels[orgCoord.x,orgCoord.y];
end;
end;
end;
momentan wird bildA zu bildB mit einem trapez effekt umgewandelt.
wie ich das mit laufschrift hinbekommen soll weiß ich noch nicht, aber ich geb nicht auf
Grüße