Berechnung der linearen Kraft, die erforderlich ist, um einen bestimmten Scheitelpunkt auf einer Parabel zu treffen

7

Die Idee ist, dass ein Benutzer irgendwo auf den Bildschirm drückt und das Programm ein Objekt in Parabelform von einer definierten Startposition abfeuert, deren Scheitelpunkt dort liegt, wo der Benutzer den Bildschirm berührt hat.

Ich habe es geschafft, die beiden Punkte zu verwenden, um die quadratische Gleichung in Scheitelpunktform zu erhalten, und sie in die Standardform ok zu konvertieren, aber ich weiß nicht, wie ich die für setLinearVelocity vx und vy erforderlichen Werte in corona sdk erhalten kann.

Der aktuelle Code lautet:

-- given vertex and another point find the parabola formula in vertex form
-- y=a(x−h)2+k
local y, a, x, h, k, xh
h = event.x   
k = event.y
x = xStartPos
y = yStartPos

-- solve for a
xh = (x - h) * (x - h)
y = y + (k * -1)
a = y / xh

-- convert to quadratic formula
-- y = ax^2 + bx + c
local b, c
b = -2 * a * h
c = a * (h * h) + k

local vx, vy = -- calculate something here
proj:setLinearVelocity( vx,vy )
Ralph
quelle
Hallo, ich habe angefangen, eine Antwort zu schreiben, aber auf halbem Weg war ich etwas verwirrt über Ihren Ansatz. Das Problem war, dass wenn sich Start- und Endpunkt auf derselben Höhe befinden, dh yStartPos = event.ySie feststellen a = 0, dass Sie keine Parabel mehr haben. Fühlen Sie sich frei, mich zu korrigieren. (Ich werde morgen einen weiteren Riss bei einer Antwort haben, möchte aber auch überprüfen, ob Sie eine Art Schwerkraft simulieren, dh eine Kanonenkugel abfeuern, da ich nicht genau weiß, was Sie versuchen zu tun).
Malrig
Hallo George, ich habe die Schwerkraft auf -9,8 ms eingestellt. Ich habe heute an dem Problem gearbeitet und vielleicht kann ich es etwas klarer machen. Mit der in der box2d-Physik-Engine eingestellten Standardgravitation, welche Lineargeschwindigkeit sollte ich einem Objekt geben, damit es von den Koordinaten (60.260) ausgeht und den Scheitelpunkt bei (280.120) trifft
Ralph
Wenn yStartPos = event.y, muss es einen sehr großen vx-Wert haben, aber es würde technisch immer noch eine Parabel bilden ... eigentlich vielleicht nicht - dies könnte ein potenzieller Fehler sein, ich werde den Benutzer zwingen, ein event.y auszuwählen Wert über yStartPos
Ralph

Antworten:

9

Kurzer Hinweis: Ich kenne Lua nicht, aber ich bin ziemlich gut in Mathematik / Physik und bitte nehmen Sie Kontakt mit mir auf, wenn ich Ideen behandele, mit denen Sie bereits vertraut sind.

Für jedes Objekt unter der Schwerkraft vxbleibt die horizontale Komponente der Geschwindigkeit während der gesamten Bewegung konstant.

Parabolische Bewegung einer Ballquelle: https://animationphysics.pbworks.com/f/1246396681/TossedBall_ArcTrack.jpg

In diesem Bild werden die roten Punkte zu gleichen Zeiten gemacht, so dass der Ball bei xjedem Tick gleiche Entfernungen in die Richtung zurücklegt (also vxkonstant ist), während er nicht in die yRichtung geht.

Das Folgende beantwortet Ihre Frage nicht direkt, ist aber nützlich, daher habe ich sie belassen

Es ist möglich, das Problem bei einer Startposition (x0, y0)und einer Endposition zu lösen, (xf,yf)welche Geschwindigkeit das Objekt anfänglich benötigt, um den Endpunkt zu erreichen. Dies kann unter Verwendung von Bewegungsgleichungen gelöst werden , die (vx,vy)als Anfangsgeschwindigkeiten, Tals Zeit zum Vervollständigen der Bewegung und gals Beschleunigung aufgrund der Schwerkraft definiert werden.

xf = x0 + vx*T               // This has no acceleration part as it is zero for x
yf = y0 + vy*T - g*T^2/2

Das Lösen dieser beiden Gleichungen ergibt

vy = vx * (yf - y0)/(xf - x) + g * (xf - x0)/(2 * vx).

Dies ist keine vollständige Lösung, da Sie wissen, dass die Bewegung parabolisch ist, aber es sind drei Punkte erforderlich, um eine Parabel zu definieren. Sie müssen also entweder die Zeit wählen, die das Partikel benötigt, um seinen endgültigen Punkt zu erreichen, oder die Geschwindigkeit in x-Richtung.

Aktuelle Antwort

Sie wählen, dass der Endpunkt (xf,yf)der Scheitelpunkt der Parabel ist. Dies führt tatsächlich eine dritte Einschränkung ein, wie Sie in den Kommentaren erwähnt haben, diesmal für die Geschwindigkeit in der yRichtung.

Wie Sie in der verknüpften Frage gefunden haben, ist das vyErforderliche gegeben durch:

vy = sqrt(2 * g * (yf - y0)).

Sie können dann die Gleichung oben für die Verwendung vyvon in Bezug vxzu lösen für vxdie gibt,

vx = (xf - x0) * sqrt(g / (2 * (yf - y0))).
Malrig
quelle
Vielen Dank für Ihre Antwort! Die Parabel kann in diesem Fall durch zwei Punkte definiert werden, da einer der Punkte der Scheitelpunkt ist. Ich habe hier eine halbe Lösung gefunden math.stackexchange.com/questions/785375/… Ich habe jedoch einige Probleme, sie in den Code zu übersetzen ...
Ralph
Ah, ich verstehe, ich habe Ihre Frage falsch verstanden. Ich werde meine Antwort bearbeiten, um dies widerzuspiegeln. (Aus irgendeinem Grund ignorierte mein Verstand den Teil, in dem der letzte Punkt der Scheitelpunkt ist, völlig)
Malrig
0

George hat dies richtig beantwortet - ich wollte nur den Arbeitscode einfügen, falls jemand ihn in Zukunft benötigt. Am Ende musste ich die Werte nicht in eine quadratische Gleichung umwandeln

Die zusätzlichen Summen im Code wie dy * 30 sind die Konvertierung zwischen Pixel und Meter und wieder zurück und waren eine Hauptursache dafür, dass die Mathematik nicht in Code konvertiert werden konnte.

local dy = (yf - y0) * 30
local dx = (xf - x0) * 30
local t = 1 / display.fps
local a = t * t * -9.8


vy = math.sqrt(2 * a * dy) * display.fps * -1
vx = dx * math.sqrt(a / (2 * dy)) * display.fps


local startingVelocity = { x=vx,  y=vy}
Ralph
quelle