Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Linien beim zeichnen anzeigen lassen (https://www.delphipraxis.net/184758-linien-beim-zeichnen-anzeigen-lassen.html)

Andy1811 19. Apr 2015 12:07

Linien beim zeichnen anzeigen lassen
 
Hi Leute,
ich bin neu im Forum und generell erst seit einem halben Jahr (durch die Schule) in der Welt des Programmierens tätig.

Wir haben in der letzten Stunde die Aufgabe gehabt uns mit dem zeichnen von Linien auf ner Canvas auseinander zu setzten. Als erste Aufgabe gilt es nun das Haus vom Nikolaus zu implementieren und wer es als Hausaufgabe machen möchte, es so zu implementieren das man das "Programm" beim zeichnen sieht. Wer dies schaffen sollte und dann als erster (mit Angabe der Zeit und Unterschrift eines Lehrers) abgibt, bekommt 15Pkt( 1+ ).:tongue:

Ich habe das HvN schon fertig implementiert, ohne Probleme, doch ich suche Vergebens nach der Antwort sich "das Zeichnen" anzeigen zu lassen.:?

Deswegen wende ich mich nun direkt an euch und möchte wissen, wie man so etwas implementieren kann...ich möchte keinesfalls den Quelltext von euch haben, da wir vermutlich das implementierte noch erklären müssen, sondern ich möchte nur gerne wissen, wie man es implementieren kann :wink::thumb:

mkinzler 19. Apr 2015 12:44

AW: Linien beim zeichnen anzeigen lassen
 
Am Einfachsten in den dv nach jedem Strich eine kleine Verzögerung einbaust

Sir Rufo 19. Apr 2015 13:46

AW: Linien beim zeichnen anzeigen lassen
 
Zitat:

Zitat von mkinzler (Beitrag 1298398)
Am Einfachsten in den dv nach jedem Strich eine kleine Verzögerung einbaust

Was dann zwar Spaghetticode gibt, aber es ist am Einfachsten umzusetzen.

Richtiger, aber etwas aufwändiger, wäre die Umsetzung mit einem Timer und einer Liste von Zeichen-Routinen. Pro Zyklus wird dann jeweils eine Routine ausgeführt (bzw. immer eine mehr). Das kann man dann langsam, schnell oder sogar manuell schalten (Timer aus und nur bei einem Klick auf einen Button, oder warauf auch immer).

Popov 19. Apr 2015 13:48

AW: Linien beim zeichnen anzeigen lassen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s: String;

  function GPI(p: String; n: Byte): Integer;
  var
   k: Integer;
  begin
    for k := 2 to n do
      if Pos(',', p) > 0 then
        Delete(p, 1, Pos(',', p) + 1)
      else
        Delete(p, 1, Maxint);
    if Pos(',', p) > 0 then
      Delete(p, Pos(',', p), Maxint);
    Result := StrToIntDef(p, 0);
  end;

begin
  with TStringList.Create, Canvas do
  try
    Add('0, 141, 415, 133, 286');
    Add('0, 133, 286, 265, 288');
    Add('0, 265, 288, 143, 410');
    Add('0, 143, 410, 270, 420');
    Add('0, 270, 420, 261, 291');
    Add('0, 261, 291, 207, 194');
    Add('0, 207, 194, 138, 281');
    Add('0, 138, 281, 268, 419');
    Add('0, 228, 228, 230, 190');
    Add('0, 230, 190, 253, 191');
    Add('0, 253, 191, 246, 252');
    Add('1, 237, 165, 264, 142');
    Add('1, 243, 119, 279, 95');
    Add('1, 246, 66, 296, 37');

    Canvas.Pen.Width := 10;

    for i := 0 to Count - 1 do
    begin
      s := Strings[i];
      case GPI(s, 1) of
        0: begin
             MoveTo(GPI(s,2), GPI(s,3));
             LineTo(GPI(s, 4), GPI(s, 5))
           end;
        1: Ellipse(GPI(s,2), GPI(s,3), GPI(s, 4), GPI(s, 5));
      end;
      Sleep(500);
    end;
  finally Free end;
end;

Andy1811 19. Apr 2015 14:03

AW: Linien beim zeichnen anzeigen lassen
 
Ja, das geht, dann erscheinen halt die Striche alle kurz nacheinander.
Nur ich habe die Aufgabe so interpretiert, das man es sehen soll, wie Striche von Pixel/Punkt zu Pixel/Punkt entstehen :cry:

BadenPower 19. Apr 2015 14:14

AW: Linien beim zeichnen anzeigen lassen
 
Zitat:

Zitat von Andy1811 (Beitrag 1298408)
Ja, das geht, dann erscheinen halt die Striche alle kurz nacheinander.
Nur ich habe die Aufgabe so interpretiert, das man es sehen soll, wie Striche von Pixel/Punkt zu Pixel/Punkt entstehen :cry:

So habe ich die Aufgabe auch verstanden und nur so wäre sie nach meiner Meinung nach auch 15 Punkte wert.

Du musst jeden Bildpunkt einzeln berechnen, was bei den Waagrechten und senkrechten wohl keine allzugroße Herausforderung ist. Bei den Diagonalen und dem Dach musst Du beim Berechnen der Bildpunkte halt den Winkel berücksichtigen.

EarlyBird 19. Apr 2015 14:36

AW: Linien beim zeichnen anzeigen lassen
 
nur als Anregung,
zeichne die Linien einfach in einer Schleife immer einen Punkt länger
Delphi-Quellcode:
Self.Canvas.MoveTo(50,150);
for i := 0 to 200 do
  begin
    Self.Canvas.LineTo(50 + I, 150);
    Sleep(5);
  end;
I:= 0;
Self.Canvas.MoveTo(250,150);
for i := 0 to 200 do
  begin
    Self.Canvas.LineTo(250, 150 + I);
    Sleep(5);
  end;

Andy1811 19. Apr 2015 14:59

AW: Linien beim zeichnen anzeigen lassen
 
Ja, das ist schonmal sehr gut. Ich bin schon drann, und würde nachher mal den Code posten, falls er nicht doch zulang werden sollte :-D Erstmal sollte es funktionieren :thumb:

milos 19. Apr 2015 23:48

AW: Linien beim zeichnen anzeigen lassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habs auch mal gebastelt aus interesse, wollte aber keinen Code geben damit du auch was lernst :D
Da du aber schon was erhalten hast, hier meine Lösung.
Funktioniert mit Timern ohne diese Sleep geschichte ^^
Ausserdam können alle Formen gezeichnet werden man muss nur das Array anpassen

Delphi-Quellcode:
  Haus := [Point(0,150),
           Point(100,150),
           Point(100,50),
           Point(0,50),
           Point(50,0),
           Point(100,50),
           Point(0,150),
           Point(0,50),
           Point(100,150)];
Ich will den Code hier nicht posten, da du es eigentlich selber machen solltest. Die Projekt-Dateien inkl. Exe ist aber trotzdem angehängt, falls du es dir trotzdem genauer ansehen willst.
Werde Heute (Montag Morgen) noch was dazu sagen wie das ganze aufgebaut ist bin momentan zu müde - was dummes ist auch noch drinnen ist aber nicht tragisch :D
Video vom Zeichnen: https://www.youtube.com/watch?v=pXO80_cRgSw

Freundliche Grüsse

hathor 20. Apr 2015 12:12

AW: Linien beim zeichnen anzeigen lassen
 
Die Lehrer werden immer einfallsloser...
Die Schüler bleiben immer so faul, wie sie immer waren.
Die Suchfunktion wird weiter ignoriert...
http://www.mathematische-basteleien.de/haus02.gif
http://www.mathematische-basteleien.de/nikolaushaus.htm

milos 20. Apr 2015 12:34

AW: Linien beim zeichnen anzeigen lassen
 
Zitat:

Zitat von hathor (Beitrag 1298500)
Die Lehrer werden immer einfallsloser...

Wieso denn das?
Das Ziel ist sehr wahrscheinlich nicht, dass sie mal eine "Animation" programmieren können der das Haus des Nikolaus zeichnet sondern eher zu überlegen wie man so etwas am besten Lösen könnte. Hier gibt es wieder unbegrenzt viele Lösungen (z.B. die Sleep-Lösung von EarlyBird oder meine Timer Lösung die sich beide komplett verschieden verhalten), wo die eine etwas besser und die andere etwas schlechter ist. Das Resultat ist dabei auch immer verschieden. An einem einfachen Code kann man eigentlich auch gut sehen wie eine Person ein Problem löst und wie weit seine Kenntnisse in der Thematik liegen.

Welche Aufgabe würdest du denn vergeben? ;)

