Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 5

Анимация отрисовки циклоиды

12.12.2013, 21:21. Показов 2007. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть задача-на Vb.net используя только GDI+ смоделировать движение колеса и точки на нем.
фактически нужно анимировать отрисовку циклоиды.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Gr = Me.CreateGraphics()
        Me.Show()
        Gr.PageUnit = GraphicsUnit.Millimeter
        Gr.ScaleTransform(10.0F, -10.0F) 
        Gr.TranslateTransform(1.0F, -15.0F)
        TextBox1.Text = "10"
        'Gr.DrawRectangle(Pen1, 0.0F, 0.0F, 1000.0F, 1000.0F)
        '  Gr.DrawLine(Pen1, 0.0F, 0.0F, 0.0F, 15000.0F)
 
        Gr.DrawLine(Pen1, 0.0F, 0.0F, 15.0F, 0.0F)
        Button2.Show()
    End Sub
 
    
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
 
        Gr.DrawLine(Pen1, 0.0F, 0.0F, 15.0F, 0.0F)
        Ta = Convert.ToDouble(TextBox1.Text)
        Ta = 1 / Ta
 
        Dim t1 As Date
        Dim t2 As Date
        Dim t As Single
        R1 = 0.1F
        R2 = 1.0F
        t1 = Date.Now
 
 
        K1 = 0.0F
        K2 = 0.0F
       
        Y = 1.0
 
        K2 = 0.0F
        k3 = 0.0F
        V = 0 - R2
        t = R2 * 2 * Math.PI
        For i = 0 To 2 * t Step 0.01
 
            X = R2 * i - R2 * Math.Sin(i)
            X2 = R2 * i - R2 * Math.Sin(i + 2 * Math.PI / 3)
            X3 = R2 * i - R2 * Math.Sin(i - 2 * Math.PI / 3)
            Y = R2 - R2 * Math.Cos(i)
            Y2 = R2 - R2 * Math.Cos(i + 2 * Math.PI / 3)
            Y3 = R2 - R2 * Math.Cos(i - 2 * Math.PI / 3)
 
 
 
            Cx1 = k3
            Cy1 = R2
 
            Gr.DrawEllipse(Pen1, k3 - R2, 0.0F, 2 * R2, 2 * R2) 'колесо
            Gr.DrawLine(Pen1, K1, K2, X, Y) 'траектория
            Gr.DrawLine(Pen1, Cx1, Cy1, X, Y) 'спица
            Gr.DrawLine(Pen1, Cx1, Cy1, X2, Y2) 'спица
             Gr.DrawLine(Pen1, Cx1, Cy1, X3, Y3) 'спица
            Gr.FillEllipse(br1, X - R1, Y - R1, 2 * R1, 2 * R1) 'точка
            Gr.FillEllipse(br1, k3 - R1, R2 - R1, 2 * R1, 2 * R1) 'центр
 
            Threading.Thread.Sleep(Ta * 100)
 
            Gr.DrawEllipse(Pen3, k3 - R2, 0.0F, 2 * R2, 2 * R2)
            Gr.DrawLine(Pen2, Cx1, Cy1, X3, Y3) 'спица
            Gr.DrawLine(Pen2, Cx1, Cy1, X2, Y2) 'спица
            Gr.DrawLine(Pen2, Cx1, Cy1, X, Y)
            Gr.DrawLine(Pen1, K1, K2, X, Y)
            Gr.FillEllipse(br2, X - R1, Y - R1, 2 * R1, 2 * R1) 'точка
            Gr.FillEllipse(br2, k3 - R1, R2 - R1, 2 * R1, 2 * R1) 'центр
            
            K1 = X
            K2 = Y
            k3 = k3 + 0.01
        Next
 
        t2 = Date.Now
        Label4.Text = t2.Second - t1.Second & ":" & t2.Millisecond - t1.Millisecond
        Label4.Show()
    End Sub
используемый метод анимации топорен, но с ходу ничего лучше не придумалось.как следствие при отрисовке элипса и последующем его затирании траектория затирается тоже.
прошу подсказать возможность исправления этого кода или другой способ анимации
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2013, 21:21
Ответы с готовыми решениями:

