| |
l.k.1234 Member
Anmeldedatum: 16.06.2012 Beiträge: 17
|
Verfasst 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 |
|

|
simsmaster Member
Anmeldedatum: 05.08.2009 Beiträge: 1631 Wohnort: Langenhagen
|
Verfasst 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  _________________ Mein Blog - XNA FAQ |
|
| Nach oben |
|

|
l.k.1234 Member
Anmeldedatum: 16.06.2012 Beiträge: 17
|
Verfasst 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 |
|

|
Cani Member
Anmeldedatum: 04.01.2010 Beiträge: 11 Wohnort: Hamburg
|
Verfasst 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 |
|

|
fire Member
Anmeldedatum: 26.07.2011 Beiträge: 143
|
Verfasst 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 |
|

|
Kevin Member
Anmeldedatum: 24.10.2008 Beiträge: 882 Wohnort: Karlsruhe
|
Verfasst 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 |
|

|
fire Member
Anmeldedatum: 26.07.2011 Beiträge: 143
|
Verfasst 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 |
|

|
|
|
|