Freundliche Grüsse

himitsu 20. Apr 2015 12:52

AW: Linien beim zeichnen anzeigen lassen
 
Zitat:

Zitat von milos (Beitrag 1298510)
Welche Aufgabe würdest du denn vergeben? ;)

Berechnet die dreimillionste Nachkommastelle von PI und beweißt rechnerisch, daß ob PI eine physikalisch begrenze Länge hat.

milos 20. Apr 2015 12:54

AW: Linien beim zeichnen anzeigen lassen
 
Zitat:

Zitat von himitsu (Beitrag 1298516)
Zitat:

Zitat von milos (Beitrag 1298510)
Welche Aufgabe würdest du denn vergeben? ;)

Berechnet die dreimillionste Nachkommastelle von PI und beweißt rechnerisch, daß ob PI eine physikalisch begrenze Länge hat.

Ach komm, das wär zu einfach :stupid:

hathor 20. Apr 2015 15:18

AW: Linien beim zeichnen anzeigen lassen
 
SLEEP-Funktionen innerhalb von Graphik-Funktionen zeigen unerwartete Ergebnisse.

Delphi-Quellcode:
procedure Delay(msecs:integer);
var
  FirstTickCount:longint;
begin
  FirstTickCount:=GetTickCount;
  repeat
    Application.ProcessMessages;
  until ((GetTickCount-FirstTickCount) >= Longint(msecs));