Изменить код отрисовки кнопки
Если можно, то как изменить кот отрисовки кнопки, даже если эта кнопка находится в диологовом окне открытия файла или в окне MsgBox? ...

Как Вы увеличиваете скорость отрисовки контролов?
Вот стало интересно узнать

Рисование циклоиды
По окружности О1 с радиусом R1 (со скоростью V1) движется центр другой окружности О2 с радиусом R2. По окружности О2 движется точка со...

5
1651 / 714 / 47
Регистрация: 11.03.2012
Сообщений: 1,855
Записей в блоге: 1
12.12.2013, 21:35
TriDan, начало кода потеряли, напишите его для полной картины.
0
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 5
12.12.2013, 22:46  [ТС]
Цитата Сообщение от Release Посмотреть сообщение
TriDan, начало кода потеряли, напишите его для полной картины.
точно, проглядел.Спасибо.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Public Class Form1
    Public Shared Gr As Graphics
 
    Public Shared Pen1 As Pen = New Pen(Color.Black, 0.02F)
    Public Shared Pen2 As Pen = New Pen(Color.White, 0.02F)
    Public Shared br1 As SolidBrush = New SolidBrush(Color.Black)
    Public Shared br2 As SolidBrush = New SolidBrush(Color.White)
    Public Shared Pen3 As Pen = New Pen(Color.FromArgb(128, 255, 255, 255), 0.02F)
    Public Shared Pen4 As Pen = New Pen(Color.FromArgb(128, 0, 0, 0), 0.02F)
    Public Shared K1 As Single = 0.0F
    Public Shared X As Single
    Public Shared Y As Single
    Public Shared X2 As Single
    Public Shared Y2 As Single
    Public Shared X3 As Single
    Public Shared Y3 As Single
    Public Shared K2 As Single
    Public Shared R1 As Single 'радиус маленького шарика
    Public Shared R2 As Single 'радиус колеса
    Public Shared V As Single
    Public Shared Ta As Double
    Public Shared Cy1 As Single
    Public Shared Cx1 As Single
    Public Shared k3 As Single
 
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Gr = Me.CreateGraphics()
        
 
        Me.Show()
        Gr.PageUnit = GraphicsUnit.Millimeter
        Gr.ScaleTransform(10.0F, -10.0F) 
        Gr.TranslateTransform(1.0F, -15.0F)
        TextBox1.Text = "10"
        'Gr.DrawRectangle(Pen1, 0.0F, 0.0F, 1000.0F, 1000.0F)
        '  Gr.DrawLine(Pen1, 0.0F, 0.0F, 0.0F, 15000.0F)
 
        Gr.DrawLine(Pen1, 0.0F, 0.0F, 15.0F, 0.0F)
        Button2.Show()
    End Sub
 
    
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
 
        Gr.DrawLine(Pen1, 0.0F, 0.0F, 15.0F, 0.0F)
        Ta = Convert.ToDouble(TextBox1.Text)
        Ta = 1 / Ta
 
        Dim t1 As Date
        Dim t2 As Date
        Dim t As Single
        R1 = 0.1F
        R2 = 1.0F
        t1 = Date.Now
 
 
        K1 = 0.0F
        K2 = 0.0F
       
        Y = 1.0
 
        K2 = 0.0F
        k3 = 0.0F
        V = 0 - R2
        t = R2 * 2 * Math.PI
        For i = 0 To 2 * t Step 0.01
 
            X = R2 * i - R2 * Math.Sin(i)
            X2 = R2 * i - R2 * Math.Sin(i + 2 * Math.PI / 3)
            X3 = R2 * i - R2 * Math.Sin(i - 2 * Math.PI / 3)
            Y = R2 - R2 * Math.Cos(i)
            Y2 = R2 - R2 * Math.Cos(i + 2 * Math.PI / 3)
            Y3 = R2 - R2 * Math.Cos(i - 2 * Math.PI / 3)
 
 
 
            Cx1 = k3
            Cy1 = R2
 
            Gr.DrawEllipse(Pen1, k3 - R2, 0.0F, 2 * R2, 2 * R2) 'колесо
            Gr.DrawLine(Pen1, K1, K2, X, Y) 'траектория
            Gr.DrawLine(Pen1, Cx1, Cy1, X, Y) 'спица
            Gr.DrawLine(Pen1, Cx1, Cy1, X2, Y2) 'спица
             Gr.DrawLine(Pen1, Cx1, Cy1, X3, Y3) 'спица
            Gr.FillEllipse(br1, X - R1, Y - R1, 2 * R1, 2 * R1) 'точка
            Gr.FillEllipse(br1, k3 - R1, R2 - R1, 2 * R1, 2 * R1) 'центр
 
            Threading.Thread.Sleep(Ta * 100)
 
            Gr.DrawEllipse(Pen3, k3 - R2, 0.0F, 2 * R2, 2 * R2)
            Gr.DrawLine(Pen2, Cx1, Cy1, X3, Y3) 'спица
            Gr.DrawLine(Pen2, Cx1, Cy1, X2, Y2) 'спица
            Gr.DrawLine(Pen2, Cx1, Cy1, X, Y)
            Gr.DrawLine(Pen1, K1, K2, X, Y)
            Gr.FillEllipse(br2, X - R1, Y - R1, 2 * R1, 2 * R1) 'точка
            Gr.FillEllipse(br2, k3 - R1, R2 - R1, 2 * R1, 2 * R1) 'центр
            
            K1 = X
            K2 = Y
            k3 = k3 + 0.01
        Next
 
        t2 = Date.Now
        Label4.Text = t2.Second - t1.Second & ":" & t2.Millisecond - t1.Millisecond
        Label4.Show()
    End Sub
    
 
 
