# Tutorial falsch?!



## Reality (5. Aug 2004)

Hi,
ich habe mit Hilfe eines Tut ein Ping Pong Game programmiert. Bzw. Ich habe mit nur das erst Kapitel angeschaut wie man ein Ball bewegt, den Rest überflogen und alles alleine gemacht.
Ein Fehler ist mir jedoch aufgefallen:



> ...
> Vielleicht fragt ihr euch nun, warum ich den Radius mit einbeziehe. Die x - Koordinate des Balles ist seine Mitte, also ist die rechte bzw. linke Koordinate um den Radius des Balles größer bzw. kleiner.
> ...



Als ich das dann bei mir übernahm, sackte mein Ball immer zur Hälfte ein.

Ich zeichnete also eine Linie, um mir die wahre x-Koordinate auszugeben und das Ergebnis war folgeder:







Der Ball wurde als als Quadrat angesehen und links oben begann die x-Koordinate. Nach dieser Kenntniss konnte ich dann den Ball richtig abprallen lassen.

Nun, bin ich bei einem anderen Tutorial, aber von derselben Seite und da schreibt der Autor folgendes zu einem Problem, wo es darum geht, wie ein Ball bemerkt, dass er von einem Mauszeiger abgeschossen wurde:




> Nun denn, die dritte Idee: Aus der Schule dürfte den meisten noch der Begriff eines Vektors geläufig sein. Wir haben es hier nun zwei Vektoren zu tun, die bei einem Schuss entstehen: Einem *Schussvektor (x_maus, y_maus)* des Mausklicks und einem *Positionsvektor des Balles (x_ball, y_ball).* Wenn wir nun die Länge des Verbindungsvektors dieser beiden Vektoren bestimmen und dieser kleiner als der Radius des Balles ist, so haben wir den Ball getroffen.
> Zunächst berechnen wir also den Verbindungsvektor indem wir die Koordinaten des einen Vektors von denen des Anderen abziehen:
> 
> // Bestimmen des Verbindungsvektors
> ...



Ein Vektor hat 2 Punkte und ein Punkt hat eine x-Koordinate und eine y-Koordinate. Also ist der angebliche Schussvektor nur ein Punkt, genauso wie der Positionsvektor des Balles.

Die beiden Punkte können nun einen Vektor ergeben. Aber mit einem Vektor kann man nicht den Satz des Pythagoras anwenden. Sein Erfolg ist also nur ein Zufallsprodukt mit Ungenauigkeiten, was auch das beweisst, dass er als Differenz 15 und nicht 10 nahm. Ausserdem spricht er wieder von Radius, aber wie oben schon bewiesen (siehe Screenshot) ist der x-Wert nicht der radius, sondern der Durchmesser.

Habe ich nun Recht oder irre ich mich fatal?!

Quelle

Liebe Grüße
Reality


----------



## bygones (5. Aug 2004)

Habe dem Autor Bescheid gegeben - vielleicht antwortet er


----------



## Beni (5. Aug 2004)

> ...
> Vielleicht fragt ihr euch nun, warum ich den Radius mit einbeziehe. Die x - Koordinate des Balles ist seine Mitte, also ist die rechte bzw. linke Koordinate um den Radius des Balles größer bzw. kleiner.
> ...



Das ist schon eine gute Idee, wenn man mit der Mitte des Balles arbeitet (es erleichtert spätere Berechnungen wie die Abstandsberechnung), aber man muss halt daran denken, dass Java anderst zeichnet.
-> Ich würde da einfach die Zeichung (g.drawOwal...) so abändern, dass die Koordinaten tatsächlich in der Mitte sind.



> Ein Vektor hat 2 Punkte und ein Punkt hat eine x-Koordinate und eine y-Koordinate. Also ist der angebliche Schussvektor nur ein Punkt, genauso wie der Positionsvektor des Balles.
> 
> Die beiden Punkte können nun einen Vektor ergeben.



Die Unterscheidung Punkt-Vektor wird zwar oft verwendet (weil man sich mehr darunter vorstellen kann), aber eigentlich sind Punkt und Vektor dasselbe: eine geordnete Menge von Zahlen. Man kann ein Punkt als Vektor und umgekehrt betrachten, ohne irgendwas zu verlieren.



