You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

ChillUpX

User / Kunde

  • "ChillUpX" is male
  • "ChillUpX" started this thread

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

1

Monday, February 1st 2016, 5:44pm

[Hilfestellung] VEKTOREN? Was ist das und wie rechnet man damit?

Hallo Leute!
Es fällt mir wiederholt auf, dass besonders im Bereich der Plugin-Entwicklung viele Einsteiger und sogar Fortgeschrittene nicht viel mit dem Begriff "Vektor" (engl. "Vector") anfangen können und dementsprechend auch nicht wissen, wie man mit ihnen Umgeht. Ich will mit diesem kleinen Post versuchen das Thema Vektoren im Bezug auf die Plugin-Entwicklung etwas näher zu bringen.

Vorab: Ich habe nicht vor die komplette inner mathematische Vektor-Rechnung zu erklären. Das heißt hier werdet ihr nicht unbedingt erfahren, wie man beispielsweise den Winkel zwischen zwei Vektoren berechnet.

Was ist ein Vektor?
Man kann sich einen Vektor wie einen Pfeil vorstellen, welcher irgendwo in einem (dreidimensionalen) Raum ist. Er verbindet allgemein also erstmal nur zwei Punkte im Raum miteinander. Als Hilfe kann man sich auch einen Wegweiser vorstellen. Ein Wegweiser hat genau wie ein Vektor drei Eigenschaften:

1. Jeder Vektor hat eine Länge
Dabei handelt es sich so simpel wie es klingt um die Länge des Pfeils. Jeder Vektor hat eine bestimmte Länge und kann durch das multiplizieren mit einer Zahl beliebig verlängert/verkürzt werden. (Wegweiser: Wie viel Kilometer sind es bis zum Ziel?)

2. Jeder Vektor hat eine Richtung
Die Richtung des Vektors entspricht bei einem Pfeil dem Strich. Wenn man sich einen zweidimensionalen Raum/ein Koordinaten-System mit zwei Achsen vorstellt, dann bezeichnet die Richtung quasi die "Steigung" des Pfeils. (Wegweiser: Wie ist das Schild gedreht? Wohin zeigt die Spitze des Schildes?)

3. Jeder Vektor hat eine Orientierung
Die Orientierung gibt an in welche Richtung der Vektor zeigt. Bei einem Pfeil wäre die Orientierung die Richtung, in welche man den Pfeil entlang gehen muss um zur Spitze zu kommen. Also gibt die Pfeilspitze die Orientierung an. (Wegweiser: An welcher Seite vom Schild ist die Spitze? Links oder Rechts? Oben oder Unten?)

Ein Vektor wird mathematisch z.B. im dreidimensionalen Raum mit drei Koordinaten angegeben. Diese Koordinaten geben an, wie weit man vom Anfang des Vektors bis zum Ende in x, y und z Richtung gehen muss, um zum Ende zu kommen. Die x, y und z - Achsen werden alternativ auch x1, x2 und x3 - Achsen genannt.

Ein Vektor an einem mathematischen Beispiel
Um jetzt erstmal das Verständnis etwas zu stärken, schaut euch folgendes Bild an:

Hier sieht man jetzt einen Punkt P(2|5|3) und drei rote Linien, die den Weg zum Punkt vom Ursprung aus beschreiben.


Ein (Orts)Vektor ist also wie gesagt nichts anderes als die Beschreibung, wie man vom Ursprung (0|0|0) den Achsen entlang zum Punkt P kommt. Dieser (Orts)Vektor verbindet dann den Punkt P und den Ursprung mit einem Pfeil. (Ortsvektor weiter unten erklärt)

Dieser Pfeil ist hier grün dargestellt.