End Class
Для полноты картины-рисует прямо на форме, так как никаких других задач выполнять не планируется.
форма,текстбокс для выбора скорости анимации и кнопка-триггер
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
13.12.2013, 11:45
Лучший ответ Сообщение было отмечено как решение

Решение

Начал строить и оказалось, что для этого даже не нужно знать формулу циклоиды
Анимация построения циклоиды
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Imports System.Drawing.Drawing2D
 
Public Class Form1
    Private WithEvents timer As New Timer() With {.Interval = 50}
 
    Private cyclPoints As PointF() = New PointF(0) {} 'Массив точек для построения циклоиды
    Private wheel As GraphicsPath 'Движущееся колесо
    Private origWheel As GraphicsPath 'Исходное колесо
    Private CycloidPen As Pen = New Pen(Brushes.Red, 2) 'Перо для рисования циклоиды
    Private phi As Single = 15 'Приращение угла поворота колеса
    Private deltaX As Single 'Приращение линейного перемещения колеса
    Private diam As Single = 75.0F 'Диаметр колеса
 
    Private Sub Start_Click(sender As Object, e As EventArgs)
        With DirectCast(sender, Button)
            RemoveHandler .Click, AddressOf Start_Click
            AddHandler .Click, AddressOf Stop_Click
            .Text = "Стоп"
        End With
        timer.Start()
    End Sub
 
    Private Sub Stop_Click(sender As Object, e As EventArgs)
        With DirectCast(sender, Button)
            RemoveHandler .Click, AddressOf Stop_Click
            AddHandler .Click, AddressOf Start_Click
            .Text = "Старт"
        End With
        timer.Stop()
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler Button1.Click, AddressOf Start_Click
        Button1.Text = "Старт"
        TextBox1.Text = timer.Interval.ToString()
        'Рисование колеса
        origWheel = New GraphicsPath()
        'Опорная точка
        Dim pt As PointF = New PointF()
        'Обод
        origWheel.AddEllipse(New RectangleF(pt, New SizeF(diam, diam)))
        pt.Y += diam / 2
        'Точка на ободе
        origWheel.AddEllipse(pt.X - 2.0F, pt.Y - 2.0F, 4.0F, 4.0F)
        'Спица. Спицу добавляем так, чтобы метод GetLastPoint() всегда возвращал её конец
        origWheel.AddLine(pt.X + diam / 2, pt.Y, pt.X, pt.Y)
        'Смещаем колесо так, чтобы обод касался нижней границы формы
        origWheel.Transform(New Matrix(1, 0, 0, 1, 0, Me.ClientRectangle.Bottom - diam))
        'Первая точка циклоиды
        cyclPoints(0) = origWheel.GetLastPoint()
        'Приращение линейного перемещения
        deltaX = phi * Math.PI * (diam / 2) / 180
        'Копия оригинального колеса, чтобы можно было сбрасывать его местоположение
        wheel = origWheel.Clone()
    End Sub
 
    Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick
        Dim m As New Matrix() 'Матрица афинных преобразований
        Dim rect As RectangleF = wheel.GetBounds() 'Пределы колеса
        'линейное смещение колеса
        m.Translate(deltaX, 0)
        'Поворот относительно центра на заданный угол (угол в градусах)
        m.RotateAt(phi, New PointF(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2))
        'Применение афинных преобразований к колесу
        wheel.Transform(m) : m.Dispose()
        'Если колесо вышло за пределы формы, то начинаем сначала
        If wheel.GetBounds().Right > Me.ClientRectangle.Right Then
            wheel = origWheel.Clone()
            cyclPoints = New PointF(0) {}
            cyclPoints(0) = wheel.GetLastPoint()
        Else
            'Новое положение точки циклоиды добавляется в массив точек
            Array.Resize(Of PointF)(cyclPoints, cyclPoints.Length + 1)
            cyclPoints(cyclPoints.GetUpperBound(0)) = wheel.GetLastPoint()
        End If
        Me.Refresh()
    End Sub
 
    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality
        e.Graphics.DrawPath(New Pen(Brushes.Black, 2), wheel)
        If (timer.Enabled) AndAlso cyclPoints.Length > 1 Then
            e.Graphics.DrawCurve(CycloidPen, cyclPoints)
        End If
    End Sub
 
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        If (timer IsNot Nothing) Then timer.Interval = Integer.Parse(DirectCast(sender, TextBox).Text)
    End Sub
