ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 7
Mitglieder online: Keine
Registrierte Mitglieder: 2117
Neustes Mitglied: vitapen

Pfeil mit bestimmter Länge

Neue Antwort erstellen
 

 

Autor Nachricht
 
 
l.k.1234
Member


Anmeldedatum: 16.06.2012
Beiträge: 17

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 15:59    Titel: Pfeil mit bestimmter Länge

Ich möchte in meinem Projekt Pfeile zeichnen. Diese sollen in eine Richtung ausgerichtet werden, eine bestimmte Länge haben, usw.
Ich muss dazu einen Punkt um die entsprechende Länge in eine Richtung verschieben, verstehe aber nicht wie das gehen soll.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


simsmaster
Member


Anmeldedatum: 05.08.2009
Beiträge: 1631
Wohnort: Langenhagen

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 19:45    Titel:

Das ist jetzt aber eine sehr generelle Frage... Wenn es um die Mathematik geht: Vektoren. Ansonsten müsstes du etwas konkreter werden Wink
_________________
Mein Blog - XNA FAQ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


l.k.1234
Member


Anmeldedatum: 16.06.2012
Beiträge: 17

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 20:20    Titel:

Das man Vektoren braucht ist mir schon klar. Ich habe einen Vektor der die Richtung angibt, einen für den Ursprung und eine Float für die Pfeillänge.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Cani
Member


Anmeldedatum: 04.01.2010
Beiträge: 11
Wohnort: Hamburg

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 20:46    Titel:

Vector2 hat die Methode Normalize(). Damit bekommst du einen Vektor der Länge 1. Wenn du also deinen Richtungsvektor normalisierst und dann mit deinem Float multiplizierst, bekommst du einen Vektor, der in die Richtung zeigt und die gewünschte Länge hat. Ich geh mal davon aus, dass dein Ursprung der Punkt ist, den du verschieben willst, bzw. der den Anfangspunkt des Pfeils darstellt. Dieser Punkt plus den soeben berechneten Vektor ergibt dann den Endpunkt deines Pfeils.

Da du ja vermutlich nicht nur Anfang- und Endpunkt des Pfeils zeichnen willst, kannst du den normalisierten Richtungsvektor, jeweils mit einem Wert zwischen 0 und deinem Float multiplizieren. Damit erhälst du dann Punkte zwischen Anfang und Ende. Idealerweise machst du das ganze linear, also immer gleiche Abstände zwischen den einzelnen Float-Werten
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger ICQ-Nummer


fire
Member


Anmeldedatum: 26.07.2011
Beiträge: 143

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 23:12    Titel: Re: Pfeil mit bestimmter Länge

l.k.1234 hat Folgendes geschrieben:
Ich möchte in meinem Projekt Pfeile zeichnen.



Ich habe mal 2 Klassen geschrieben, die einem ermöglichen einfache Pfeile darzustellen. Vielleicht kannst du diese ja verwenden.

