Tính toán lực tuyến tính cần thiết để đạt một đỉnh cụ thể trên một parabol


7

Ý tưởng là người dùng ấn vào đâu đó trên màn hình và chương trình sẽ bắn một đối tượng theo hình parabola từ vị trí bắt đầu được xác định có đỉnh là nơi người dùng chạm vào màn hình.

Tôi đã quản lý để sử dụng hai điểm tôi có để có phương trình bậc hai ở dạng đỉnh và chuyển đổi nó thành dạng chuẩn ok nhưng tôi không biết làm thế nào để có được các giá trị cần thiết cho setLinearVelocity vx và vy trong corona sdk.

Mã hiện tại là:

-- 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 )

Xin chào, tôi bắt đầu viết ra một câu trả lời nhưng giữa chừng có một chút bối rối về cách tiếp cận của bạn. Vấn đề là nếu điểm bắt đầu và điểm kết thúc ở cùng một độ cao, tức là yStartPos = event.ybạn tìm thấy a = 0điều đó có nghĩa là bạn không còn có parabola nữa. Hãy sửa cho tôi. (Tôi sẽ có một vết nứt khác vào câu trả lời vào ngày mai nhưng cũng muốn kiểm tra xem bạn có đang mô phỏng một loại trọng lực nào đó tức là bắn một khẩu súng thần công hay không, vì tôi không chắc chắn chính xác những gì bạn đang cố gắng làm).
Malrig

Xin chào George - Tôi có trọng lực được đặt thành -9,8ms. Tôi đã làm việc trong vấn đề ngày hôm nay và có lẽ tôi có thể làm cho nó rõ ràng hơn một chút. Với trọng lực tiêu chuẩn được đặt trong động cơ vật lý box2d, tốc độ tuyến tính tôi nên cung cấp cho một vật thể để nó bắt đầu từ các dây (60.260) và chạm đỉnh tại (280.120)
Ralph

nếu yStartPos = event.y nó sẽ cần phải có giá trị vx rất lớn, nhưng về mặt kỹ thuật nó vẫn tạo thành một parabola ... thực sự có thể không - đây có thể là một lỗi tiềm năng, tôi sẽ buộc người dùng chọn một sự kiện. giá trị trên yStartPos
Ralph

Câu trả lời:


9

Ghi chú nhanh: Tôi không biết lua, tuy nhiên tôi khá giỏi toán / vật lý và xin vui lòng chịu đựng nếu tôi bao quát các ý tưởng mà bạn đã quen thuộc.

Đối với bất kỳ vật nào dưới lực hấp dẫn, thành phần nằm ngang của vận tốc vx, sẽ không đổi trong suốt chuyển động.

Chuyển động parabol của một nguồn bóng: https://animationphysics.pbworks.com/f/1246396681/TossedBall_ArcTrack.jpg

Trong ảnh này, các chấm đỏ được tạo ra ở các thời điểm bằng nhau, vì vậy quả bóng di chuyển khoảng cách bằng nhau xtheo hướng mỗi tích tắc (vì vậy vxlà không đổi) trong khi nó không ytheo hướng.

Những điều sau đây không trả lời trực tiếp câu hỏi của bạn nhưng rất hữu ích vì vậy tôi đã để lại nó trong

Có thể giải quyết vấn đề, đưa ra một vị trí bắt đầu (x0, y0)và một vị trí cuối cùng (xf,yf)mà vận tốc mà đối tượng cần ban đầu để đạt đến điểm cuối cùng. Điều này có thể được giải quyết bằng các phương trình chuyển động , xác định (vx,vy)là vận tốc ban đầu, Tlà thời gian để hoàn thành chuyển động và gkhi gia tốc do trọng lực,

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

giải hai phương trình này cho

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

Bây giờ đây không phải là một giải pháp hoàn chỉnh vì bạn biết chuyển động là parabol nhưng phải mất ba điểm để xác định một parabol. Vì vậy, bạn sẽ cần phải chọn thời gian để hạt đạt đến điểm cuối cùng hoặc vận tốc theo hướng x.

Câu trả lời thực tế

Bạn chọn điểm cuối cùng (xf,yf)là đỉnh của parabol, trên thực tế, điều này đưa ra một ràng buộc thứ ba, như bạn đã đề cập trong các bình luận, lần này là về vận tốc ytheo hướng.

Như bạn đã tìm thấy trong câu hỏi được liên kết , vyyêu cầu được đưa ra bởi,

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

Sau đó bạn có thể sử dụng phương trình trên cho vyvề vxđể giải quyết cho vxmang đến cho,

vx = (xf - x0) * sqrt(g / (2 * (yf - y0))).

Cảm ơn bạn vì câu trả lời! Parabol trong trường hợp này có thể được xác định bởi hai điểm vì một trong những điểm là đỉnh. Tôi đã tìm thấy một nửa giải pháp ở đây math.stackexchange.com/questions/785375/NH Tuy nhiên tôi gặp một số khó khăn khi dịch nó sang mã ...
Ralph

Ah tôi hiểu rồi, tôi đã hiểu nhầm câu hỏi của bạn, tôi sẽ chỉnh sửa câu trả lời của mình để phản ánh điều này. (Vì một số lý do, tâm trí của tôi hoàn toàn bỏ qua phần mà điểm cuối cùng là đỉnh)
Malrig

0

George đã trả lời chính xác điều này - tôi chỉ muốn bao gồm mã làm việc trong trường hợp ai đó cần nó trong tương lai. Cuối cùng, tôi không cần phải chuyển đổi các giá trị thành phương trình bậc hai

Các khoản tiền bổ sung trong mã như dy * 30 là để chuyển đổi giữa pixel và mét và trở lại, và là một nguyên nhân chính của việc không thể chuyển đổi toán học thành mã.

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}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.