кривая Безье

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alexmckey
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 25.04.2005 (Пн) 17:35

кривая Безье

Сообщение alexmckey » 16.12.2005 (Пт) 4:12

кто-нибудь может подсказать,как получить координаты точек,через которые проходит кривая Безье
mckey

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 16.12.2005 (Пт) 7:09


alexmckey
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 25.04.2005 (Пн) 17:35

Сообщение alexmckey » 16.12.2005 (Пт) 22:15

мне нужно определить координаты всех точек на кривой,построенной функцией API PolyBezier
mckey

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 17.12.2005 (Сб) 3:29

Ну, если координаты всех точек, то тогда задача сводится к перечислению всех элементов континуального множества, а это невозможно по определению. Или тебе с точностью до одного пикселя? Тогда придется определить, какой пиксель меньше всех.

За теорией можно слазать, к примеру, сюда.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.12.2005 (Сб) 12:53

Я бы сказал, что точки аппроксимации отрезками можно получить примерно так... А все остальные между ними находятся алгоритмом Брезенхема. Или просто :)

Код: Выделить всё
Option Explicit

Private Declare Function BeginPath Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function EndPath Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function PolyBezierTo Lib "gdi32.dll" (ByVal hdc As Long, ByRef lppt As POINT, ByVal cPoints As Long) As Long
Private Declare Function PolyBezier Lib "gdi32.dll" (ByVal hdc As Long, ByRef lppt As POINT, ByVal cPoints As Long) As Long
Private Declare Function MoveToEx Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByRef lpPoint As Any) As Long
Private Declare Function FlattenPath Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function GetPath Lib "gdi32.dll" (ByVal hdc As Long, ByRef lpPoint As Any, ByRef lpTypes As Any, ByVal nSize As Long) As Long

Private Type POINT
  x As Long
  y As Long
End Type

Private Sub Form_DblClick()
  Dim p(1 To 4) As POINT, b() As Byte, i As Long, out() As POINT
 
  With p(1): .x = 100: .y = 100: End With
  With p(2): .x = 200: .y = 300: End With
  With p(3): .x = 300: .y = 100: End With
  With p(4): .x = 400: .y = 200: End With
 
  BeginPath Me.hdc
 
  MoveToEx Me.hdc, p(1).x, p(1).y, ByVal 0&
  PolyBezierTo Me.hdc, p(LBound(p) + 1), UBound(p) - LBound(p)
 
  EndPath Me.hdc
  FlattenPath Me.hdc
 
  ReDim out(1 To GetPath(Me.hdc, ByVal 0&, ByVal 0&, 0))
  ReDim b(LBound(out) To UBound(out))
 
  GetPath Me.hdc, out(LBound(out)), b(LBound(b)), UBound(b) - LBound(b) + 1
 
  'Собственно, на этом всё.
  'Визуализация.
 
  PolyBezier Me.hdc, p(LBound(p)), UBound(p) - LBound(p) + 1
 
  For i = LBound(out) To UBound(out)
    Me.PSet (out(i).x, out(i).y), vbRed
  Next
End Sub

Private Sub Form_Load()
  Me.ScaleMode = vbPixels
  Me.AutoRedraw = False
  Me.Caption = "Doubleclick me"
  Me.Width = 6975
  Me.Height = 5025
  Me.ForeColor = vbWhite
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 179

    TopList