Помощь - Поиск - Пользователи - Календарь
Полная версия: Синусоидальное движение объекта Shape
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
-CherkaS-
Уважаемые товарищи программисты!!!!
Прошу прощения у вас за мою тему, но я уже какой день не могу реализовать вот что:

Мне надо сделать синусоидальное движение объекта Shape
пожалуйста кому не трудно выложите пожалуйста код реализации этого или же подробнейший алгоритм как написать код(подробнейший потому что я с бейсиком знаком не очень сильно=))))

Заранее благодарен вам, товарищи программисты!!!!
Гость
up
Lapp
Поясни подробнее, что за синусоидальное движение (они могут быть разные - по одной переменной? по двум? трем?..) тебе надо. И приведи то, что уже сам сделал. Короче - помоги тем, кто тебе помогает smile.gif. Тогда получишь ответ..
-CherkaS-
В общем получается движение как я понял движение по формуле y=sin(x)
х задается и по известному х находится у
вот и надо чтоб фигура Shape двигалась по синусоиду(по графику синуса у=sin(x))

то что у меня есть я думаю не стоит выкладывать потому что ваще бред и не работает
Lapp
Движением обычно называется зависимость коородинат от времени. Пока я вижу только зависимость координат между собой, и ничего не могу понять.
Цитата(-CherkaS- @ 12.11.2007 13:06) *

потому что ваще бред и не работает
Именно потому и покажи. Рабочие программы тут никто и не выкладывают. Все приходят за исправлением нерабочих.
Покажи - исправим.
-CherkaS-
вот смотри какой алгорим примерна должен быть:

y=sin(t)
А если точнее y = y0 + sin(t). Задаешь начальное местоположение (x0,y0). Подбираешь delta_t, чтоб не сильно частые волны были (начать лучше где-то с 0.01).
Организуешь цикл по x (сначала x = x0). В цикле x = x + 1, t = t + delta_t, по верхней формуле определяешь новый y.

Что то типа этого.
я сделал только беспорядочное движение:
Код

Private Sub Form_Load()
With Shape1
    .FillColor = vbRed
    .FillStyle = vbSolid
    .BorderStyle = vbBSNone
End With
With Timer1
    .Enabled = True
    .Interval = 500
End With

End Sub

Private Sub Timer1_Timer()
Const Pi As Single = 3.14
Dim x As Integer, y As Integer
Dim gor As Boolean, vert As Boolean
Randomize
With Shape1
x=.width*rnd-.width/2
gor = (.Left + x) < 0 Or (.Left + .Width + x > ScaleWidth)
y=.height*rnd-.height/2
vert = (.Top + y) < 0 Or (.Top + .Height + y > ScaleHeight)
End With
If vert Then y=0
if gor then x=0

With Shape1
    .Move .Left + x, z
End With

End Sub



