![]() |
Re: farbige Figur erkennen
1 Tag später...
Ich hab jetzt eine Variante, bei der man manuell erkenne muss, ob ein Dreieck vorliegt entwickelt(als Vorlage für die nächste), doch da tritt ein Problem auf, welches ich net so ganz verstehe... Ich habe ein Image, mit dem Namen spielfeld. Darauf zeichne ich mit canvas.ellipse nen Kreis in clgray. Anschließend wollte ich die Koordinaten aller Punkte in Stringlisten tragen..eine für x, eine für y... doch bitte erklärt mir warum dieser Code:
Delphi-Quellcode:
auch Koordinaten von Punkten in die Liste einträgt, die nicht grau sind, also clBtnFace....??? :wiejetzt:
for ix:=0 to spielfeld.width do
begin for iy:=0 to spielfeld.height do begin if spielfeld.canvas.pixels[ix,iy]=clgrey then begin xwerte.add(inttostr(ix)); ywerte.add(inttostr(iy)); end; end; end; |
Re: farbige Figur erkennen
Was denn jetzt, clBlack oder clBtnFace (besser clGray) :wink: ?
[OT] Ja, dein Name war mir noch in Erinnerung. Sollte ich mal wieder lesen :wink: [/OT] |
Re: farbige Figur erkennen
Es wurde zwar schonmal vorgeschlagen, aber ich denke die Idee ist nicht klar rübergekommen.
Betrachte dein Program in zwei Teilen: 1.) die Konstruktionsregel des Spielfeldes 2.) Anzeige und Auswertung des Spielfeldes Die Konstruktionsregel des Spieles wird so programmiert das sie von Hause aus, also auf ganz natürliche Weise, von Anfang an weis ob und welche Linien ein Dreieck ergeben werden. Die Auswerteregel muß nun nur überprüfen ob 3 solcher Linien in einer Farbe eingefärbt wurden. Ergo: Denke über Datenstrukturen nach die Linien und Dreiecke verknüpft konstruieren und speichern können. Vorteil: du kannst die Parameter der nötigen Spielstärke direkt in diese Konstruktionsregeln des Spielfeldes einbauen. Denn je mehr Linien Dreiecke ergeben um so schwerer wird das Spiel. Die Darstellung dieser Datenstrukturen ist nun relativ unabhängig und hat im Grunde garnichts mit Bitmaps und Pixelauswertungen zu tuen, sondern eher mit Vektorengrafiken. Denn bei jedem Mausklick kannst du exakt mithilfe mathematischer Formeln berechnen in welchem Liniensegement=Vektor sich der Spieler befindet. Statt also stupid irgendwelche Linien in eine Pixel-Bitmap einzuzeichenen und dann auf komplizierte Art und Weise die Bitmap auszuwerten, konstruiere dein Spiel nach deinen Regeln, und somit stellt die grafische Zeichnung der Bitmap immer nur ein Abbild deiner Vektoren dar. Gruß Hagen |
Re: farbige Figur erkennen
na gut, das wird wohl das beste sein, aber habt ihr ne Ahnung warum es nicht fuinktioniert??ß
Ähm, beim Thema Vektrorgrafiken, ich hab da bei google, etc noch nichts wie ne Art kurze Einführung, oder so gefunden... habt ihr sowasoder ist es einfach nur dieses System, was man verstehen muss??? zum Prob: Ich will sozusagen alle Punkte vom Kreis in ner Stringlist, also die coords... nur er gibt mir alle Pixel im Spielfeld aus. :cry: |
Re: farbige Figur erkennen
Wie schon oben geschrieben, war das nur verschrieben mit clBlack/clGrey/clBtnFace?
Wozu brauchst du überhaupt die Pixel des Kreises? Wie negaH schon geschrieben hat, solltest du alles ausrechnen und nicht auslesen. Dein Bitmap darf nur das Abbild deiner inneren mathematischen Berechnungen sein (zu denen alzaimer ja schon einen guten Ansatz gepostet hat). |
Re: farbige Figur erkennen
Zitat:
|
Re: farbige Figur erkennen
Deine Grafikkarte möchte ich sehen :wink: .
Um es deutlich auszudrücken: es geht um die Pixel des Kreises. |
Re: farbige Figur erkennen
hm, war ja klar, dass ich da irgenwie daneben gelegen habe... :oops:
|
Re: farbige Figur erkennen
ähm, ich dachte es würde mir später noch helfen und da hab ich mir eben dies Zeilen ausgedacht(natürlichnet wilkürlich^^)
Doch irgendwie muss da wohl nen Denkfehler drin sein... ja ich weiß, dass die andere Variante ebsser ist und ich werde es auch so machen, aber es wurmt mich, dass das dort net funzt... |
Re: farbige Figur erkennen
Hi @ all!
Ich hab mir ma den Ansatz vom Baron vorgenommen, weil ich das Prinzip nich schlecht finde. Funktioniert bisher alles. Ich berechne die Funktionsgleichungen aus den gezeichneten Linien und speichere Sie in einem Record ab. Zum anschließenden Zeichnen berechne ich die Schnittpunkte der Linien mit dem Kreis (relativ ungenau). Um herauszufinden, ob drei Linien ein Dreieck bilden, mach ich das so, wies alzaimer gesagt hat. Jetzt hab ich folgendes Problem: ![]() Wie man in dem Screenshot sieht, werden auch Figuren gefüllt, die keine Dreiecke sind, da eine Linie anderer Farbe dadurch geht. Wie kann ich herausfinden, ob eine andersfarbende Linie das Dreieck schneidet.
Delphi-Quellcode:
type
TPointsArray = array[1..2] of TPoint; PPlayer = ^TPlayer; TPlayer = record Name: String; Color: TColor; Points: Integer; end; TLinie = record Punkt: TPoint; n: Real; m: String; Player: PPlayer; end; var anfP,endP:TPoint; Sp1, Sp2: TPlayer; // Spieler ActivePlayer: PPlayer; // Pointer auf Spieler, der am Zug ist Linien: array of TLinie; // Array mit allen vorhandenen Linieen function TForm1.SchnPkt(Linie1,Linie2:TLinie):TPoint; var m1,m2,x,y:Real; begin if (Linie1.m <> 'n') and (Linie2.m <> 'n') and (Linie1.m <> Linie2.m) then begin m1 := StrToFloat(Linie1.m); m2 := StrToFloat(Linie2.m); x := (Linie2.n-Linie1.n)/(m1-m2); if (x > 0) and (Ceil((m1*x)+Linie1.n) > 0) and (x < IM_SpielF.Width) and (Ceil((m1*x)+Linie1.n) < IM_SpielF.Height) then begin Result.X := Ceil(x); Result.Y := Ceil((m1*x)+Linie1.n); end else Result := Point(0,0); end; end; procedure TForm1.Triangles; var i,j,k : Integer; AP1,AP2,AP3: TPoint; begin if (Length(Linien) >= 3) then begin for i:=0 to Length(Linien)-1 do for j:=i+1 to Length(Linien)-1 do for k:=j+1 to Length(Linien)-1 do begin IM_SpielF.Canvas.Pen.Color := clBlack; IM_SpielF.Canvas.Brush.Color := clBtnFace; AP1 := SchnPkt(Linien[i],Linien[j]); AP1.Y := Convert(AP1.Y); AP2 := SchnPkt(Linien[i],Linien[k]); AP2.Y := Convert(AP2.Y); AP3 := SchnPkt(Linien[k],Linien[j]); AP3.Y := Convert(AP3.Y); if Inside(AP1) and Inside(AP2) and Inside(AP3) then begin if (Linien[i].Player^.Name = Linien[j].Player^.Name) and (Linien[i].Player^.Name = Linien[k].Player^.Name) then begin IM_SpielF.Canvas.Brush.Color := Linien[i].Player^.Color; IM_SpielF.Canvas.Polygon([AP1,AP2,AP3]); end; IM_SpielF.Canvas.Brush.Color := clRed; IM_SpielF.Canvas.Ellipse(AP1.X-2,AP1.Y-2,AP1.X+2,AP1.Y+2); IM_SpielF.Canvas.Ellipse(AP2.X-2,AP2.Y-2,AP2.X+2,AP2.Y+2); IM_SpielF.Canvas.Ellipse(AP3.X-2,AP3.Y-2,AP3.X+2,AP3.Y+2); end; end; end; end; Ich hoffe ihr versteht mein Problem und könnt mir helfen... Thx ... xDestiny |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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