AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sierpinski Dreieck mit Lazarus

Ein Thema von ThePhilosopher · begonnen am 22. Nov 2013 · letzter Beitrag vom 23. Nov 2013
Antwort Antwort
ThePhilosopher

Registriert seit: 22. Nov 2013
4 Beiträge
 
#1

Sierpinski Dreieck mit Lazarus

  Alt 22. Nov 2013, 15:31
Hallo liebe Leute,
Ich muss für die Schule, genauer gesagt für meine GFS in Mathe, ein Sierpinski Dreieck programmieren.
Ich habe mir dazu heute ein paar Gedanken gemacht und war eigentlich der Meinung einen guten Lösungsweg gefunden zu haben.
Ich habe euch unten mal den Code komplett auskommentiert und die Fehlerhafte Stelle markiert.
An dieser Stelle gibt Lazarus immer die Fehlermeldung "Got Double, Excpectet LongInt" aus.
Ich versteh die ganze Sache nicht weil die Variable den gleichen Wert enthält wie eine andere in der gleichen Rechnung auch und dort wird kein Fehler ausgegeben.
Kann mir jemand helfen??
Gruß
TP
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    E: Integer; //Anzahl der Dreiecke pro Ebene
    NH: Integer; //Nenner des Bruchs der die Y Koordinate angibt
    ZH: Integer; //Zähler des Bruchs der die Y Koordinate angibt
    NW: Integer; //Nenner des Bruchs der die X Koordinate angibt
    AW: Integer; //gibt die Anzahl der Wiederholungen an
    a: Integer; //Wert für Grundseite des Dreiecks
    h: Integer; //Wert für Höhe des Dreiecks
    Procedure Sierpinski;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject); //Prozedur die aufgerufen wird wenn der Button geklickt wird
begin
  Canvas.Polygon([Point(0, h), Point(a div 2, 0), Point(a, h)]);
  NH := 3; //
  ZH := 1; //
  NW := 4; //
  AW := StrToInt(Edit1.Text); //
  E := 1; //Weißt den Variablen Startwerte zu
  Sierpinski; //Ruft die Prozedur "Sierpinski" auf, in der das gewünschte Sierpinski Dreieck erzeugt wird
end;

procedure TForm1.FormCreate(Sender: TObject); //Prozedur die aufgerufen wird sobald das Fenster entsteht
begin
  a := Image1.Width; //Weißt "a" den Breiten Wert der Fläche "Image1" zu
  h := Image1.Height; //Weißt "h" den Höhen Wert der Fläche "Image1" zu
end;

procedure TForm1.Sierpinski;
var I, II: Integer;

begin
  For I := 1 to AW do //For-Schleife, die dafür sorgt, dass die gewünschte Zahl an Ebenen erzeugt wird
    begin
      For II := 1 to E do
        begin
          Canvas.MoveTo(1/NW*a, (ZH/NH)*h); //
          Canvas.LineTo(2/NW*a, (ZH+1)/NH*h); //
          Canvas.LineTo(3/NW*a, (ZH/NH)*h); //
          Canvas.LineTo(1/NW*a, (ZH/NH)*h); [COLOR="Red"] //In diesem Rechen Block wird immer bemängelt das "h" ein Double wäre, bei "a" das den gleichen Wert enthält jedoch nicht ??? [/COLOR]
        end;
      E := E*3;
      NW := NW*2;
      NH := NH*2;
      ZH := ZH*2+1;
    end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.298 Beiträge
 
Delphi 12 Athens
 
#2

AW: Sierpinski Dreieck mit Lazarus

  Alt 22. Nov 2013, 15:47
h, bzw. das Ergebnis dieser Berechnung ist nunmal eine Fießkommazahl (hier Double), denn du nutzt ja auch "/", bzw. rundest das Ergebnis nicht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Sierpinski Dreieck mit Lazarus

  Alt 22. Nov 2013, 15:50
Der Fehler müsste eigentlich auch schon in den Aufrufen davor kommen, weil eine Division mit "/" in Delphi bzw. FPC immer einen Extended bzw. Double zurück liefert. Das "h" ist also auch nicht das eigentliche Problem, sondern der Teil davor (bzw. der gesamte Ausdruck dann, weil der dann ebenfalls Extended/Double wird, sobald ein Operand dies ist. Auch wenn dieser Operand das Ergebnis einer Zwischenrechnung ist.)

Am Rande: zuweisen, nicht zuweißen. Ich bekomme da immer Augenkrebs, wird oft falsch gemacht. Bla, Kinkerlitzchen, bin da bloß empfindlicher als nötig
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
ThePhilosopher

Registriert seit: 22. Nov 2013
4 Beiträge
 
#4

AW: Sierpinski Dreieck mit Lazarus

  Alt 22. Nov 2013, 16:23
Danke für die Antworten.
Hätte es einen Einfluss auf das Ergebnis wenn ich mit "div" statt mit"/" teilen würde?

Edit: Ich hab's jetzt grad mal mit div probiert. Da gibt er zwar keine Fehlermeldung aus, das Programm tut aber nichts wenn man es ausführt.
Hat jemand ne Idee?

Geändert von ThePhilosopher (22. Nov 2013 um 16:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.298 Beiträge
 
Delphi 12 Athens
 
#5

AW: Sierpinski Dreieck mit Lazarus

  Alt 22. Nov 2013, 17:00
Edit: Ich hab's jetzt grad mal mit div probiert. Da gibt er zwar keine Fehlermeldung aus, das Programm tut aber nichts wenn man es ausführt.
Hat jemand ne Idee?
Es kommt drau an was du genau machen willst.

Wie schon erwähnt, rundet DIC ganzzahlig, was dann Folgendem entspricht.
Zitat:
(ZH div NH) * h = Trunc(ZH / NH) * h
vermutlich:
- Rechnung umstellen (erst mal und dann durch)
- oder anders runden
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ThePhilosopher

Registriert seit: 22. Nov 2013
4 Beiträge
 
#6

AW: Sierpinski Dreieck mit Lazarus

  Alt 22. Nov 2013, 18:11
Das Problem ist, dass ich die genauen Angaben eigentlich brauche weil, dass Dreieck sonst nicht präzise gezeichnet wird.
Gibt es den keine andere Möglichkeit außer Canvas um Linien auszugeben?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.298 Beiträge
 
Delphi 12 Athens
 
#7

AW: Sierpinski Dreieck mit Lazarus

  Alt 22. Nov 2013, 18:21
Wie gesagt
- Rechnung umstellen > erst mal und dann durch (DIV)
- oder anders runden > Delphi-Referenz durchsuchenRound drausen drumrum

LineTo kann eh nur ganzzahlige Positionieren, also muß man sowieso auf ganze Pixel runden, aber das sollte hier eh reichen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:03 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