end;

procedure TForm1.Button6Click(Sender: TObject);
var D : integer;
begin
D:=1000;
  with Canvas do
    begin
    Pen.Width:=5;
    Pen.Color := clLime;
     MoveTo(100,200);
     LineTo(100,100); Delay(D);
     LineTo(200,100); Delay(D);
     LineTo(150,50);  Delay(D);
     LineTo(100,100); Delay(D);
     LineTo(200,200); Delay(D);
     LineTo(100,200); Delay(D);
     LineTo(200,100); Delay(D);
     LineTo(200,200);
    end;
end;

procedure TForm1.Button8Click(Sender: TObject);
var D : integer;
begin
D:=1000;
  with Canvas do
    begin
    Pen.Width:=5;
    Pen.Color := clRed;
     MoveTo(100,200);
     LineTo(100,100); SLEEP(D);
     LineTo(200,100); SLEEP(D);
     LineTo(150,50);  SLEEP(D);
     LineTo(100,100); SLEEP(D);
     LineTo(200,200); SLEEP(D);
     LineTo(100,200); SLEEP(D);
     LineTo(200,100); SLEEP(D);
     LineTo(200,200);
    end;
end;

himitsu 20. Apr 2015 15:26

AW: Linien beim zeichnen anzeigen lassen
 
Zeichnen auf ein ungecachtes Canvas ist ebenfalls ein schöner Fauxpas.

Andy1811 24. Apr 2015 10:31

AW: Linien beim zeichnen anzeigen lassen
 
Hallo nochmal,

ich würde meinen Quelltext gerne posten doch in hab kein Plan wie, kann das mal bitte kurz jemand beschreiben wie man des macht ?

Danke :)

milos 24. Apr 2015 10:48

AW: Linien beim zeichnen anzeigen lassen
 
