| Autor |
Beitrag |
c0raX
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 18.11.08 19:03
sooo... Ahllo erstmal ich bin komplett neu hier und möchte auch gleich mal mit ner Frage beginnen
Ich hab mir das Ziel gesetzt in meinem Projekt eine zufällige, sich an mehreren Stellen knickenden Linie ziehen zu lassen.. das ist mir soweit ganz gut gelungen.. jetzt ist mein einfaches Problem einen der dadurch entstandenen Bereiche einzufärben.. könnt ihr mir da weiterhelfen? hoffe auf eine schnelle antwort.. danke im voraus !
Hier der code
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure TForm1.FormCreate(Sender: TObject); begin Randomize; LWillkommen.Hide; end;
procedure TForm1.ZeichneDreieck(Sender: TObject);
var dx:Integer; y:Integer; i : Integer; count : integer;
begin count:=+1; dx := ClientWidth div 8; y := ClientHeight div 2 + ClientHeight div 4; Canvas.MoveTo(0,y);
for i:=1 to 8 do begin y := Random(ClientHeight div 2 + ClientHeight div 4); Canvas.LineTo(i*dx,y); if count = 1 then BGebirge.Enabled := false ; LWillkommen.Show; |
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Di 18.11.08 19:20
Wenn ich dich richtig verstanden habe sollte dir FLOODFILL weiterhelfen können
AXMD
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 18.11.08 19:35
Titel: Stimmt
Stimmt schon.. nur sagt mir die delphi hilfe das ich auch für floodfill koordinaten brauche... da es aber eine zufällige linie ist die ich ziehe kann ich ja keine genauen angaben machen ... ich weiß nich wie ich ihm sage das er den einen zufälligen bereich einfärben soll
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Di 18.11.08 19:42
Du kannst dir ja die gezeichneten Koordinaten merken, z.B. in einem Array
AXMD
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 18.11.08 19:46
Titel: ?
ich hätte vielleicht sagen sollen das ich noch nicht unbedingt der fortgeschrittenste bin was delphi betrifft..
zu deutsch:
wie meinst du das? erklärung? ^^
aber finds gut das einem hier versucht wird zu helfen =)
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Di 18.11.08 19:53
Dafür ist das Forum ja da
Schau dir mal Christians Crashkurs an - der sollte dir einige benötigte Grundlagen vermitteln.
AXMD
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 18.11.08 19:57
Titel: alles klar
alles klar !
dann werd ich mal schauen ob ich das benötigte finde =)
wenn ich weitere fragen hab meld ich mich .. also vorerst danke =)
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 19.11.08 17:14
gut...angeschaut hab ich mir das nu...was ein array ist ist mir auch bewusst.. mehr oder weniger.. nur weiß ich nicht wie mir das weiterhelfen soll... bzw wie ich das array dann mit floodfill kombiniere...wobei letzteres wohl das leichter zu behebende problem wäre..^^
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.11.08 15:46
Titel: ..
um es kurz zu machen.. das kalppt alles nicht so wie ich das gerne hätte, ich kann mit dem array nicht wirklich was anfangen weil ich nicht darauf komme wie ich dem array sage was es sich merken soll... noch dazu kommt das problem das ich nicht weiß wie ich das array anschließend mit floodfill in kombination bringe...
bitte um hilfe!!
danke
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 20.11.08 15:58
Gehen wir mal davon aus, deine Linie hat 5 Knicke, dann brauchst du also 7 Koordinaten, die beiden Anfangspunkte sowie die Knicke zwischen drin. Wie du die Linie zeichnest, weiß ich nicht, aber kann ich mir halbwegs denken, in jedem fall hast du zum Zeitpunkt des Zeichnens die Koordinaten vorhanden. Nun speicherst du jedes mal wenn du zeichnest die Koordinaten im Array. Anbieten würde sich ein statisches (Die Anzahl der Knicke ist fest, oder?) array of TPoint. TPoint ist nichts weiter als ein Objekt mit 2 Zahlen drin, X und Y Koordinate, also genau was du brauchst. Konkret:
Delphi-Quelltext 1:
| var MyArray : array[1..7] of TPoint; |
Dem kannst du nun Werte zuweisen:
Delphi-Quelltext 1: 2:
| MyArray[1].X := 50; MyArray[1].Y := 100; |
Nun hast du also diese Werte in deinem Array stehen. Nun musst du mir etwas genauer sagen, welchen Bereich du einfärben willst. Ich verstehe das so, dass die Koordinaten eines Pixels in diesem abgegrenzten Bereich reichen, sprich es reicht, einen geeigneten Eckpunkt zu finden und ein, zwei pixel in den Bereich zu gehen. Die frage ist, wie du deinen Bereich auswählen willst, davon hängt ab, wie man diesen Schritt durchführt, falls möglich.
edit: korrigierte delphi tags
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.11.08 16:13
Titel: ..
Naja...ich habe aber nur eine Koordinate und das ist die anfangskoordinate (x,y) wobei "y"
y:= Random(ClienHeight div 2 + ClientHeight div 4)
ist.
der Rest bleibt dem Zufall überlassen... ClientWidth ist in 8 Teile geteilt.. und delphi zieht bis zum Ende des Fensters eine (in der Höhe) zufällig koordinierte Linie.. das heißt ich kann den Endpunkt nicht angeben..
aber genau genommen dürfte das funktionieren was du mir hier erklärst =)
und wie ich es einfärben möchte:
so gesehen ist das Fenster anschließend ja in 2 Teile geteilt, einen oben und einen unten.. und den unteren würde ich eben ganz gerne (komplett) einfärben..
hoffe ich konnt deine frage damit irgendwie beantworten ^^
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 20.11.08 16:21
Ja! Das klingt einfach!
Also an irgendeiner Stelle im Programm ist die Anfangskoordinate (Die sollte eigentlich reichen, dazu gleich mehr) bekannt, auch mit der höhe, also der y-Koordinate, und zwar an der, an der du Random(...) aufrufst.
An dieser Stelle weist du diesem zufälligen Wert erstmal einer Variable zum zwischenspeichern zu, nämlich 'y'. Diese musst du dir nur merken. Dann gehst du ein paar pixel nach unten (mit +: das Koordinatensystem in Delphi beginnt oben links.) und wählst dieses pixel (vielleicht das Pixel [2, y+4] als Koordinate an der FloodFill beginnen soll.
Es wäre unglücklich, wenn nun deine Linie tatsächlich die Strecke zwischen [2, x+4] und [1, 1] durchschneidet und für einen weiteren, kleinen Bereich sorgt - wenn das passieren kann, solltest du es vllt ausschließen. Ob es passieren kann, liegt an deinem algorithmus den ich nicht kenne 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
freedy
      
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Do 20.11.08 16:22
Letztlich musst du dir alle Koordinaten merken bzw. abspeichern. Deine Koordinaten musst du selbst analysieren und bestimmen, wo sich eine geschlossene Fläche gebildet hat. Das ist - wenn überhaupt - Mathematik und sollte mit etwas Überlegen deinerseits leicht zu lösen sein.
Grüße
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 20.11.08 16:26
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.11.08 16:32
JayEff hat folgendes geschrieben : | Ja! Das klingt einfach!
Also an irgendeiner Stelle im Programm ist die Anfangskoordinate (Die sollte eigentlich reichen, dazu gleich mehr) bekannt, auch mit der höhe, also der y-Koordinate, und zwar an der, an der du Random(...) aufrufst.
An dieser Stelle weist du diesem zufälligen Wert erstmal einer Variable zum zwischenspeichern zu, nämlich 'y'. Diese musst du dir nur merken. Dann gehst du ein paar pixel nach unten (mit +: das Koordinatensystem in Delphi beginnt oben links.) und wählst dieses pixel (vielleicht das Pixel [2, y+4] als Koordinate an der FloodFill beginnen soll.
|
den Part hab ich jetzt noch nicht ganz verstanden...kann sein das ich mich grad echt dämlich anstelle aber irgewie hats noch nich klick gemacht
edit:
ich kann FloodFill ja aber nicht genau sagen wo sich geschlossene Bereiche bilden.. die werden ja zufällig bestimmt.. ^^
und wie merke ich mir denn alle Koordinaten? eigentlich doch mit dem "array of TPoint" .. oder? also wäre das doch nicht das Problem
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 20.11.08 16:50
FloodFill will bei mir grad nicht funktionieren, vllt mache ich was falsch, aber wie dem auch sei, was verstehst du denn nicht? (Wie wär's mit ein bisschen code von deiner Seite, damit ich mir mal ein bild machen kann  )
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
freedy
      
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Do 20.11.08 16:55
Naja, bis jetzt durchläufst du deine For-Schleife ... ähm.. 8 mal. Also legst du dir erstmal ein festes Array mit der Länge 8 an.
Delphi-Quelltext 1:
| PointArray : array[0..7] of TPoint; |
Jedes Mal nach Erzeugen deines Zufallswertes speicherst du dort deine Werte für x und y.
Delphi-Quelltext 1: 2:
| PointArray[i - 1].X := i * dx; PointArray[i - 1].Y := y; |
Dann solltest du dir mal auf dem Papier überlegen, wie du feststellen kannst, ob mehrere Linien eine geschlossene Form ergeben. Ist ein bisschen Vektorrechnung.
Grüße
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.11.08 17:05
oben steht zwar schon ein wenig code...
aaber meinetwegen...
hier der ganze code ^^
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| unit URect;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, jpeg;
type TForm1 = class(TForm) BGebirge: TButton; Image1: TImage; LWillkommen: TLabel;
procedure FormCreate(Sender: TObject); procedure ZeichneDreieck(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin Randomize; LWillkommen.Hide;
end;
procedure TForm1.ZeichneDreieck(Sender: TObject);
var dx:Integer; y:Integer; i : Integer; count : integer;
begin count:=+1; Canvas.Pen.Width := 2; Canvas.Pen.Color := clWhite; dx := ClientWidth div 8; y := ClientHeight div 2 + ClientHeight div 4; Canvas.MoveTo(0,y);
for i:=1 to 8 do begin y := Random(ClientHeight div 2 + ClientHeight div 4); Canvas.LineTo(i*dx,y);
if count = 1 then BGebirge.Enabled := false ; LWillkommen.Show; LWillkommen.Caption := 'Hey!!'
end;
end;
end. |
Moderiert von AXMD: Delphi-Tags hinzugefügt
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 20.11.08 17:07
freedy hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| PointArray[i - 1].X := i * dx; PointArray[i - 1].Y := y; |
Dann solltest du dir mal auf dem Papier überlegen, wie du feststellen kannst, ob mehrere Linien eine geschlossene Form ergeben. Ist ein bisschen Vektorrechnung. |
Nicht nötig, die Linie kann sich nicht überschneiden wenn der x-Wert immer nur vorgeschoben wird. Dementsprechend ist auch der Array nicht mehr nötig. Ich sehe grad den Code zum ersten mal  Ist mir wohl nicht aufgefallen am Anfang.
Nach der For-Schleife hat die Variable "y" noch einen Wert, richtig? An dieser Stelle füllst du den Bereich von dem Punkt Form1.Width, y + 1 aus: Canvas.FloodFill(Form1.Width, y+1, clBlack, fsBorder);
Mit FloodFill musst du noch etwas rumspielen vermtl, denn bei mir funktioniert der auf Anhieb erstmal nicht gescheit.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
c0raX 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.11.08 17:11
ist ganz lustig.. ich hab das jetzt mal so übernommen.. er meldet mir auch keinen Fehler..allerdings macht er absolut nichts ^^ zumindest nichts das nach Farbe aussieht..könte das am Hintergrundbild liegen?
|
|