> Aber mit einem Vektor kann man nicht den Satz des Pythagoras anwenden.


In einem orthogonalen Koordinatensystem bae ist die Länge eines Vektors durch den Satz des Pythagoras definiert :wink:



> Sein Erfolg ist also nur ein Zufallsprodukt mit Ungenauigkeiten, was auch das beweisst, dass er als Differenz 15 und nicht 10 nahm.


Wie er auf 15 kam, kann ich mir auch nicht erklären... das einzige, was mir sinnvoll erscheint ist immer noch 10 (vielleicht 9, falls der Ball "eingedrückt" werden soll)



> Ausserdem spricht er wieder von Radius, aber wie oben schon bewiesen (siehe Screenshot) ist der x-Wert nicht der radius, sondern der Durchmesser.


Kommt immer draufan, wie man das zeichnet. :wink:
Das wäre wohl am besten:

```
g.fillOval( x - radius, y - radius, radius*2, radius*2);
```


----------



## Reality (5. Aug 2004)

Beni hat gesagt.:
			
		

> Die Unterscheidung Punkt-Vektor wird zwar oft verwendet (weil man sich mehr darunter vorstellen kann), aber eigentlich sind Punkt und Vektor dasselbe: eine geordnete Menge von Zahlen. Man kann ein Punkt als Vektor und umgekehrt betrachten, ohne irgendwas zu verlieren.


Soweit ich weiss geht das höchstens, wenn man den Usprung auch als Punkt ansieht.
Ein Vektor ist ja nichts anderes als eine Gerade mit Intervallen.



> > Aber mit einem Vektor kann man nicht den Satz des Pythagoras anwenden.
> 
> 
> In einem orthogonalen Koordinatensystem bae ist die Länge eines Vektors durch den Satz des Pythagoras definiert :wink:


Wie soll denn das gehen, wenn der Vektor z.B. die Mitter eines orthogonalen Koordinatensystems teilt? Der Satz des Pythagoras erforder doch einen Dreieck.



> > Ausserdem spricht er wieder von Radius, aber wie oben schon bewiesen (siehe Screenshot) ist der x-Wert nicht der radius, sondern der Durchmesser.
> 
> 
> Kommt immer draufan, wie man das zeichnet. :wink:
> ...



Ach mist, hatte vergessen, dass ich einen anderen Code hatte. Er hat sein PingPong Ball nämlich genauso definiert. Ich erkannte den Sinn darin nicht und habe das "-radius" weggelassen, so dass der x-Wert zum Durchmesser wurde.

Also zur Berechnung. Stimmt sie nun? Falls ja, kann sie mir jemand erklären? Noch besser aufzeichnen?

@deathbyaclown:
Dein Ernst?!

Liebe Grüße
Reality


----------



## bygones (5. Aug 2004)

Reality hat gesagt.:
			
		

> @deathbyaclown:
> Dein Ernst?!


Klar... kenn ihn recht gut


----------



## Beni (5. Aug 2004)

Reality hat gesagt.:
			
		

> Beni hat gesagt.:
> 
> 
> 
> ...


Gerade mit Intervallen? Ich verstehe nicht, was du damit meinst.



			
				Reality hat gesagt.:
			
		

> > > Aber mit einem Vektor kann man nicht den Satz des Pythagoras anwenden.
> >
> >
> > In einem orthogonalen Koordinatensystem bae ist die Länge eines Vektors durch den Satz des Pythagoras definiert :wink:
> ...


----------



## Reality (5. Aug 2004)

Beni hat gesagt.:
			
		

> Gerade mit Intervallen? Ich verstehe nicht, was du damit meinst.



Eine Gerade ist nichts anderes als ein Vektor. Eine Gerade jedoch hat kein Anfang und kein Ende. Es geht von minus unedlich bis plus unendlich. Daher ist ein Vektor eine Gerade mit Intervallen (Eingrezungen. Also der Vector geht von Punkt1 bis Punkt2 und nicht weiter).

Zu deiner Zeichnung:

Wie ist es hiermit?!






Liebe Grüße
Reality


----------



## Illuvatar (5. Aug 2004)

x = a = 0
y = b = 7 (zum Beispiel)
c = sqrt (a² + b²) = sqrt (49) = 7


----------



## javacooperation (5. Aug 2004)

Hi!

Den von Reality gezeichneten Vector kann man in den Ursprung verschieben und dann wie von Illuvatar beschrieben seine Länge berechnen. Da es ja hier um mein Tutorial geht: Bei Fragen kann man mir gerne auch direkt schreiben, in der Regel antworte ich sogar, gell Reality :wink:


----------



## Reality (5. Aug 2004)

Hi,
ist mir beim Autogenen Training auch aufgefallen, dass er sich zum Ursprung verschieben lässt.
Ich werd mir jedenfalls das mit den Koordinaten durch den Kopf gehen lassen.
Mal sehen ob ich morgen dazu komme.

Liebe Grüße
Reality


----------



## Reality (6. Aug 2004)

Ok, jetzt weiss ich wieder was mein Problem war:






c ist weder der Radius noch der Durchmesser, da c nicht durch den Ursprung geht und darum ist die Rechnung meiner Auffassung nach falsch. :noe: 

Liebe Grüße
Reality


----------



## Beni (6. Aug 2004)

Reality hat gesagt.:
			
		

> Eine Gerade ist nichts anderes als ein Vektor. Eine Gerade jedoch hat kein Anfang und kein Ende. Es geht von minus unedlich bis plus unendlich. Daher ist ein Vektor eine Gerade mit Intervallen (Eingrezungen. Also der Vector geht von Punkt1 bis Punkt2 und nicht weiter).



_Gegenbeweis:_
Im 3-dimensionalen Raum: hat ein Vektor 3 Variablen (x, y, z).
Aber eine Gerade lässt sich nur mit 6 Variablen, einem Fixpunkt und einer Richtung, darstellen (allenfalls könnte man 2 spezielle Ebenen schneiden, dann kommt man auf 4 Variablen), deshalb kann eine Gerade kein Vektor sein.   

Spass beiseite, ich glaub ich weiss, was Du sagen willst. Aber ich glaube, die Gerade macht die Sache eher komplizierter als einfacher... (Vielleicht hast Du auch gerade eine neue Mathematik erfunden, die Mathematik ist da unberechenbar und die tollsten Durchbrüche geschehen manchmal einfach so).

Es ging mit aber oben vorallem um die netten Förmelchen, die immer funktionieren, egal ob man an Vektoren oder Punkte denkt.

Ein Beispiel: 

```
a = (ax, ay), b = ( ... ), c = (...)
a - b = c
```

Egal ob a und/oder b ein Vektor/Punkt ist, die Gleichung sieht immer gleich aus (auch wenn man sie ausschreibt). Und man kann munter Vektoren und Punkte tauschen, ohne dass was Schlimmes passiert.


----------



## Reality (6. Aug 2004)

Hi,
kannst du mir mal eine Rechnung als Beispiel geben?
Kann mir das nicht so richtig vorstellen, denn Vektoren bestehen für mich immernoch aus 2 Punkten.
Ich würde deine Aussage verstehen, wenn der Ursprung (0/0) ebenfalls als Punkt hinzugezählt wird.

Liebe Grüße
Reality


----------



## Beni (6. Aug 2004)

Mal hoffen, wir sprechen jetzt vom gleichen.

Diese Formel...

```
ax - bx = cx
ay - by = cy
```
... beschreibt, wie man aus zwei Punkten (a, b) einen Vektor (c) berechnen kann.

```
Punkt - Punkt = Vektor
```

Aber diese Gleichung beschreibt noch mehr, nämlich das Verschieben von Punkten.

```
Punkt - Vektor = Punkt
```

Du siehst: c war jetzt einmal ein Vektor, und einmal ein Punkt.
Und so kann man beliebig weitertauschen. Das Ergebnis macht vielleicht geometrisch gesehen keinen Sinn mehr

```
Punkt - Punkt = Punkt ??
```
aber die Gleichung ergibt nicht plötzlich ein Widerspruch (1 = 2 oder sowas), also ist auch diese Kombination legal.


