AGB  ·  Datenschutz  ·  Impressum  







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

farbige Figur erkennen

Ein Thema von Baron Fel · begonnen am 12. Jun 2005 · letzter Beitrag vom 3. Sep 2005
Antwort Antwort
Seite 3 von 3     123   
Baron Fel

Registriert seit: 25. Mai 2005
Ort: Berlin
30 Beiträge
 
Delphi 5 Standard
 
#21

Re: farbige Figur erkennen

  Alt 13. Jun 2005, 19:55
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:
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;
auch Koordinaten von Punkten in die Liste einträgt, die nicht grau sind, also clBtnFace....???
Glück ist Zerbrechlich.
Fass es vorsichtig an.
Wie Porzellan
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#22

Re: farbige Figur erkennen

  Alt 13. Jun 2005, 20:43
Was denn jetzt, clBlack oder clBtnFace (besser clGray) ?

[OT] Ja, dein Name war mir noch in Erinnerung. Sollte ich mal wieder lesen [/OT]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#23

Re: farbige Figur erkennen

  Alt 14. Jun 2005, 06:15
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
  Mit Zitat antworten Zitat
Baron Fel

Registriert seit: 25. Mai 2005
Ort: Berlin
30 Beiträge
 
Delphi 5 Standard
 
#24

Re: farbige Figur erkennen

  Alt 14. Jun 2005, 16:49
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.
Glück ist Zerbrechlich.
Fass es vorsichtig an.
Wie Porzellan
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#25

Re: farbige Figur erkennen

  Alt 14. Jun 2005, 17:02
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).
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#26

Re: farbige Figur erkennen

  Alt 14. Jun 2005, 17:46
Zitat:
alle Punkte vom Kreis
Das ist scherlich möglich, da der Kreis bzw. die Linie im Allgemeinen unendlich viele Punkte hat, oder hab ich da was falsch verstanden?
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#27

Re: farbige Figur erkennen

  Alt 14. Jun 2005, 17:58
Deine Grafikkarte möchte ich sehen .
Um es deutlich auszudrücken: es geht um die Pixel des Kreises.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#28

Re: farbige Figur erkennen

  Alt 14. Jun 2005, 18:59
hm, war ja klar, dass ich da irgenwie daneben gelegen habe...
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Baron Fel

Registriert seit: 25. Mai 2005
Ort: Berlin
30 Beiträge
 
Delphi 5 Standard
 
#29

Re: farbige Figur erkennen

  Alt 14. Jun 2005, 19:15
ä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...
Glück ist Zerbrechlich.
Fass es vorsichtig an.
Wie Porzellan
  Mit Zitat antworten Zitat
Benutzerbild von xDestiny
xDestiny

Registriert seit: 3. Feb 2005
Ort: Berlin
10 Beiträge
 
Delphi 2006 Architect
 
#30

Re: farbige Figur erkennen

  Alt 3. Sep 2005, 18:37
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:

http://www.xdestiny.de.vu/linien1.jpg

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
xdestiny
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 01:50 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