Setzt den Delphi Code einfach zwischen [DELPHI]-Tags

Also so:
Code:
[DELPHI]
begin

end;
[/DELPHI]
Delphi-Quellcode:
begin

end;

BadenPower 24. Apr 2015 10:55

AW: Linien beim zeichnen anzeigen lassen
 
Oder das ganze Projekt in eine Zip-Datei packen und als Dateianhang einfügen.

himitsu 24. Apr 2015 11:14

AW: Linien beim zeichnen anzeigen lassen
 
Du möchtest hier, in diesem Thread, einen Delphi-Code posten?

@BadenPower: Im notfalls könnte man auch nur die nötige PAS anhängen.

@milos: Für sowas fand ich den anderen geheimen BBCode auch immer ganz nett. [DELPHI]hier dein Delphi-Code[/DELPHI]
Aber das mit [DELPHI] oder [CODE] bekommt man doch ganz leicht mit, wenn man oben mal die Editor-Buttons ausprobiert, oder da gaaanz unten, in den "Forumregeln", sich die BBCode-Hilfe anschaut, aber wer liest schon die Hilfe? :stupid:

Andy1811 24. Apr 2015 11:35

AW: Linien beim zeichnen anzeigen lassen
 
Jaa, das ist es...Danke! :)

Also hier meinen Code zum Haus vom Nikolaus.
Ist vieleicht ein wenig primitiv, aber die 15-MSS-Punkte hats gelangt. :thumb::-D

Code:
[DELPHI]
begin
procedure TForm1.Button2Click(Sender: TObject);
var
  a, b, c, i: integer;
begin
  a := StrToInt(Edit1.Text);
  b := StrToInt(Edit2.Text);
  c := StrToint(Edit3.Text);

  if (c>1) and (c mod 2 = 0) then
  begin

  canvas.Pen.Color  := clBlack;
  canvas.Brush.Color := clWhite;
  canvas.Pen.Style  := psSolid;
  canvas.Pen.Width  := 5;

  canvas.clear;
  canvas.clear;

    canvas.MoveTo(a, b);
    for i := 0 to c do
      begin
        canvas.LineTo(a+i, b);
        sleep(5);
      end;
    a := a+i;
    for i := 0 to c do
      begin
        canvas.LineTo(a-i, b-i);
        sleep(5);
      end;
    a := a-i;
    b := b-i;
    for i := 0 to c do
      begin
        canvas.LineTo(a+i, b);
        sleep(5);
      end;
    a := a+i;
    for i := 0 to (c div 2) do
      begin
        canvas.LineTo(a-i, b-i);
        sleep(5);
      end;
    a := a-i;
    b := b-i;
    for i := 0 to (c div 2) do
      begin
        canvas.LineTo(a-i, b+i);
        sleep(5);
      end;
    a := a-i;
    b := b+i;
    for i := 0 to c do
      begin
        canvas.LineTo(a, b+i);
        sleep(5);
      end;
    b := b+i;
    for i := 0 to c do
      begin
        canvas.LineTo(a+i, b-i);
        sleep(5);
      end;
    a := a+i;
    for i := 0 to c do
      begin
        canvas.LineTo(a, b);
        sleep(5);
      end;
  end;
end;              
end;
[/DELPHI]
@hathor Also über Leute wie dich kann ich nur lachen. Schön über Lehrer meckern und selber zu faul um erstmal die Problematik zu lesen. Die Aufgabe war es mit dem Zeichen auf einer canvas auseinander zu setzten und dann das Haus des Nikolaus zu implementieren. Als Zusatz Aufgabe war es dann nun es so zu programmieren, das man sieht, wie die Linien sich bewegen.

Außerdem sind wir mittlerweile an einen deutlich schwereren Aufgabe dran. (Also aus der Sicht von jemanden, der erst seit nem halben Jahr Info hat und sich sonst sich nicht arg so viel sich mit dem Thema auseinander setzt, aber dennoch Interesse zeigt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr.

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