> 1 <

Автор Сообщение

mew2

Members


Статус

13 сообщений

Где: Ukraine
Род занятий:
Возраст:

#7707   2016-03-10 04:05 GMT+3 часа(ов)      
Наткнулся на такое вот видио в ютубе - https://www.youtube.com/watch?v=HbCL5olpsZs

Чет захотелось сделать нечто подобное, а то наскучивает постоянное дергание библиотечных функций изо для в день. Но я совсем нуб, поэтому решил начать с чего-то попроще, например вот с прыгающих шариков, код которых помещу в спойлер, если кому интересно - запустите у себя и посмотрите, лкм добавляет шарик, пкм пауза.

Но вот значит возник у меня ряд вопросов, а именно:

1. Как посчитать изменение скорости по у вследствии гравитации вроде-бы понятно, но как действует гравитация на скорость по х? Вобщем-то, в скрипте реализована функция, которая просчитывает это изменение, но взята она с потолка, хотя на первый взгляд выглядит вроде-бы правдободобно.

2. Как эффективно посчитать, что два шарика столкнулись? Неужели на каждом тике придется перебирать их ВСЕ, по очереди для каждого выясняя коллизии?

3. Как посчитать коллизии, если это будут не шарики, а какие-то объекты более сложной формы?

4. На видео эмулируется не только гравитация, но еще и элластичность связывающих нитей. Как эту штуку считать у меня даже догадок нет...


 
#lang racket/base
 
(require racket/gui racket/flonum)
 
 
(define WORLD-W 600.0)
 
(struct Obj ([cx #:mutable]
[cy #:mutable]
[v1 #:mutable]
[v2 #:mutable]
sz m) #:transparent)
 
 
(define (ball-r b) (/ (Obj-sz b) 2))
(define (ball-x b) (- (Obj-cx b) (ball-r b)))
(define (ball-y b) (- (Obj-cy b) (ball-r b)))
 
(define ball-1 (Obj 30.0 30.0 20.0 0.0 40.0 50.0))
 
(define ((World objects) [obj #f])
(if obj (set! objects (cons obj objects)) objects))
 
(define world (World (list ball-1)))
 
(define (delta-grav-v2 v2)
(+ v2 1/6))
 
(define (delta-grav-v1 v1 m)
((if (< 0 v1) + -)
(abs (- v1 (/ v1 m)))))
 
(define (delta-v v m)
(let ((e (* .5 (* .5 m v v))))
(sqrt (* 2.0 (/ e m)))))
 
(define (check-dc dc v r s m)
(cond
((> 0.0 (- dc r))
(values (- dc (- dc r)) (delta-v v m)))
((< WORLD-W (+ dc r))
(values (- WORLD-W (- dc WORLD-W) s) (- (delta-v v m))))
(else (values dc v))))
 
(define (apply-grav obj)
(set-Obj-v2! obj (delta-grav-v2 (Obj-v2 obj)))
(set-Obj-v1! obj (delta-grav-v1 (Obj-v1 obj) (Obj-m obj))))
 
(define (dc-dv coord v r s m)
(check-dc (+ coord v) v r s m))
 
(define (move obj)
(let*-values (((m) (Obj-m obj))
((r) (ball-r obj))
((s) (Obj-sz obj))
((dx v1) (dc-dv (Obj-cx obj) (Obj-v1 obj) r s m))
((dy v2) (dc-dv (Obj-cy obj) (Obj-v2 obj) r s m)))
(set-Obj-cx! obj dx)
(set-Obj-cy! obj dy)
(set-Obj-v1! obj v1)
(set-Obj-v2! obj v2)))
 
(define (dravv obj dc)
(send
dc draw-ellipse
(ball-x obj)
(ball-y obj)
(Obj-sz obj)
(Obj-sz obj)))
 
(define (draw-world dc)
(for ((obj (in-list (world))))
(apply-grav obj)
(move obj)
(dravv obj dc)))
 
 
(define frame
(new frame%
[label "pizdec"]
[width (fl->exact-integer WORLD-W)]
[height (fl->exact-integer WORLD-W)]))
(define canv
(new
(class canvas%
(inherit get-dc)
(super-new [parent frame]
[style '(no-autoclear)]
[paint-callback
(lambda (canvas dc)
(send canvas suspend-flush)
(send dc clear)
(draw-world dc)
(send canvas resume-flush))])
(send* (get-dc)
(set-background "black")
(set-pen "black" 0 'transparent))
(define/override (on-event e)
(case (send e get-event-type)
['left-down
(world
(Obj
(send e get-x) (send e get-y)
(- 15.0 (random 30))
(- 5.0 (random 10))
(random 10 50) (random 1 100)))]
['right-down (startstop)])))))
 
 
(define (timeloop)
(send canv on-paint)
(sleep/yield 1/60)
(timeloop))
 
(send frame show #t)
 
(define startstop
(let ((thr (thread timeloop)))
(lambda ()
(if (thread-running? thr)
(thread-suspend thr)
(thread-resume thr)))))
 

отредактировал(а) mew2: 2016-03-10 18:52 GMT+3 часа(ов)

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7710   2016-03-11 23:51 GMT+3 часа(ов)      
Эти вопросы следует задать автору видеоролика, или хотя бы попросить исходники.
> 1 <


Онлайн :

0 пользователь(ей), 31 гость(ей) :




Реклама на сайте: