AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [erledigt] Scanline - was ist falsch?
Thema durchsuchen
Ansicht
Themen-Optionen

[erledigt] Scanline - was ist falsch?

Ein Thema von mr.winkle · begonnen am 24. Apr 2008 · letzter Beitrag vom 25. Apr 2008
 
mr.winkle

Registriert seit: 25. Mai 2006
98 Beiträge
 
Delphi 7 Personal
 
#1

[erledigt] Scanline - was ist falsch?

  Alt 24. Apr 2008, 17: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
  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 10:55 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