Vektoren die den Ursprung mit einem Punkt verbinden nennt man in der Regel auch Ortsvektoren. Vektoren die zwei Punkte miteinander verbinden nennt man dabei Verbindungsvektoren. Im oberen Bild kann man ebenfalls erkennen, wie die mathematische Schreibweise aussieht, welche aber bei der Plugin-Entwicklung nicht relevant ist. Man sollte sich nur im Klaren darüber sein, dass jede Zeile der übereinander geschriebenen Zahlen dem Weg zum Punkt auf einer Achse entspricht.

Um den Pfeil von einem Punkt im Raum zu einem anderen Punkt zu finden, muss man den Ortsvektor des Anfangspunkt vom Ortsvektor des Endpunktes subtrahieren. Dies könnt ihr einmal im folgenden Bild nachvollziehen, in dem ich beispielhaft einmal den Vektor gebildet habe, der den Punkt A(2|4|3) mit dem Punkt B(5|6|4) verbindet.




Wichtig: Man kann Vektoren beliebig verlängern oder kürzen, indem man ihn mit einer Zahl multipliziert. Um zum Beispiel die Länge zu halbieren muss man mit 0.5 multiplizieren.

Kleiner Zusatz: Die Länge eines Vektors bezeichnet man auch als Betrag, welchen man wie folgt schreibt: |Vektor| (Man umrahmt den Vektor einfach mit zwei senkrechten Strichen). Berechnen kann man ihn, indem man das Quadrat aller Koordinaten des Vektors addiert und die Wurzel aus der Summe zieht. |x| = sqrt( x² + y² + z² )

Ein Vektor mit Minecraft-Beispiel
Vektoren findet man bei der Plugin-Entwicklung überall, wo man etwas mit Entity-/Block- od. Spieler-Positionen zu tun hat. Dabei ist natürlich klar, dass eine Location einem Punkt in einem dreidimensionalen Raum entspricht. Dort hat man dann zum Beispiel die Funktion Location#getDirection() zur Verfügung (bei der BukkitAPI), welche häufig im Zusammenhang mit der Spieler-Position genutzt wird. Machen wir uns doch mit dem neuen Wissen über Vektoren einmal klar, was der Blickrichtungs-Vektor eines Spielers in Minecraft über den Spieler und dessen Position aussagt.
  • Welche Punkte verbindet dieser Blickrichtungs-Vektor? -> Er verbindet die Position des Spielers mit deinem Punkt der direkt vor dem Spieler liegt. "Direkt vor dem Spieler" bedeutet, dass der Vektor quasi in einem 90°-Winkel auf dem Gesicht des Spielers steht, also immer genau senkrecht nach vorne steht (Ähnlich wie die Nasenspitze, die Zeigt ebenfalls immer direkt vor euch/ist parallel zu eurer Blickrichtung).

Die Länge eines Vektors kann man beim Entwickeln mit der BukkitAPI ganz einfach mit der Funktion Vector#length() abfragen. (Achtung: Bei sehr vielen Abfragen in kurzer Zeit kann es zu Lags kommen, da jedes mal eine Wurzel-Funktion gelöst werden muss! -- Alternativ ist hier möglich einfach die Funktion Vector#lengthSquared() zu verwenden. Dies ist weniger aufwendig und bringt bei richtiger Anwendung auch das gleiche Ergebnis. Siehe Anmerkung von BtoBastian)

Das ist mit der Vector-Klasse der BukkitAPI noch möglich:
  • (Normalen)Einheitsvektor mit Vector#normalize();
  • Kreuzprodukt mit Vector#crossProduct(Vector v);
  • Skalarprodukt mit Vector#dot(Vector v);
  • Länge des Verbindungsvektors mit Vector#distance(Vector v);

Zum Schluss
Falls ihr Vorschläge für eine bessere Formulierung habt, dann bin ich gerne bereit meinen Text zu überarbeiten. Allgemein bin ich sehr offen gegenüber konstruktiver Kritik! Was würdet ihr anders schreiben/beschreiben? Was fehlt?

Vielen Dank für's Lesen!
~ChillUpX

