Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Eine Eigene Linen Zeichnen ? (https://www.delphipraxis.net/102709-eine-eigene-linen-zeichnen.html)

SirThornberry 2. Nov 2007 20:53

Re: Eine Eigene Linen Zeichnen ?
 
probier mal folgende Funktion:
Delphi-Quellcode:
procedure DrawLine(ACanvas: TCanvas; x1, y1, x2, y2: Integer; AColor: TColor);
var
  lCount,
  lDistanceX,
  lDistanceY,
  lStepSize  : Integer;
begin
  lDistanceX := x2 - x1;
  lDistanceY := y2 - y1;
  if Abs(x2 - x1) < Abs(y2 - y1) then
  begin
    lCount := 0;
    if (lDistanceY > 0) then
      lStepSize := +1
    else
      lStepSize := -1;

    while (lCount <> lDistanceY) do
    begin
      ACanvas.Pixels[x1 + Trunc(lCount * lDistanceX / lDistanceY), y1 + lCount] := AColor;
      lCount := lCount + lStepSize;
    end;
  end
  else
  begin
    lCount := 0;
    if (lDistanceX > 0) then
      lStepSize := +1
    else
      lStepSize := -1;

    while (lCount <> lDistanceX) do
    begin
      ACanvas.Pixels[x1 + lCount, y1 + Trunc(lCount * lDistanceY / lDistanceX)] := AColor;
      lCount := lCount + lStepSize;
    end;
  end;
  ACanvas.Pixels[x2, y2] := AColor;
end;
Wie bereits erwähnt geht es hier um ein Verhältnis damit die Linie nicht 45 Grad wird und nicht wie du es machst entweder +1 oder 0. Sondern der X Punkt muss sich zum Y Punkt in dem Verhältnis ändern wie das Verhältnis der Länge der Linien ist.

mimi 2. Nov 2007 21:08

Re: Eine Eigene Linen Zeichnen ?
 
BESTEN DANK ! Ich werde ihn mir mal genau ansehen.

SirThornberry 2. Nov 2007 21:10

Re: Eine Eigene Linen Zeichnen ?
 
wie gesagt. Es geht darum im Verhältnis etwas zu berechnen.
Wenn du zum Beispiel eine Linie von x: 0 - y: 0 nach x: 10 - y: 40 zeichnen willst, musst du bei jedem Schritt auf der X-Achse 4 Schritte auf der Y-Achse gehen. Du musst also das Verhältnis der X-Distance zur Y-Distance gleich setzen mit dem SchrittX zu SchrittY. Nennt sich glaub ich auch Dreiecksgleichung.
Wenn du später mal eine Linie mit Farbverlauf zeichnen willst musst du die Farbanzteile zur Länge der Linie ebenso ins Verhältnis setzen.

Muetze1 2. Nov 2007 22:11

Re: Eine Eigene Linen Zeichnen ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal die alte Demo von mir mit den Marching Ants. Da ist noch eine andere Möglichkeit aufgezeigt.

/EDIT: Aber basiert auf einem WinAPI Befehl!

mimi 3. Nov 2007 12:33

Re: Eine Eigene Linen Zeichnen ?
 
Danke Muetze1 werde ich mir gleich mal ansehen.

Ich finde dieses Thema im Moment recht Intressant, weil ich mich in den letzten 10 Jahren wo ich mit Object Pascal arbeite damit mich noch nie befast habe.

Später geht es mir auch noch um andere Figuren wie z.b. Kreise, Vierecke, Abgerundete Ecken....
Aber erstmal die Line mein Ziel ist es in erster Line SirThornberry Procedure so zu erweitern, das ich Linen Style verwenden kann(eigene) und natürlich Farb Style die man mit den Linen Style Verbinden kann.

Wie das geht weiß ich schon. Kennt jemand von euch ein Tutorial was das gut beschreibt ? also mit einfachen Wörtern die jeder "normale" Mensch versteht ?

Weil auf den meisten seiten die ich zum Thema gefunden habe, wird leider alles über Formulen erklärt, aber ich habe keine Idee, wie man diese Formueln verstehen soll....

Wie gesagt, ich möchte dieses Thema verstehen.....

mimi 3. Nov 2007 13:37

Re: Eine Eigene Linen Zeichnen ?
 
ich habe in deiner Pas Datei gesehen, das du
LineDDA benutz, was mir nicht viel Weiter hilf. Ich wollte ja eine eigene Funktion, Ich meine diese Procedure gibt es auch für Lazarus.

Trotzdem Danke !

mimi 3. Nov 2007 17:32

Re: Eine Eigene Linen Zeichnen ?
 
ich habe jetzt die Procedure erweitert von:SirThornberry Vielen Dank noch mal für dein Code.

Delphi-Quellcode:
procedure DrawLine(ACanvas: TCanvas; x1, y1, x2, y2: Integer; AColor: TColor; style:array of Boolean; FarbStyle:array of TColor);
  procedure StyleFarbeLine(var zc,zw,z,lenStyle, lenColor,W:Integer);
  begin
      if (lenStyle > -1) and (lenColor > 0) then begin
        if zc +1 <= lenColor then
          inc(zc)
        else
          zc:=0;
      end; // lenColor

      if lenStyle > -1 then begin
        if z +1 <= Length(style) then
          inc(z)
        else
          z:=0;
       end; // lenStyle

      if (lenStyle = -1) and (lenColor > 0) then begin
        if zw+1 >= w then begin
          zw:=0;
          if zc+1 <=lenColor then inc(zc);
        end
        else
          inc(zw);
      end;

  end;

var
  lCount,lDistanceX,lDistanceY,lStepSize: Integer;
  z,zc,lenColor,lenStyle,w,zw:Integer;
  lc:TColor;
begin
  lDistanceX := x2 - x1;
  lDistanceY := y2 - y1;
  z:=0; zc:=0; zw:=0;
  lenColor:=Length(FarbStyle);
  lenStyle:=Length(style)-1;

  if lenColor = -1 then lc:=AColor;

  if Abs(x2 - x1) < Abs(y2 - y1) then begin
    lCount := 0;
    if (lDistanceY > 0) then
      lStepSize := +1
    else
      lStepSize := -1;

    w:=abs(lDistanceY div lenColor);
    while (lCount <> lDistanceY) do begin
      if lenColor > 0 then lc:=FarbStyle[zc];
      if (lenStyle = -1) or (lenStyle >= 0) and (style[z]) then
        ACanvas.Pixels[x1 + Trunc(lCount * lDistanceX / lDistanceY), y1 + lCount] := lc;
      StyleFarbeLine(zc,zw,z,lenStyle,lenColor,w);
      lCount := lCount + lStepSize;
    end;
  end
  else begin
    lCount := 0;
    if (lDistanceX > 0) then
      lStepSize := +1
    else
      lStepSize := -1;

    w:=abs(lDistanceX div lenColor);
    while (lCount <> lDistanceX) do begin
      if lenColor > 0 then lc:=FarbStyle[zc];

      if (lenStyle = -1) or (lenStyle >= 0) and (style[z]) then
        ACanvas.Pixels[x1 + lCount, y1 + Trunc(lCount * lDistanceY / lDistanceX)] := lc;
      StyleFarbeLine(zc,zw,z,lenStyle,lenColor,w);
      lCount := lCount + lStepSize;
    end;
  end;
  ACanvas.Pixels[x2, y2] := AColor;
end;  

// Beispiel Aufruf:
DrawLine(PaintBox1.Canvas,mx,my,x,y,clRed,[],[clred,clBlue,clYellow]);
Nun Kann sie mit Farb Stylen und Linen Stylen umgehen*freu*

Edit00: Proceure geändert.

Edit01: Neue Version von der Proceure: Jetzt dürfte alles klappen. Ich hatte im Obigen teil ein abs vergessen bei der w Zuweisung.

Muetze1 3. Nov 2007 18:11

Re: Eine Eigene Linen Zeichnen ?
 
Zitat:

Zitat von mimi
..., was mir nicht viel Weiter hilf. Ich wollte ja eine eigene Funktion, Ich meine diese Procedure gibt es auch für Lazarus.

LineDDA ist eine GDI Funktion und könnte höchstens nachgebildet werden unter Lazarus. Aber unter Linux? Naja, kA.

Und warum sollte dir die Funktion (neben dem eben erwähnten) denn nicht helfen? Die Funktion implementiert den Linien-zeichnen Algorithmus und berechnet jeden einzelnen Punkt, welcher zu Zeichnen ist und ruft zum zeichnen jeweils die angegebene Funktion auf. Somit kannst du doch deinen Style/Farbe etc frei anpassen. Du wirst für jeden einzelnen Punkt aufgerufen. Von daher kapier ich deinen Einwand nicht oder du hast die Funktion nicht im Detail verstanden.

mimi 3. Nov 2007 18:35

Re: Eine Eigene Linen Zeichnen ?
 
ehrlich gesagt, habe ich mir die Funktion lineDDA gar nicht angesehen....
ich habe nur die Parameter gesehen und das reichte mir schon.

Du meinst damit ist sowas schon möglich ? von Windows aus ? Bunte Linen ?

SirThornberry 3. Nov 2007 18:37

Re: Eine Eigene Linen Zeichnen ?
 
so wie ich muetze verstanden habe gibt man eine callbackmethode an welche dann für das zeichnen jedes pixels aufgerufen wird


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz