PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hochschulmathematik für den Rechner



Cornix
21.07.2010, 22:34
Guten Abend liebe Community.
Ich habe diesesmal eine Frage bezüglich einigen, etwas fortgeschrittenen (nicht zu fortgeschritten gott seis gedankt) mathematischen Berechnungen welche ich anzustellen versuche.
Falls dies der falsche Platz für diesen Thread ist dann bitte ich vielmals um Entschuldigung, ich bin noch neu hier und habe noch keine genaue Übersicht.

Zu meiner Frage:
Gegeben sind zwei Punkte, A und B, definiert durch (Xa/Ya) und (Xb/Yb). Ich will nun die genauen Koordinaten eines Punktes C (Xc/Yc) finden unter den folgenden Bedingungen. Die Punkte A, B und C liegen auf einer geraden, und der Punkt C ist genau Z Einheiten von dem Punkt A entfernt.

Ich habe mich einmal selbst an die Mathematische Berechnung gesetzt, bitte beachtet, dass es schon etwas her ist seitdem ich mich intensiv mit solcherlei Dingen beschäftigt habe, es könnten einige Fehler enthalten sein.

http://www.multimediaxis.de/attachment.php?attachmentid=5871&stc=1&d=1279744949

Die Y-Koordinate des Punktes C kann man in Abhängigkeit der X-Koordinate betrachten indem man die Geradengleichung der Gerade durch die Punkte A und B zur Hilfe nimmt:
Y = (Yb-Ya) / (Xb - Xa) * (X - Xa) + Ya
dementsprechend wäre der Punkt C definiert durch:
C: (X / (Yb - Ya) / (Xb - Xa) * (X - Xa) + Ya)
Um die X-Koordinate zu erhalten müssten wir die Entfernung Z benutzen.
Z² = (Xa - Xc)² + (Ya - Yc)²
<=> Z = √( (Xa - Xc)² + (Ya - Yc)² )
<=> Z = √( (Xa - Xc)² + (Ya - ((Yb-Ya) / (Xb - Xa) * (Xc - Xa) + Ya)²) )
<=> Xc = |Xa - Xb| * Z / ( √( Xa² - 2*Xa*Xb + Xb² + (Ya - Yb)² ) )

Durch die Nutzung der beiden gegebenen Werte (die Gerade G und die Entfernung Z) konnten dadurch die beiden gesuchten Größen Xc und Yc ermittelt werden.

Eine Frage habe ich jedoch, wie bekomme ich all diese überlegungen und Schritte nun möglichst effizient in ein Computerprogramm?

Bitte um Aufklärung.
Cornix.

Dhan
22.07.2010, 00:22
Na du hast da doch am Ende deine Formel stehen:
Xc = |Xa - Xb| * Z / ( √( Xa² - 2*Xa*Xb + Xb² + (Ya - Yb)² ) )
die kannst du direkt als Code schreiben, sowat wie
Xc = max(Xa-Xb,Xb-Xa) * Z / ( sqrt(Xa*Xa - 2*Xa*Xb + Xb*Xb + (Ya-Yb)*(Ya-Yb)));
je nach Syntax deiner Hochsprache.




Falls es irgendwas mim Maker zu tun hat, dem müsstest du eine künstliche Wurzelfunktion basteln.

Mit Hochschulmathematik hat das übrigens nix zu tun, da is sowas mehr das Grundhandwerkszeug was man mitbringt.

Kyuu
22.07.2010, 07:10
Cornix: Wenn ich das richtig sehe, brauchst du den Pythagoras gar nicht, sondern nur den Strahlensatz. Diesen angewendet, solltest du auf die folgenden Formeln kommen:

xc = xb - ((xb - xa) * (G + Z)) / G

und analog

yc = yb - ((yb - ya) * (G + Z)) / G


Edit: Oder noch einfacher:

yc = ya - ((yb - ya) * Z) / G
xc = xa - ((xb - xa) * Z) / G

Einheit092
22.07.2010, 08:24
Für XP hab ich ein Rechnerskript augetrieben, vielleicht hilfst: http://www.youtube.com/watch?v=6z1_Dldpgio

R.D.
22.07.2010, 08:30
Darf man fragen für was das angewendet wird? (interessiert mich nämlich)

Flying Sheep
22.07.2010, 08:32
Für XP hab ich ein Rechnerskript augetrieben, vielleicht hilfst: http://www.youtube.com/watch?v=6z1_Dldpgio
Das Video besagt zwar, dass es für den VX ist, aber das sieht so simpel aus, dass du es auf jedem Maker ohne Programmierkentnisse nachbauen kannst :p
Du liest zwei Zahlen ein und verwurstest sie je nachdem, welche Option der Benutzer gewählt hat ;)
Das Handwerkszeug dazu liefert selbst der Rm2k.

@Topic:
Ich benutze sehr gerne Derive auf dem PC. Das ist allerdings keine Freeware (vielleicht bietet deine Hochschule ja Campus-Lizenzen an).
Wenn du mal eben ne Formel ausrechnen oder nen Graphen plotten lassen willst, kannst du aber auch http://www.wolframalpha.com nehmen.

[edit]
Eigentlich gehört das Thema eher ins Schüler-/Studentenforum. Falls du die Berechnung nicht gerade für ein Makergame brauchst, dann würde ich dich dort hin schieben.

Cornix
22.07.2010, 19:42
Vielen Dank für all eure Antworten.

Zuerstmal habe ich mich wohl gestern Abend nicht besonders geschickt ausgedrückt. Ich muss wohl sehr müde gewesen sein.
Natürlich ist mir klar, ich hätte einfach den Term wie ich ihn aufgeschrieben habe benutzen können, mir ging es im Grunde um 2 Sachen:
1). ist die Rechnung fehlerfrei? (War für mich schon ein ganzes Stück arbeit)
2). Kann dies noch leichter gelöst werden?

Aber ich habe ja bereits hilfreiche Antworten erhalten.


Cornix: Wenn ich das richtig sehe, brauchst du den Pythagoras gar nicht, sondern nur den Strahlensatz. Diesen angewendet, solltest du auf die folgenden Formeln kommen:

xc = xb - ((xb - xa) * (G + Z)) / G

und analog

yc = yb - ((yb - ya) * (G + Z)) / G


Edit: Oder noch einfacher:

yc = ya - ((yb - ya) * Z) / G
xc = xa - ((xb - xa) * Z) / G
Vielen Dank für die vereinfachte Formel, allerdings habe ich eine Frage, soll der Term:
ya - ((yb - ya) * Z)
tatsächlich durch G, sprich die Geradengleichung geteilt werden? Also demnach:
(ya - ((yb - ya) * Z)) / ((Yb-Ya) / (Xb - Xa) * (X - Xa) + Ya)

@R.D.:
Ein bewegungs System.

@Flying Sheep:
Ja ich brauche dies für ein RPG-Maker Spiel, zumindest war die Frage dafür gedacht. Übrigens besitze ich für das Plotten und Darstellen von Graphen einen sehr hilfreichen TI-NSpire CAS-Rechner. Ein wahrer Lebensretter in mancherlei Situation.

Kyuu
22.07.2010, 20:40
Vielen Dank für die vereinfachte Formel, allerdings habe ich eine Frage, soll der Term:
ya - ((yb - ya) * Z)
tatsächlich durch G, sprich die Geradengleichung geteilt werden? Also demnach:
(ya - ((yb - ya) * Z)) / ((Yb-Ya) / (Xb - Xa) * (X - Xa) + Ya)


Whoa, selbstverständlich nicht. ;) Ich ging davon aus, dass G den Streckenabschnitt zwischen A und B bezeichnet.

Hm, in diesem Fall fällt mir spontan keine einfachere Alternative ein, außer dir vorzuschlagen einen anderen Ansatz zu nehmen. Welchen, kann ich dir nicht sagen, da ich die Anforderungen nicht kenne.

Cornix
22.07.2010, 20:55
Im Prinzip nicht mehr als ich im ersten Beitrag geschildert habe.
Ich habe einen Punkt A, die Position eines CharaKters, und ich habe einen Punkt B, die Position eines anderen Charakters.
Ich will den ersteren Charakter um Z Einheiten in Richtung des zweiten Charakters verschieben.
Die Bewegung ist Pixelgenau, ich benutze nicht die Maker eigenen 32x32 Tiles.

Diese Funktion würde vielerlei Anwendungsmöglichkeiten bieten, zum Beispiel für zielsuchende Projektile, bewegungssysteme und ähnliches.

Kyuu
22.07.2010, 21:07
Ok, hatte es zuerst als edit, aber da du mich geninja'd hast:

Mir fällt gerade ein, wenn du die Geradengleichung in Parameterform hast, also