Quelle der Bilder mit dem Koordinaten-System: http://www.mathe-seite.de/

This post has been edited 3 times, last edit by "ChillUpX" (Apr 27th 2016, 10:04pm)


RainyCrafter

User / Kunde

  • "RainyCrafter" is male

Posts: 212

Location: RainyCrafter.getLocation()

Occupation: Schule :C Programmirer

  • Send private message

2

Monday, February 1st 2016, 7:23pm

Hey,

ich muss sagen du hast das richtig gut gemacht ich musste das ganze leider früher durch meine eigenen Fehler lernen aber jeder Neueinsteiger sollte auf jedenfall deinen Beitrag zum vektor lesen und ich glaube jeder der ein bisschen Ahnung von Mathe hat wird es verstehen


Nice Job

LG Rainy :love:



GROUPDEV.de meine Webseite :D

LG Rainy :love:

ChillUpX

User / Kunde

  • "ChillUpX" is male
  • "ChillUpX" started this thread

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

3

Monday, February 1st 2016, 8:08pm

Danke für dein Feedback @RainyCrafter :)

~ChillUpX

ChillUpX

User / Kunde

  • "ChillUpX" is male
  • "ChillUpX" started this thread

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

4

Thursday, February 4th 2016, 3:36pm

#Puush :)

K4w4

User / Kunde

  • "K4w4" is male

Posts: 151

Location: Flensburg

Occupation: Schüler

  • Send private message

5

Friday, February 5th 2016, 7:31am

Falscher Bereich...
Kommt in Tutorials !
Aber trozdem toller Beitrag.

Java-Quelltext

1
2
3
if(isCoding("K4w4")) {
     player.sendMessage("@mcf_ ist der Beste!");
}

BtoBastian

Moderator

  • "BtoBastian" is male

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

6

Friday, February 5th 2016, 8:33am


Sieht gut aus, werde es demnächst komplett durchlesen.
(Achtung: Bei sehr vielen Abfragen in kurzer Zeit kann es zu Lags kommen, da jedes mal eine Wurzel-Funktion gelöst werden muss!)

Hier empfehle ich die Methode .lengthSquared() oder so ähnlich.
Wenn man z.B. nur prüfen will ob die Länge größer als 10 ist, dann mancht man nicht

Java source code

1
2
3
if (vector.length() > 10) {
  // blabla
}

sondern

Java source code

1
2
3
if (vector.lengthSquared() > 10*10) {
  // blabla
}

Gleiches gilt für die .distance()-Methode bei Vector und bei Location.
Standard Standart eines Flamingos ist einbeinig.

ChillUpX

User / Kunde

  • "ChillUpX" is male
  • "ChillUpX" started this thread

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

7

Saturday, February 6th 2016, 12:43pm

@K4w4
Danke für dein Lob. ;)

@BtoBastian
Erstmal danke für den Hinweis, hatte ich so jetzt nicht auf dem Schirm! Ich habe den von dir zitierten Abschnitt kurz erweitert und deinen Post verlinkt. So bleibt das ganze übersichtlicher.

~ChillUpX

ChillUpX

User / Kunde

  • "ChillUpX" is male
  • "ChillUpX" started this thread

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

8

Wednesday, April 27th 2016, 10:05pm

#Push .. Kann ja nicht schaden :)

ChillUpX

User / Kunde

  • "ChillUpX" is male
  • "ChillUpX" started this thread

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

9

Monday, September 5th 2016, 7:43pm

#Push

Einfach nochmal was nach oben schieben :)

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

10

Friday, September 9th 2016, 3:17pm

Find ich auch top :) Auch optisch sehr schön aufgebaut! Wird sicher einigen Leuten helfen :thumbsup:
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

ChillUpX

User / Kunde

  • "ChillUpX" is male
  • "ChillUpX" started this thread

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

11

Sunday, September 17th 2017, 10:23pm

#Push :)

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net