----------



## Reality (6. Aug 2004)

Achso, meinst du das. 
Ja, soweit habe ich auch mal gedacht, bis ich wie oben bereits das Problem schilderte, dass meiner Auffassung nach c weder Radius noch Durchmesser ist, da es nicht durch den Ursprung geht.

Meiner Auffasung nach, ist das der Durchmesser, wenn folgendes zutrifft.


```
Math.abs(mousex - xBall) = 0
oder
Math.abs(mousey - yBall) = 0
```

Wenn einer der beiden Ergebnisse 10 oder kleiner ist, dann wurde getroffen.

Liebe Grüße
Reality


----------



## Reality (6. Aug 2004)

Also bei mir geht folgender Code mit dem Radius 10 wunderbar!


```
public boolean userHit (int maus_x, int maus_y)
	{
		// Bestimmen der Verbindungsvektoren
		double x = Math.abs(maus_x - pos_x);
		double y = Math.abs(maus_y - pos_y);

		// Wenn Distanz kleiner als 10 gilt Ball als getroffen
		if (x < 10 && y <10)
		{
			player.addScore (10*Math.abs(x_speed) + 10);
			return true;
		}
		else return false;
	}
```

Ich glaube nicht, dass der Code vom Tutorial stimmt.

Liebe Grüße
Reality


----------



## Beni (6. Aug 2004)

Auf diese Art betrachtest du den Ball einfach als Rechteck. Das Rechteck kommt halt nahe an einen Kreis ran, deshalb funktioniert es.
Aber es wird auch Punkte geben, wenn du in z.B. ein bisschen oben-links vom Ball deine Maus hast, was es bei der anderen Variante nicht geben wird.


----------



## Reality (6. Aug 2004)

Wenn die andere Lösung präziser sein soll, dann möchte ich gerne wissen warum.
Auf Seite1 habe ich schon erklärt, warum c weder Radius noch Durchmesser sein kann.

Liebe Grüße
Reality


----------



## bygones (6. Aug 2004)

ich finde es sehr interessant wie eisern du deine Meinung hier vertritts obwohl schon zig gegenbeispiele / -erklärungen gegeben wurden.... wenn du so davon überzeugt bist mach es doch so


----------



## Beni (6. Aug 2004)

Weil es die Definition eines Kreises ist (Abstand zum Mittelpunkt <= der Radius, und der Abstand kann man über die Länge des Vektors berechnen. Und die Länge kann man in diesem Fall über den Phytagoras berechnen. Sorry, mehr als das kann ich dir auch nicht mehr sagen, glaub es einfach - es stimmt)

Ich hab mal ein _maus_x = maus_y = 3_ angenommen, und die beiden Formeln zeichnen lassen:






Du siehst: die beiden Figuren sehen fast gleich aus, aber die linke ist ein Rechteck, und die rechte ein Kreis.

Naja, bei einem Durchmesser von 20 Pixel würde man davon halt nicht mehr soviel sehen.


----------



## Reality (6. Aug 2004)

Hi,
diese Beispiele besagten, dass Punkt und Vektor dasselbe ist und man in eine orthogonalen Koordinatensystem mindestens 2 Vectoren hat.
Da stimme ich auch zu!
Nur hat das ganze nichts mehr mit dem Post zu tun, wo ich meine letzte Zeichnung gepostet habe.

Liebe Grüße
Reality

EDIT: War an deathbyaclown gerichtet. Sehe erst jetzt Benis Post und lese es mir durch.


----------



## Reality (6. Aug 2004)

Mensch! Ich hatte das aus total falscher Sicht gesehen, warum sagt mir das keiner!  

So habe ich es immer betrachtet und hielt es deswegen für falsch:






Das Rote sind die x und y Koordinaten der Maus.

So die richtige Betrachtung:






Danke jedenfalls für eure Geduld! 

Liebe Grüße
Reality


----------



## Beni (6. Aug 2004)

Reality hat gesagt.:
			
		

> Mensch! Ich hatte das aus total falscher Sicht gesehen, warum sagt mir das keiner!



 :lol: dass es an sowas liegt, denkt man einfach nicht  :lol:


----------