Code:

    class Arrow
    {
        Line mainLine;
        Line leftLine, rightLine;

        Vector2 startPosition;
        Vector2 endPosition;

        GraphicsDevice graphicsDevice;

        int thickness = 2;

        float sideAngle = 0.5f;
        float sideLenght = 20;

        public Arrow(GraphicsDevice graphicsDevice, Vector2 start, Vector2 end)
        {
            mainLine = new Line(graphicsDevice);
            leftLine = new Line(graphicsDevice);
            rightLine = new Line(graphicsDevice);

            this.graphicsDevice = graphicsDevice;
            startPosition = start;
            endPosition = end;

            UpdateArrow();
        }

        public Vector2 Start
        {
            get
            {
                return startPosition;
            }
            set
            {
                startPosition = value;
                UpdateArrow();
            }
        }
        public Vector2 End
        {
            get
            {
                return endPosition;
            }
            set
            {
                endPosition = value;
                UpdateArrow();
            }
        }
        public float Lenght
        {
            get
            {
                return Vector2.Distance(Start, End);
            }
            set
            {
                End = Start + Vector2.Normalize(End - Start) * value;
            }
        }
        public float Angle
        {
            get
            {
                return (float)Math.Atan2(End.Y - Start.Y, End.X - Start.X);
            }
            set
            {
                Vector2 direction = Vector2.Normalize(new Vector2((float)Math.Cos(value), (float)Math.Sin(value)));
                End = Start + direction * Lenght;
            }
        }

        public int Thickness
        {
            get
            {
                return thickness;
            }
            set
            {
                thickness = value;
                mainLine.thickness = thickness;
                leftLine.thickness = thickness;
                rightLine.thickness = thickness;
                UpdateArrow();
            }
        }
        public float SideAngle
        {
            get
            {
                return sideAngle;
            }
            set
            {
                sideAngle = value;
                UpdateArrow();
            }
        }
        public float SideLenght
        {
            get
            {
                return sideLenght;
            }
            set
            {
                sideLenght = value;
                UpdateArrow();
            }
        }

        private void UpdateArrow()
        {
            mainLine.Start = Start;
            mainLine.End = End;

            leftLine.Start = End;
            rightLine.Start = End;

            leftLine.Lenght = sideLenght;
            rightLine.Lenght = sideLenght;

            float angle = (float)Math.Atan2(startPosition.Y - endPosition.Y, startPosition.X - endPosition.X);
            leftLine.Angle = angle + sideAngle;
            rightLine.Angle = angle - sideAngle;
        }

        public void Draw(SpriteBatch s)
        {
            mainLine.Draw(s);
            leftLine.Draw(s);
            rightLine.Draw(s);
        }
    }

    class Line
    {
        public Vector2 Start = Vector2.Zero;
        public Vector2 End = new Vector2(100, 100);
        Texture2D tex;
        public Color color = Color.Black;
        public float thickness = 2;

        public Line(GraphicsDevice graphicsDevice)
        {
            tex = new Texture2D(graphicsDevice, 1, 1);
            tex.SetData<Color>(new Color[] { Color.White });
        }

        public float Lenght
        {
            get
            {
                return Vector2.Distance(Start, End);
            }
            set
            {
                End = Start + Vector2.Normalize(End - Start) * value;
            }
        }
        public float Angle
        {
            get
            {
                return (float)Math.Atan2(End.Y - Start.Y, End.X - Start.X);
            }
            set
            {
                Vector2 direction = Vector2.Normalize(new Vector2((float)Math.Cos(value), (float)Math.Sin(value)));
                End = Start + direction * Lenght;
            }
        }

        public void Draw(SpriteBatch s)
        {
            float angle = (float)Math.Atan2(End.Y - Start.Y, End.X - Start.X);

            s.Draw(tex,
                new Rectangle((int)Math.Round(Start.X), (int)Math.Round(Start.Y - thickness / 2), (int)Math.Round(Lenght), (int)Math.Round(thickness)),
                null, color, angle, new Vector2(0, 0.5f), SpriteEffects.None, 0);
        }
    }


Du erzeugst einfach ein neues Arrow-Objekt und zeichnest es dann in der Draw-Methode. Ich hoffe ich konnte dir (und vielleicht auch anderen, die Pfeile darstellen wollen) damit helfen.

Wenn jemand Fehler findet, sagt bitte Bescheid, dann korrigiere ich diese.
_________________
http://www.mediahdcenter.de
Kostenloses und gutes Farbkorrekturprogramm auf meiner Webseite
Ich suche noch nach einem Namen für dieses Programm.


Zuletzt bearbeitet von fire am 09.07.2012, 17:01, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


Kevin
Member


Anmeldedatum: 24.10.2008
Beiträge: 882
Wohnort: Karlsruhe

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 23:29    Titel:

@fire: Das mag dem einen oder anderen sicher helfen, danke dass du es gepostest hast, allerdings geht es dem Threadersteller wohl darum das Ganze in 3D zu machen (daher ist es im 3D Unterforum). Im dreidimensionalen Raum gibt es da eine ganz andere Herangehensweise, man verwendet Vertices...

@l.l.1234: Falls dein Problem noch nicht gelöst ist erkläre doch bitte detailliert wo was nicht funktioniert und wobei du Hilfe brauchst.
_________________
Mein Youtube Kanal
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


fire
Member


Anmeldedatum: 26.07.2011
Beiträge: 143

Antworten mit Zitat
BeitragVerfasst am: 08.07.2012, 23:34    Titel:

Oh, stimmt ich hab das 3d übersehen. Sorry
_________________
http://www.mediahdcenter.de
Kostenloses und gutes Farbkorrekturprogramm auf meiner Webseite
Ich suche noch nach einem Namen für dieses Programm.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de