AGB  ·  Datenschutz  ·  Impressum  







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

Programmfehler: "Grafikalgorithmus"

Ein Thema von VkPenguin · begonnen am 11. Jul 2012 · letzter Beitrag vom 12. Jul 2012
Antwort Antwort
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#1

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 10:47
Ah, verlesen, Entschuldigung! Ich kenne die Optionen zwar nicht, du Du vorgeschlagen hast, aber ich erhalte immernoch dieselbe Fehlermeldung an derselben Stelle. Das Problem ist, dass ich mir das einfach nicht erklären kann und deshalb auch nicht weiß, wie ich weiter vorgehen soll
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 12:04
Ah, verlesen, Entschuldigung! Ich kenne die Optionen zwar nicht, du Du vorgeschlagen hast, aber ich erhalte immernoch dieselbe Fehlermeldung an derselben Stelle. Das Problem ist, dass ich mir das einfach nicht erklären kann und deshalb auch nicht weiß, wie ich weiter vorgehen soll
Ja nun, hast du denn die Optionen eingeschaltet?

Weiteres Vorgehen:
Den gesamten Quellcode posten.
Wir haben hier keine magische Glaskugel!
Entweder direkt oder als (ZIP-)Anhang.
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#3

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 12:59
Klar, die Optionen hatte ich an, konnte aber wie gesagt nichts feststellen. Hier ist mal der Quellcode, ich bin aber leider wie gesagt noch nicht sonderlich gut
Danke für Eure Mühe!
Delphi-Quellcode:
unit Bubbelz;
{V.0.2}
{Einige Stellen sind noch umständlich/ungenau in der Berechnung}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, ExtDlgs, StdCtrls, PNGImage;

type Kreis = record
X:Integer;
Y:Integer;
Radius:Integer;
Farbe:Integer;
end;

type
  TForm1 = class(TForm)
    Hauptbild: TImage;
    PIC_Load: TOpenPictureDialog;
    BT_PIC_Load: TButton;
    BT_Start: TButton;
    BT_Save: TButton;
    procedure FormCreate(Sender: TObject);
    procedure BT_PIC_LoadClick(Sender: TObject);
    procedure HauptbildClick(Sender: TObject);
    procedure AnalysePIC;
    procedure Progress(X:Integer;Y:Integer);
    function KleinstAbstandZuLinie(X:Integer;Y:Integer):Integer;
    function KleinstAbstandZuLinie2(X:Integer;Y:Integer):Integer;
    function AbstandZuPunkt(X1:Integer;Y1:Integer;X2:Integer;Y2:Integer):Integer;
    procedure BT_StartClick(Sender: TObject);
    procedure BT_SaveClick(Sender: TObject);
  private
    { Private-Deklarationen }

   Var PIc_res:Tbitmap;
   VAR PIC_RES2:TJpegImage;
   Var PIC:String ;
   VAR Maxentf:Real;
   Var PIC_Breite,PIC_Höhe,LinePTK,Kreisanzahl,Standartwahrscheinlichkeit,MaxRadius:Integer;
   VAR Line:Array[0..1600,0..1200] of Boolean;
       AbstLine:Array[0..1600,0..1200] of Integer;
       Kreise:Array[1..500000] of Kreis;
       KreisPTK:Array[0..1600,0..1200] of Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BT_PIC_LoadClick(Sender: TObject);
begin
Pic_Load.Execute();
PIC:=Pic_Load.FileName;
Hauptbild.Picture.LoadFromFile(PIC);
PIC_Res2.LoadFromFile(PIC);
PIC_Breite:=PIc_res2.Width;
PIC_Höhe:=PIC_res2.Height;
end;

function TForm1.AbstandZuPunkt(X1:Integer;Y1:Integer;X2:Integer;Y2:Integer):Integer;
Var Dx,Dy:Integer;
begin
Dx:=abs(X1-X2);
Dy:=abs(Y1-Y2);
result:=round(sqrt((Dy*Dy)+(Dx*Dx)));
end;

function TForm1.kleinstAbstandZuLinie(X:Integer;Y:Integer):Integer;
Var Kleinst,I,J,Abstand:Integer;
Begin
{//Zu umständlich//
Kleinst:=10000;
for I  := 0 to PIC_Breite do
Begin
for J  := 0 to PIC_Höhe do
Begin
if Line[I,J] then
Begin
Abstand:=AbstandzuPunkt(X,Y,I,J);
if Abstand<=Kleinst then Kleinst:=Abstand;
End;
End;
End;  }

End;

function TForm1.kleinstAbstandZuLinie2(X:Integer;Y:Integer):Integer;
Var I,J,Abstand,Zähler:Integer;
Begin
Abstand:=0;
if Line[X,Y] then result:=0
else
Begin
while Abstand=0 do
Begin
Zähler:=Zähler+1;
for I:=X-Zähler To X+Zähler Do if Line[I,Y-Zähler] then Abstand:=AbstandzuPunkt(X,Y,I,Y-Zähler);
for I:=X-Zähler To X+Zähler Do if Line[I,Y+Zähler] then Abstand:=AbstandzuPunkt(X,Y,I,Y+Zähler);
for I:=Y-Zähler To Y+Zähler Do if Line[X+Zähler,I] then Abstand:=AbstandzuPunkt(X,Y,X+Zähler,I);
for I:=Y-Zähler To Y+Zähler Do if Line[X-Zähler,I] then Abstand:=AbstandzuPunkt(X,Y,X-Zähler,I);
End;
End;
result:=Abstand;
End;

Procedure TForm1.Progress(X:Integer;Y:Integer);
VAR Abst,Radius:Integer;
P:Real;
begin
P:=(Random(100)+1)*(MaxEntf/(AbstLine[X,Y]*10));
if P<=Standartwahrscheinlichkeit then
Begin
//KREIS
Radius:=(Random(MaxRadius*100) div 100); //Nicht gewichtet
Kreisanzahl:=Kreisanzahl+1;
Kreise[Kreisanzahl].X:=X;
Kreise[Kreisanzahl].Y:=Y;
Kreise[Kreisanzahl].Radius:=Radius;
End;

end;





procedure TForm1.BT_SaveClick(Sender: TObject);
VAR Save:TJpegImage;
begin
Save:=TJpegimage.create;
Save.Assign(Hauptbild.Picture.Bitmap);
Save.SaveToFile('C:\Users\Felix\Desktop\Ergebnis.jpg');
end;

procedure TForm1.BT_StartClick(Sender: TObject);
var x,y,kleinst,m,k,größterAbstand:Integer;
begin
GrößterAbstand:=0;
AnalysePIC; //1.
for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
if Line[X,Y] then AbstLine[X,Y]:=0
else
Begin
AbstLine[X,Y]:=kleinstAbstandzuLinie2(X,Y);
if (AbstLine[X,Y]>GrößterAbstand) then GrößterAbstand:=AbstLine[X,Y];
END;
End;
End;

For m:=1 to GrößterAbstand Do
Begin
for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
if (AbstLine[X,Y]=M) then
Begin
Progress(X,Y);
End;
End;
End;
End;

for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
Hauptbild.Canvas.Pixels[X,Y]:=clWhite;
End;
End;

for X:=1 To Kreisanzahl Do Hauptbild.Canvas.Ellipse(Kreise[X].X,Kreise[X].Y,Kreise[X].X+Kreise[X].Radius,Kreise[X].Y+Kreise[X].Radius);

end;

procedure TForm1.AnalysePIC;
VAR I,J:Integer;
begin
for I := 0 to PIC_Breite do
Begin
for J := 0 to PIC_Höhe do
Begin
Line[I,J]:=False;
End;
End;

PIC_res.Assign(PIc_res2);

for I := 0 to PIC_Breite do
Begin
for J := 0 to PIC_Höhe do
Begin
if Pic_Res.Canvas.Pixels[I,J] = clBlack then
Begin
Line[I,J]:=True;
LinePTK:=LinePTK+1;
End
else Pic_res.Canvas.Pixels[I,J]:=clWhite;
End;
End;
Hauptbild.Picture.Assign(Pic_res);
MaxEntf:=sqrt(PIC_Breite*PIC_Breite+PIC_Höhe*PIC_Höhe);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MaxRadius:=PIC_Breite div 20;
Standartwahrscheinlichkeit:=90; //90%
PIC_Höhe:=1200;
PIC_Breite:=1600;
Form1.Top:=0;
Form1.Left:=0;
form1.width := screen.width;
form1.height := screen.height;
PIc_Res:=Tbitmap.Create;
PIC_res2:=TjpegImage.create;
end;

procedure TForm1.HauptbildClick(Sender: TObject);
begin
Pic_Load.Execute();
PIC:=Pic_Load.FileName;
Hauptbild.Picture.LoadFromFile(PIC);
PIC_Res2.LoadFromFile(PIC);
PIC_Breite:=PIc_res2.Width;
PIC_Höhe:=PIC_res2.Height;

end;

end.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:07
Variable Zähler in function TForm1.kleinstAbstandZuLinie2 ist vor dem 1. Zugriff undefiniert.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#5

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:08
In kleinstAbstandZuLinie2 ist Zähler nicht initialisiert, d.h. da steht irgendeine Zahl drin. Und Du solltest Dir dringend eine nachvollziehbare Einrückung angewöhnen, der Code ist sehr schlecht zu lesen. Übrigens musst Du Objekte, die Du zur Laufzeit erzeugst, auch wieder freigeben (das JPEGImage beim Speichern z.B.).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#6

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:14
Ah, vielen lieben Dank für eure Tipps, das werd ich gleich mal berichtigen. So einen Fehler hatte ich voher schonmal, das finde ich irgendwie sehr gewöhnungsbedürftig.. Das diese Codeeinrückung Sinn macht sehe ich ja ein, gibt es irgendwo festgelegte Regeln, die man nachlesen kann, damit es möglichst einheitlich ist?

*EDIT* Jetzt habe ich diesen Fehler -

Erste Gelegenheit für Exception bei $7580B9BC. Exception-Klasse ERangeError mit Meldung 'Fehler bei Bereichsprüfung'. Prozess Bubbelzmain.exe (5772)

- in der ersten For-Schleife nach Zähler:=Zähler+1; Aber wenn ich mir im Objektinspektor die Werte von den Variablen ansehen will um nachzusehen wo das Problem liegt, sind die Variablen nicht verfügbar. Gibt es da vielleicht einen Trick?

Geändert von VkPenguin (12. Jul 2012 um 13:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#7

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:17
Object Pascal Style Guide, daran sollte man sich im Wesentlichen halten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#8

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:26
Das schau ich mir nachher mal an, danke Dir. Hat denn jemand eine Idee, was ich falsch gemacht hab oder wie ich dem Fehler auf die Spur kommen könnte ?
  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 02:35 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