g : r = Ortsvektor + a * Richtungsvektor

brauchst du nur dein Z für a einzusetzen und erhältst die gewünschten Koordinaten.

Edit: Ach, vergiss es. Um den Richtungsvektor zu erhalten, musst du ihn normieren und damit brauchst du den Vektorbetrag, den du nur durch den Satz des Pythagoras bekommst.

BTW: Für zielsuchende Projektile solltest du dich mit Polarkoordinaten auseinandersetzen. Da du sowieso mit dem RPG Maker XP arbeitest, werden dir auch die trigonometrischen Funktionen bereitstehen, die dafür notwendig sind.

Cornix
22.07.2010, 22:46
Ich habe probiert die Formel in einer Funktion um zu setzen.
Hier mein versuch die neuen X beziehungsweise Y Koordinaten meines Objektes zu setzen:


z = 3
@new_x = (@x - @target.x).abs * z / Math.sqrt( Math.pow(x) - 2*@x*@target.x + Math.pow(@target.x) + Math.pow(@y - @target.y) )
@new_y = (@target.y - @y) / (@target.x - @x) * (@new_x - @x) + @yIch erhalte jedoch leider kein brauchbares Ergebniss, dementsprechend muss ich irgendetwas falsch umgesetzt haben.
Kann vielleicht jemand mit scharfen Augen einmal schauen ob er einen Fehler entdeckt, hier nocheinmal die Formel aus meinem ersten Beitrag zum Vergleich:
[ @x = Xa, @y = Ya, @target.x = Xb, @target.y = Yb, Z = z = 3, @new_x = Xc, @new_y = Yc ]

Xc = |Xa - Xb| * Z / ( √( Xa² - 2*Xa*Xb + Xb² + (Ya - Yb)² ) )

Gerade G:
Y = (Yb-Ya) / (Xb - Xa) * (X - Xa) + Ya

MagicMagor
23.07.2010, 10:01
Ich weiß jetzt nicht genau ob die Formel korrekt ist, aber sowas lässt sich mMn leichter mit Vektorbetrachtung lösen als mit Geraden-Gleichungen.

Als erstes berechnest du den Vektor (nennen wir ihn mal D) zwischen A und B.



Xd = Xa - Xb
Yd = Ya - Yb

Als nächstes normalisieren wir diesen Vektor, dh wir bringen ihn auf die Länge 1 indem wir ihn durch seine Länge teilen.


lengthd = Math.sqrt(Xd*Xd + Yd*Yd)
Xd = Xd / lengthd
Yd = Yd / lengthd

Alles was du jetzt machen musst ist d mit der gewünschten Länge multiplizieren und auf A addieren, dann erhälst du den gewünschten Vektor C


Xc = z*Xd + Xa
Yc = z*Yd + Ya

Anmerkung:
So wie ich den Vektor hier berechnet habe, zeigt er von A in Richtung B, falls C in der anderen Richtung liegen sollte reicht es einfach z mit -1 zu multiplizieren um den Vektor umzudrehen.

Zieh deine Rechnung ruhig auseinander und nutze mehrere kleine Zwischenvariablen, das macht die Rechnung nachvollziehbarer und erleichert die Fehlersuche, anstatt alles in eine Riesenformel packen zu wollen.

Cornix
01.08.2010, 10:17
Entschuldige für die späte Antwort, ich hatte nicht sonderlich viel Zeit die letzten Tage über.

Die von dir gegebene Berechnung funktioniert, vielen Dank.

Ich habe allerdings zwischenzeitlich auch noch eine weitere Rechnung aufgestellt welche nicht nur die Entfernung von C und A variiert sondern zusätzlich auch den Winkel von C zu B verändern kann.
Sie lautet wie folgt:


x = @x - @target.x
y = @y - @target.y

r = Math.hypot(x,y) #r = radius
r += z #z = Entfernung CB
a = Math.atan2(y,x) #a = Winkel AB
a -= d #d = Faktor um welchen der Winkel erweitert wird

x = @target.x + r * Math.cos(a)
y = @target.y + r * Math.sin(a)
Diese Berechnung funktioniert ebenfalls. Durch Addition bei r kann die Enfernung zwischen C und B festgelegt werden, durch Addition bei a kann der Winkel CB relativ zu dem Winkel AB gesetzt werden.

Gibt es hierfür vielleicht eine einfachere, bessere, Methode?
Vielen Dank für all eure Hilfe.
Cornix.