zwei Probleme



  • Hi Leutz!
    Ich bin gerade ein wenig am C++ lernen und arbeite mit Borland C++ Builder 6 auf Windows 2000. Folgendes kleines Programm hab ich geschrieben:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "SysUtils.hpp"
    #include "Math.h"
    #include "Math.hpp"
    #include "stdlib.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    //>>>>>>> STRUKTUREN / KLASSEN / VARIABLEN <<<<<<<
    
    //----- STRUKTUR: VEKTOR    -----
    struct Vektor
    {
      char name;
      double x;
      double y;
    };
    
    //----- STRUKTUR: FARBE     -----
    struct Farbe
    {
      int r, g, b;
    };
    
    //----- FUNKTIONSPROTOTYPEN -----
    double vekwinkel(Vektor veins, Vektor vzwei);
    
    //----- KLASSE  : ZIEL      -----
    class Ziel
    {
      protected:
        Vektor ortalt;
        Vektor ortneu;
        Vektor richtung;
    
      public:
        double winkel;
        int    geschwindigkeit;
        Farbe  farbe;
    
        Ziel()
        {
          double betrag;
          richtung.y = -sin(winkel * M_PI / 180);
          richtung.x = -cos(winkel * M_PI / 180);
          betrag = sqrt(pow(richtung.x,2) + pow(richtung.y,2));
          richtung.x = richtung.x / betrag;
          richtung.y = richtung.y / betrag;
          farbe.r = 0;
          farbe.g = 0;
          farbe.b = 255;
        }
    
        void setzen(int x, int y)
        {
          ortneu.x = x;
          ortneu.y = y;
    
          if (x < 1) ortneu.x = 1;
          if (x > Form1->Image1->Width) ortneu.x = Form1->Image1->Width;
    
          if (y < 1) ortneu.y = 1;
          if (y > Form1->Image1->Height) ortneu.y = Form1->Image1->Height;
    
          ortalt = ortneu;
        }
    
        void bewegen()
        {
          Form1->Edit6->Text = richtung.x;
          Form1->Edit7->Text = richtung.y;
          double xpuffer = ortneu.x;
          double ypuffer = ortneu.y;
    
          ortneu.x = ortalt.x + richtung.x;
            if ((ortneu.x > Form1->Image1->Width - 5) | (ortneu.x < 5)) lenken(180);
    
          ortneu.y = ortalt.y + richtung.y;
            if ((ortneu.y > Form1->Image1->Height - 5) | (ortneu.y < 5)) lenken(180);
    
          ortalt.x = xpuffer;
          ortalt.y = ypuffer;
        }
    
        void zeichnen()
        {
          Form1->Image1->Canvas->Pixels[RoundTo(ortneu.x,0)][RoundTo(ortneu.y,0)]=RGB(farbe.r,farbe.g,farbe.b);
        }
    
        void lenken(diffwinkel)
        {
          double betrag;
          winkel = winkel + diffwinkel;
          richtung.x = -cos(winkel * M_PI / 180);
          richtung.y = -sin(winkel * M_PI / 180);
    
          betrag = sqrt(pow(richtung.x,2) + pow(richtung.y,2));
          richtung.x = richtung.x / betrag;
          richtung.y = richtung.y / betrag;
        }
    
        Vektor position()
        {
          return ortneu;
        }
    
    };
    
    //----- KLASSE  : TORPEDO   -----
    class Torpedo : public Ziel
    {
      protected:
        void farbwechsel(int x, int y)
        {
          int abstand;
          abstand = sqrt(pow(ortneu.x - x,2) + pow(ortneu.y - y,2));
          if (abstand > 200) abstand = 200;
          if (abstand < 10)  abstand = 10;
          farbe.r = (200 - abstand) * 1.342;
          farbe.b = 0;
          farbe.g = (200 - abstand) * 1.342;
        }
    
      public:
        double wendigkeit;
    
        void bewegen(int x, int y)
        {
          double xpuffer = ortneu.x;
          double ypuffer = ortneu.y;
          double diffwinkel;
          Vektor peilung;
          peilung.x = x - ortneu.x;
          peilung.y = y - ortneu.y;
    
          diffwinkel = vekwinkel(richtung,peilung);
          if (abs(diffwinkel) > wendigkeit) diffwinkel = wendigkeit * Sign(diffwinkel);
          lenken(diffwinkel);
          ortneu.x = ortalt.x + richtung.x;
          ortneu.y = ortalt.y + richtung.y;
    
          ortalt.x = xpuffer;
          ortalt.y = ypuffer;
          farbwechsel(x,y);
        }
    };
    
    //----- INSTANZEN           -----
    Ziel    Iziel;
    Torpedo Itorpedo;
    
    //----- FUNKTION: VEKWINKEL    -----
    double vekwinkel(Vektor veins, Vektor vzwei)
    {
     double vwinkel;
     vwinkel = (veins.x * vzwei.y - veins.y * vzwei.x);
     vwinkel = vwinkel / (sqrt( pow(veins.x,2) + pow(veins.y,2) ) * sqrt( pow(vzwei.x,2) + pow(vzwei.y,2) ));
     vwinkel = vwinkel * 180 / M_PI;
     return vwinkel;
    }
    
    //----- FUNKTION: FARBWECHSEL  -----
    void __fastcall TForm1::ZStartButtonClick(TObject *Sender)
    {
      ZStartButton->Enabled = false;
      TStartButton->Enabled = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::TStartButtonClick(TObject *Sender)
    {
      ZStartButton->Enabled = true;
      TStartButton->Enabled = false;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      Image1->Canvas->Pixels[X][Y] = clBlack;
      if (ZStartButton->Enabled == false)
      {
        Iziel.setzen(X,Y);
        Iziel.lenken(StrToInt(Edit2->Text));
        Iziel.geschwindigkeit = StrToInt(Edit1->Text);
      }
    
      if (TStartButton->Enabled == false)
      {
        Itorpedo.setzen(X,Y);
        Itorpedo.lenken(StrToInt(Edit4->Text));
        Itorpedo.geschwindigkeit = StrToInt(Edit3->Text);
        Itorpedo.wendigkeit = StrToInt(Edit5->Text);
        Itorpedo.wendigkeit = Itorpedo.wendigkeit / 100;
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      Timer1->Enabled=true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      randomize();
      Image1->Canvas->Refresh();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
      Image1->Canvas->Brush->Color = clWhite;
      Image1->Canvas->Pen->Color = clWhite;
      Image1->Canvas->FloodFill(1,1,clRed,fsBorder);
      Image1->Canvas->Brush->Color = clBlack;
      Image1->Canvas->Pen->Color = clBlack;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      Iziel.lenken(4 - rand() % 9);
      for (int i = 1; i <= Iziel.geschwindigkeit; i++)
      {
        Iziel.bewegen();
        Iziel.zeichnen();
      }
    
      for (int i = 1; i <= Itorpedo.geschwindigkeit; i++)
      {
        Itorpedo.bewegen(Iziel.position().x,Iziel.position().y);
        Itorpedo.zeichnen();
      }
    
      Timer1->Interval = 101 - TrackBar1->Position * 10;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::SimContClick(TObject *Sender)
    {
      if (SimCont->Caption == "Simulation starten")
      {
        Timer1->Enabled=true;
        SimCont->Caption = "Simulation anhalten";
        SimCont->Glyph->LoadFromFile("./Symbole/button_halt.bmp");
      }
      else
      {
        Timer1->Enabled=false;
        SimCont->Caption = "Simulation starten";
        SimCont->Glyph->LoadFromFile("./Symbole/button_start.bmp");
      }
    }
    //---------------------------------------------------------------------------
    

    Und nun treten zwei Probleme auf:
    Zum einen reagiert die Image-Komponente merkwürdig, wenn ich das Fenster maximiere. Statt die Größe zu verändern, so dass mehr Platz vorhanden ist, verzerrt sich das Image. Ich vermute, dass es systemabhängig ist, da mir ähnliches mit Delphi passiert ist. Dort allerdings funktionierte es unter Windows 2000 und unter Windows Me nicht...

    Das zweite Problem ist ein Stück merkwürdiger: Sowohl die Klasse Ziel, als auch Torpedo sollten eigentlich nur eine Spur auf Image1 erzeugen. Dies klappt anfangs wie gewollt. Lässt man das Programm jedoch eine Weile laufen, entstehen aus einer Spur jeweils zwei, deren Abstand immer zueinander größer wird. Irgendwie muss der Richtungsvektor beider Klassen verrückt spielen, letztendlich folgt jedoch der Torpedo dem Ziel wie gewollt (nur halt "doppelt" 😕 ).
    Danke schonmal im Vorraus für die Hilfe und eventuelle Verbesserungsvorschläge!
    (Falls falsches Forum bitte verschieben, Thanx!)



  • Mit "v******" meinte ich "Vor aus", warum wird sowas zensiert 😮 😕



  • Ich hab nochmal ein wenig getestet. Der Richtungsvektor ist in Ordnung. Obwohl ich mit

    Form1->Image1->Canvas->Pixels[RoundTo(ortneu.x,0)][RoundTo(ortneu.y,0)]=RGB(farbe.r,farbe.g,farbe.b);
    

    nur jeweils ein Pixel setze, spaltet sich die Spur irgendwann deutlich sichtbar auf. Der Fehler muss also woanders liegen, ich seh beim besten Willen aber nicht wo!? 😞 Hinter 'ortneu' verbirgt sich doch nur eine Koordinate, wie kann das sein? *verzweifel* (Der Fehler tritt auch ohne 'RoundTo' auf...)



  • Hmm... ich denke mal, dass sich hier kaum jemand finden wird, der sich in deinen Quelltext hineinversetzen kann/möchte. Könntest du das gesamte Projekt mal irgendwie zur Verfügung stellen? Ich würde das ganz gerne mal nachvollziehen.



  • Werd ich machen, wenn ich wieder daheim bin. Wer das Projekt haben will (und mir helfen will :D), dem schick ich's per Mail.



  • Dann veröffentliche aber bitte deine Mail-Adresse, so dass sich Interessenten direkt an dich wenden können, anstatt den Thread mit "ich auch"-Beiträgen zumüllen zu müssen.



  • Zu Befehl!
    Anfragen an hheeiikkoo@hotmail.com


Anmelden zum Antworten