беспорядочно движется а вот по синусу чтоб двигался не могу сделать кода как такового нет потому что я его удаляю в порыве бешенства так сказать =(((
CherkaS
Код перепутал немного

вот правильный
Код

Private Sub Form_Load()
With Shape1
    .FillColor = vbRed
    .FillStyle = vbSolid
    .BorderStyle = vbBSNone
End With
With Timer1
    .Enabled = True
    .Interval = 500
End With

End Sub

Private Sub Timer1_Timer()
Const Pi As Single = 3.14
Dim x As Integer, y As Integer
Dim gor As Boolean, vert As Boolean
Randomize
With Shape1
x=.width*rnd-.width/2
gor = (.Left + x) < 0 Or (.Left + .Width + x > ScaleWidth)
y=.height*rnd-.height/2
vert = (.Top + y) < 0 Or (.Top + .Height + y > ScaleHeight)
End With
If vert Then y=0
if gor then x=0

With Shape1
    .Move .Left + x, .top+y
End With

End Sub

CherkaS
ЧТо нет идей???
блин ну помогите пожалуйста
Lapp
Если тебе нужны формулы, то можешь попробовать типа вот эти:

x = .left + .width/L*i
y = (Sin(4*Pi*i/L)+1)/2*.Hight

Здесь i изменяется от 0 до L, можешь это делать в цикле. Возьми L равным так 200 или 300.. Это, конечно, не есть настоящее движение по синусоиде.. Просто график синусоиды. Подойдет?
CherkaS
вот что у мя получилось сегодня но он поднимается и все я не могу сделать ограничения чтоб если t дошел до единица пошел вниз до нуля опять вверх и тд

помогите исправить пожалуйста
Код

Dim x As Integer, y As Integer
Private Sub Form_Load()
Show
End Sub
Private Sub Form_Initialize()
With Shape1
    .FillColor = vbRed
    .FillStyle = vbSolid
    .BorderStyle = vbBSNone
End With
With Timer1
    .Enabled = True
    .Interval = 50
End With
x = 0
t = 0
End Sub

Private Sub Timer1_Timer()

t_delta = 0.01
t = t + t_delta



With Shape1
    .Move .Left + x, .Top - y
End With
x = x + 1
y = Sin(t) * 900
End Sub
CherkaS
еще один вариант но все также двигается только вверх надо сделать ограничение чтоб до определеного значения y вверх потом вниз тоже до определенного значения и опять вверх и тд

Код
Dim x As Integer, y As Integer
Private Sub Form_Load()
Show
End Sub
Private Sub Form_Initialize()
With Shape1
    .FillColor = vbRed
    .FillStyle = vbSolid
    .BorderStyle = vbBSNone
End With
With Timer1
    .Enabled = True
    .Interval = 50
End With
x = 0
y = 0
t = 0
i = 1
End Sub

Private Sub Timer1_Timer()
Const Pi = 3.14
t_delta = 0.01
L = 200
If t = 1 Then t = t - t_delta
With Shape1
    .Move .Left + x, .Top - y
End With
t = t + t_delta
i = i + 1
x = L / (i + 30)

y = ((Sin(4 * Pi * i / L) + 1) / 2) * 10

End Sub
CherkaS
где у меня здесь ошибка фигура Shape все равно идет вверх???

Код

Dim x As Integer, y As Integer
Private Sub Form_Load()
Show
End Sub
Private Sub Form_Initialize()
With Shape1
    .FillColor = vbRed
    .FillStyle = vbSolid
    .BorderStyle = vbBSNone
End With
With Timer1
    .Enabled = True
    .Interval = 50
End With
x = 0
y = 0
t = 0
i = 1
End Sub

Private Sub Timer1_Timer()
Const Pi = 3.14
t_delta = 0.01
L = 20

With Shape1
    .Move .Left + x, .Top - y
End With

i = i + 1
x = L / (i)
For s = -5 To 5                                               "Фигура должна идти вверх
y = ((Sin(4 * Pi * i / L) + 1) / 2) * 10
Next s
For s1 = 5 To -5                                             "Фигура должна идти вниз
y = ((Sin(4 * Pi * i / L) + 1) / 2) * (-10)
Next s1

End Sub

CherkaS
вот что получилсь в итоге

Код

Dim x As Integer, y As Integer
Private Sub Form_Load()
Show
n = 0
End Sub
Private Sub Form_Initialize()
With Shape1
    .FillColor = vbRed
    .FillStyle = vbSolid
    .BorderStyle = vbBSNone
End With
With Timer1
    .Enabled = True
    .Interval = 500
End With
x = 0
y = 0
i = 1
End Sub

Private Sub Timer1_Timer()
If n = 0 Then npm = 0
If n = 5 Then npm = 1

Const Pi = 3.14
L = 5
With Shape1
.Move x, .Top - y

i = i + 1
x = .Left + .Width / L * i

If npm = 0 Then
    n = n + 1
    y = (Sin(4 * Pi * i / L) + 1) / 2 * .Height
Else:
    n = n - 1
    y = (Sin(4 * Pi * i / L) + 1) / (-2) * .Height
End If
End With
End Sub


создаем модуль и прописываем там

Код

Public n As Integer
Public npm As Integer


проблема:
объект двигается по диагонале а мне надо что как по синусу!!!!! что у меня не правильно????
помогите пожалуйста!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.