End Class

Вложения
Тип файла: zip sourceCode.zip (16.5 Кб, 42 просмотров)
4
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 5
16.12.2013, 14:57  [ТС]
ViterAlex
Спасибо!
а есть ли возможность нарисовать еще две спицы, отклоненные на 120 градусов?типа мерседесовский значок.
преобразование координаты конечной точки addline x = x'*cos()+ y'*sin() и y = -x'*sin() + y'*cos(), не дает результата.вернее, результат очень странный
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
16.12.2013, 15:41
Можно. Добавь эти строки между 44 и 45 строками предыдущего кода (нумерация строк по сообщению)
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        'Спицы колеса
        Dim m As New Matrix() 'Матрица для поворота спицы на 120 градусов
        Dim needle As New GraphicsPath() 'спица
        needle.AddLine(pt.X, pt.Y, pt.X + diam / 2, pt.Y)
        'Поворот спицы первый раз
        m.RotateAt(120, needle.GetLastPoint())
        needle.Transform(m)
        'Добавляем к колесу
        origWheel.AddPath(needle, False)
        m = New Matrix()
        'Поворот второй раз. Опять 120 градусов, т.к. она уже повёрнута один раз
        m.RotateAt(120, needle.GetLastPoint())
        needle.Transform(m)
        origWheel.AddPath(needle, False)
        'Добавляем последнюю "опорную" спицу
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2013, 15:41
Помогаю со студенческими работами здесь

Движение циклоиды
Здравствуйте. Хочу написать программу, которая отрисовывает циклоиду ( пример ). Получается 4 примитива: 1. Красная кривая. Рисую по...

Отобразить на форме анимацию графика циклоиды
Построить циклоиду на форме в Builder С ++. уравнения X=r*t-r*sin(t), y=r-r*cos(t)/ вот как она должна двигаться. Помогите...

Вычислить площадь циклоиды (площадь фигуры ограниченной линией заданной уравнением)
Площадь фигуры я правильно нашла? Меня очень смущает ответ, он большой какой-то, но где ошибка, я не понимаю. Проверьте, пожалуйста, все...

Анимация в OpenGL, а где собсно, анимация?
// Bounce.cpp // Demonstrates a simple animated rectangle program with GLUT // OpenGL SuperBible, 3rd Edition // Richard S. Wright...

Функция отрисовки
Доброго времени суток,форумчане. Возник вопрос с передачей в ф-цию рисования параметров. Пробывал вызывать из класса, но такой вариант...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru