AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [Projekt] CoverFlow mit Gr32
Thema durchsuchen
Ansicht
Themen-Optionen

[Projekt] CoverFlow mit Gr32

Ein Thema von alleinherrscher · begonnen am 21. Jun 2008 · letzter Beitrag vom 10. Jul 2008
 
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#9

Re: [Projekt] CoverFlow mit Gr32

  Alt 29. Jun 2008, 13:46
Danke, das freut mich sehr... übrigens, wenn du 90 Grad als Winkel eingibst, stehen die Cover ja praktisch genau senkrecht zur Betrachterebene, d.h. du kannst einfach folgende PaintCover Procedure verwenden, dann gibts keine Division durch null mehr:

Delphi-Quellcode:
procedure PaintCover(DestBitmap:TBitmap32; x,y,width,height:integer; perspectiv:single;angle:integer; Abdunklung:integer;Alpha:integer; picture:TBitmap32);
var lo,lu,ro,ru:TPoint;
    mo,mu:extended;
    i,j:integer;
    dummy:integer;
    color:tcolor32;
    reflextionlength:integer;
    Points:TArrayOfFixedPoint;
    poly:tPolygon32;
begin


//vier Eckpunkte des Covers berechnen:

lo.x:=x;
lo.Y:=y;
lu.X:=x;
lu.Y:=y+height;
ru.x:=round(lu.x+width*cos(abs(angle)/360*2*Pi));
ru.y:=round(lu.y-perspectiv*height/2*sin(abs(angle)/360*2*Pi));
ro.X:=ru.x;
ro.Y:=round(ru.y-height+perspectiv*height*sin(abs(angle)/360*2*Pi));

if angle<0 then
begin
  dummy:=ro.y;
  ro.y:=lo.y;
  lo.y:=dummy;
  dummy:=ru.y;
  ru.y:=lu.y;
  lu.y:=dummy;
  dummy:=(width-(ro.x-lo.x));
  lo.x:=lo.x+dummy;
  lu.x:=lu.X+dummy;
  ro.x:=ro.X+dummy;
  ru.x:=ru.x+dummy;
end;

//Steigung der oberen und unteren Kante berechnen:


if ((ro.x-lo.X)=0) or ((ru.x-lu.x)=0) then exit; //Cover stehen senkrecht zum Betrachter

  mo:=-(ro.Y-lo.Y)/(ro.x-lo.X);
  mu:=-(ru.Y-lu.Y)/(ru.x-lu.x);


//Bild perspektivisch zeichnen:
DestBitmap.BeginUpdate;

for i:=0 to (ro.X-lo.x) do
 for j:=round(-i*mo) to round((lu.Y-lo.y)+i*mo) do
   begin
     if not (lo.x+i>DestBitmap.Width-1) and not (lo.y+j>DestBitmap.Height-1) then
       if not (lo.x+i<0) and not (lo.y+j<0) then
         begin
          color:=picture.Pixels[round(picture.Width/(ro.x-lo.X)*i), round(picture.Height/((lu.Y-lo.y)+2*i*mo)*(j+i*mo))];
          TColor32Entry(color).A := alpha;
          DestBitmap.SetPixelT(lo.X+i,lo.Y+j,color);
         end;
   end;
  
 //Reflextion berechnen:

for i:=0 to (ro.X-lo.x) do
 begin
  ReflextionLength:=round(((lu.y-lo.y)+(mo*i)));
  if ReflextionLength>0 then
     for j:= 0 to ReflextionLength do
       begin
        if not (lo.x+i>DestBitmap.Width-1) and not (lu.Y+round(mo*i)+j>DestBitmap.Height-1) then
         if not (lo.x+i<0) and not (lu.Y+round(mo*i)+j<0) then
           begin
             color:=DestBitmap.Pixel[lo.X+i,lu.Y+round(mo*i)-j];
             color:=GR32_Blend.Lighten(color,round(-Abdunklung)); //Reflextion ist verdunkeltes und gespiegeltes Original
             //TColor32Entry(color).A := round(alpha*(1-1/ReflextionLength*j)); //Transparente Reflextionen mit AlphaBlending
             DestBitmap.SetPixelT(lo.X+i,lu.Y+round(mo*i)+j,color);
           end;
       end;
 end;



//Rechteck zeichnen:

  poly:=TPolygon32.create;
  poly.Add(fixedpoint(lo.x,lo.Y));
  poly.Add(fixedpoint(lu.x,lu.y));
  poly.Add(fixedpoint(ru.x,ru.y));
  poly.Add(fixedpoint(ro.x,ro.y));
  poly.AntialiasMode:=am32times; //32faches Antialiasing bremst die Darstellung und kann auch deaktiviert werden
  poly.Antialiased:=true;
  poly.Closed:=true;
  poly.DrawEdge(DestBitmap,Color32(20,20,20,255));

  freeandnil(poly);



DestBitmap.EndUpdate;

end;
Wenn jemand lust hat, ein bisschen weiter dran zu schreiben, fänd ich das sehr cool!

Grüße und schönes Fussball WE,

Euer Alleinherrscher

[edit=Matze]Leerzeichen eingefügt, da ein horizontaler Scrollbalken erzeugt wurde. MfG, Matze[/edit]
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz