Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

mimi 2. Nov 2007 19:58


Eine Eigene Linen Zeichnen ?
 
Hallo,
da ich schon länger Zeit für verschiedene Zwecke eine eigene Linen Zeichne möchte, habe ich diese Code heute geschrieben:
Delphi-Quellcode:
procedure DrawLinePluto(aCanvas:TCanvas; const x1,y1,x2,y2:Integer; PenColor:TColor);
var
  wx,wy:Integer;
  fx,fy,mx,my:Integer;
begin
  wx:=abs(x2-x1);
  wy:=abs(y2-y1);
 
  fx:=x1; fy:=y1;

  if wx = 0 then mx:=0 else mx:=+1;
  if wy = 0 then my:=0 else my:=+1;
 
  while True do begin
    aCanvas.Pixels[fx,fy]:=PenColor;
    fx:=fx+mx;
    fy:=fy+my;
    if (my <> 0) and (fy = y2) then break;
    if (mx <> 0) and (fx = x2) then break;
  end;
end;
Ich würde gerne von euch wisse, ob dieser Code alle Situationen Abdeckt und ob es "noch schneller" geht.
Im Internet habe ich leider nur sehr viele Beschreibungen gesehen, die mir zu Kompliziert beschrieben wahren.

Ich möchte später nach einigen Tests, verschiedene Varianten von dieser Procedere erstellen.
Z.b. Welche Die Mehrer Farben da stellen könne, im Moment kann die Line ja nur in einer Farbe da gestellt werden. Mein Ziel ist es mehrer Farben hinzubekommen, und mit Farb Muster und sowas.
das ist aber nicht weiter schwierig.

Was haltet ihr von der Procedere ?

edit:

Delphi-Quellcode:

procedure DrawLinePluto(aCanvas:TCanvas; const x1,y1,x2,y2:Integer; PenColor:TColor);
var
  wx,wy:Integer;
  fx,fy,mx,my:Integer;
begin
  wx:=x2-x1;
  wy:=y2-y1;
  fx:=x1; fy:=y1;

  if wx = 0 then mx:=0 else mx:=+1;
  if wy = 0 then my:=0 else my:=+1;

  while True do begin
    aCanvas.Pixels[fx,fy]:=PenColor;
    if wx > 0 then
      fx:=fx+mx
    else
      fx:=fx-mx;

    if wy > 0 then
      fy:=fy+my
    else
      fy:=fy-my;


    if (my <> 0) and (fy = y2) then break;
    if (mx <> 0) and (fx = x2) then break;
  end;
end;
So diese Procedere kann jetzt auch mit Negativen Werten arbeiten(scheint auf jedenfall so)

Edit2:
Leider kann diese Procedere nur Perfekte Lienen da stellen, was aber nicht immer sinvoll ist. es werden keine "Treppen" Lienen gezeichnet.

EDatabaseError 2. Nov 2007 20:03

Re: Eine Eigene Linen Zeichnen ?
 
Moin,

schau dir mal TCanvas genau an. Dies bringt sowas von Haus aus mit.

IMHO:
Delphi-Referenz durchsuchenMoveTo
Delphi-Referenz durchsuchenLineTo

mimi 2. Nov 2007 20:05

Re: Eine Eigene Linen Zeichnen ?
 
das weiß ich auch, aber dort kann man nicht ohne weiteres eine Line z.b. in mehrer Farben zeichnen ohne das mühevoll mit Polygonen oder anders zu lösen.

ich kenne die TCanvas Klasse sehr gut.

Edit01: Erste Tests haben ergeben, das diese Procedere leider nicht mit negativen Zahlen umgehen kann.
hat einer eine Idee wie ich das am einfachsten einbauen könnte ?

EDatabaseError 2. Nov 2007 20:13

Re: Eine Eigene Linen Zeichnen ?
 
Ich schätz mal das der Code hier

Delphi-Quellcode:
procedure DrawLine(aCanvas: TCanvas ; x1,y1,x2,y2: Integer ; color: TColor);
var
  crntColor: TColor;
begin
 crntColor := aCanvas.Pen.Color;
 aCanvas.Pen.Color := color;
 aCanvas.MoveTo(x1,y1);
 aCanvas.LineTo(x2,y2);
 aCanvas.Pen.Color := crntColor;
end;
das gleiche macht wie deiner... :idea:

wegen den negativen zahlen: Im Form links oben ist (0|0) weiter nach links gehts in dem fall nicht. Du müsstest da dann ein Offset einbauen das bspw. gezeichnet 50 gerechnet 0 ist.

SirThornberry 2. Nov 2007 20:15

Re: Eine Eigene Linen Zeichnen ?
 
Zitat:

Was haltet ihr von der Procedere ?
gar nichts.

folgender Aufruf klappt (verständlicher Weise) nicht:
Delphi-Quellcode:
DrawLinePluto(Self.Canvas, 0, 0, 150, 600, clBlue);
es wird eine Linie gezeichnet im 45 Grad Winkel aber nicht zu dem Punkt den ich angegeben habe. Die Funktion ist so nutzlos, die Logic stimmt einfach nicht.

Dein Quelltext bewirkt das du eintweder in jedem Schritt 1 oder gar kein Pixel nach Rechts und unten gehst. Das bewirkt logischer Weise ein 45 Grad Winkel oder 0 Grad.

mimi 2. Nov 2007 20:18

Re: Eine Eigene Linen Zeichnen ?
 
Ja ! da gebe ich dir Recht.
Aber ich möchte ja später die Möglichkeit haben eine mehrfarbige Line zu gestalten das ist mit MoveTo und LieneTo leider sehr aufwendig. und mit Poligonen möchte ich das erst recht nicht machen.

Außerdem möchte ich selber verstehen wie ein DDA Algorithmus arbeitet .
Es gibt für viele mehrer Möglichkeiten je nach dem was man gerade braucht bzw. machen möchte.
Wie mein Zweck eignet sich MoveTo und LineTo leider nicht. es sei denn man kann irgendwie mit nur einem Procedere Aufruf mehrfarbig zeichnen.

edit:
was schlägst du also vor ?

SirThornberry 2. Nov 2007 20:21

Re: Eine Eigene Linen Zeichnen ?
 
ich schlage eine Verhältnisgleichung vor.
Wenn eine Linie von x1 nach x2 gezeichnet werden soll dann muss x bei der hälfte der Stecke auch auf der y-Achse die hälfte der Stecke zurück gelegt haben.

mimi 2. Nov 2007 20:22

Re: Eine Eigene Linen Zeichnen ?
 
Ja das ist logisch..... und weiter ?

edit: Aber das mache ich doch schon im Prinzip ? beide Variablen werden um den gleichen Faktor erhört.....

SirThornberry 2. Nov 2007 20:30

Re: Eine Eigene Linen Zeichnen ?
 
du erhöhst nicht um einen Factor sondern um 1 oder 0

mimi 2. Nov 2007 20:40

Re: Eine Eigene Linen Zeichnen ?
 
wie meinst du das ?
Wenn es eine Negative Line ist verringere ich den "Faktor" und wenn es eine Positive ist erhöhe ist sie.

Aber was müsste ich jetzt genau ändern damit das klappt ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.
Seite 1 von 3  1 23      

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