43 / 43 / 3
Регистрация: 18.12.2011
Сообщений: 559
1

Нарисовать дугу через 3 точки

14.10.2013, 13:08. Показов 4398. Ответов 8
Метки нет (Все метки)

Как нарисовать дугу через 3 точки?
К примеру у меня на форме 3 спрайта которые перетягиваются мышкой
и надо между ними постоянно отрисовывать дугу вершина которой зависит от расположения 2 спрайта.
Пример:
Нарисовать дугу через 3 точки

В интернете нашёл ток
Pic.Circle (100, 200), 50, 10000, 45 * 3.14 / 180, 135 * 3.14 / 180
Вот ток что здесь отвечает за середину так и не понял......
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2013, 13:08
Ответы с готовыми решениями:

Начертить Арку / Дугу через три точки?
Всем привет! В Инете нашёл исходник, по трём точкам чертит круг. Подскажите пожалуйста, как...

Как нарисовать в горизонтальной плоскости дугу между 2 точками
Здравствуйте, Как нарисовать в горизонтльной плоскости дугу между 2 точками...например, отобразить...

Нужно нарисовать дугу которая будет идти от определенной точки к линии
На скриншоте прямая линия под углом. Её надо "округлить" Есть такой вот кусочек кода ...

Как нарисовать через CSS такую дугу?
Как нарисовать через CSS такую дугу? Двух-цветную? Что вообще понимается в макете под таким...

8
Модератор
8816 / 3308 / 847
Регистрация: 22.02.2013
Сообщений: 4,983
Записей в блоге: 78
14.10.2013, 13:33 2
Как вариант можно использовать кривые безье, сплайны.
0
43 / 43 / 3
Регистрация: 18.12.2011
Сообщений: 559
14.10.2013, 13:37  [ТС] 3
Сейчас читаю про безье.
Ради дуги имеющей 1 точку перегиба чёт кода больше чем положено...
0
Модератор
8816 / 3308 / 847
Регистрация: 22.02.2013
Сообщений: 4,983
Записей в блоге: 78
14.10.2013, 13:42 4
Очень простое решение, при использовании квадратичной кривой, при первая и последняя точки известны, а среднюю легко вычислить, т.к. известно t=0.5. В интернете кучя инфы по кривым Безье.
0
43 / 43 / 3
Регистрация: 18.12.2011
Сообщений: 559
14.10.2013, 17:56  [ТС] 5
Не чё не пойму, уже 3 вид формулы и всё возвращают координаты точек что можно на стадионе рисовать.

Кликните здесь для просмотра всего текста
Visual Basic
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
Option Explicit
Private Type Point
    X As Single
    Y As Single
End Type
 
Dim a As Point
Dim b As Point
Dim c As Point
Dim d As Point
Dim i As Long
 
Private Sub Form_Load()
    a.X = 120
    a.Y = 100
    b.X = 170
    b.Y = 50
    c.X = 300
    c.Y = 50
    d.X = 300
    d.Y = 100
    Me.PSet (a.X, a.Y), RGB(255, 0, 0)
    Me.PSet (b.X, b.Y), RGB(255, 0, 0)
    Me.PSet (c.X, c.Y), RGB(255, 0, 0)
End Sub
 
Private Sub Command1_Click()
    For i = 0 To c.X - a.X
        Me.PSet (bezz(a, b, c, d, i).X, bezz(a, b, c, d, i).Y), RGB(255, 0, 0)
    Next i
    Me.Refresh
End Sub
 
Private Function bezz(p0 As Point, p1 As Point, p2 As Point, p3 As Point, t As Long) As Point
    Dim X As Long
    Dim Y As Long
    Dim R As Point
    Dim var1 As Long
    Dim var2 As Long
    Dim var3 As Long
    
    var1 = 1 - t
    var2 = var1 * var1 * var1
    var3 = t * t * t
    
    X = var2 * p0.X + 3 * t * var1 * var1 * p1.X + 3 * t * t * var1 * p2.X + var3 * p3.X
    Y = var2 * p0.Y + 3 * t * var1 * var1 * p1.Y + 3 * t * t * var1 * p2.Y + var3 * p3.Y
    Debug.Print X
    Debug.Print Y
    R.X = X
    R.Y = Y
    bezz = R
End Function

Если кто понимает в чём косяк помогите исправить, формула с вики тож самое
7 значные цифры выдаёт.
Нарисовать дугу через 3 точки
0
es geht mir gut
11264 / 4745 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
14.10.2013, 20:48 6
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Вот что-то похожее
Visual Basic
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
Option Explicit
Private Type typePoint
    X As Double
    Y As Double
End Type
Dim P(0 To 2) As typePoint
 
Private Sub Form_Load()
    Scale (-100, 100)-(100, -100)
    P(0).X = -50: P(0).Y = 0
    P(2).X = 50: P(2).Y = 0
    DrawWidth = 3
End Sub
 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim t As Single
    Cls
    P(1).X = X: P(1).Y = Y
    For t = 0 To 10 Step 0.01
   
         X = (1 - t) ^ 2 * P(0).X + 2 * (1 - t) * t * P(1).X + t ^ 2 * P(2).X
         Y = (1 - t) ^ 2 * P(0).Y + 2 * (1 - t) * t * P(1).Y + t ^ 2 * P(2).Y
         'X = (1 - t) ^ 3 * P(0).X + 3 * (1 - t) ^ 2 * t * P(1).X + 3 * (1 - t) * t ^ 2 * P(2).X + t ^ 3 * P(3).X
         'Y = (1 - t) ^ 3 * P(0).Y + 3 * (1 - t) ^ 2 * t * P(1).Y + 3 * (1 - t) * t ^ 2 * P(2).Y + t ^ 3 * P(3).Y
      
        PSet (X, Y)
    Next t
End Sub
Миниатюры
Нарисовать дугу через 3 точки  
1
es geht mir gut
11264 / 4745 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
14.10.2013, 20:52 7
19-я строка
Visual Basic
1
 For t = 0 To 1 Step 0.01
0
43 / 43 / 3
Регистрация: 18.12.2011
Сообщений: 559
14.10.2013, 20:57  [ТС] 8
Уже решил так
Visual Basic
1
2
3
4
5
6
7
8
9
Private Function bezz(p0 As Point, p1 As Point, p2 As Point, t As Single) As Point
    Dim R As Point
    R.X = (1 - t) * (1 - t) * p0.X + (1 - t) * t * (p1.X * 2) + t * t * p2.X
    R.Y = (1 - t) * (1 - t) * p0.Y + (1 - t) * t * (p1.Y * 2) + t * t * p2.Y
    bezz = R
End Function
Тут главное чтоб t было числом до 1.
Ещё бы придумать как выбирать оптимальное кол-во точек для отрезка
а то постоянно 100 рисовать не айс)
Добавлено через 4 минуты
Такого не знал
Visual Basic
1
t ^ 2
Спасиб
0
Заблокирован
15.10.2013, 07:09 9
Цитата Сообщение от radlif Посмотреть сообщение
Такого не знал
Visual Basic
1
t ^ 2
И не надо знать, особенно при массовых рассчетах (в графике, как в Вашем случае, например).
Возведение в степень работает в сотни раз медленнее обычного перемножения.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2013, 07:09
Помогаю со студенческими работами здесь

Нарисовать дугу соединяющую два вектора, проходящих через общий центр, зная радиус
Здравствуйте форумчане. Имеется точка, которую пронизывают два вектора (луча). Зная радиус нужно...

Нарисовать дугу
Доброе времени суток. У меня есть числовая ось Х и точки на нем, мне надо нарисовать дугу так как...

Нарисовать дугу эллипса
В Dec-C++ подключила графическую библиотеку. Подскажите пожалуйста, какой функцией можно нарисовать...

Нарисовать дугу в паскале
uses graph; var g,m:integer; begin g:=detect; initgraph(g,m,'x:/bp'); setcolor(8); ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru