Мат/ модель эллипса, её отрисовка в 2д и IsPointInEllipse

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Мат/ модель эллипса, её отрисовка в 2д и IsPointInEllipse

Сообщение xenomorph » 08.01.2014 (Ср) 3:09

Доброго локального времени, уважаемое сообщество!
С НГ и РХ!

Столкнулся с следующей проблемой и прошу совета\помощи.

Задача: написать класс vb.net который задаёт эллипс в 2д с углом отклонения.

Матчасть: http://ru.wikipedia.org/wiki/%D0%AD%D0% ... 0%BF%D1%81
и
http://en.wikipedia.org/wiki/Ellipse

Каноническое уравнение:
Код: Выделить всё
(X^2)/(10^2) + (Y^2)/(5^2) = 1


Отрисовка Вольфрамом Альфа:
[url]http://www.wolframalpha.com/input/?i=%28X^2%29%2F%2810^2%29+%2B+%28Y^2%29%2F%285^2%29+%3D+1[/url]

Входящие данные:

1) ХY - координаты центра эллипса.
2) АB - длинна осей (полуосей).
3) ??? - мне нужно задать угол поворота всего эллипса (собственно "как" это сделать, пока не очень понимаю).

Что мне нужно на выходе:
1. Класс cls_Ellipse с углом отклонения.
2. Функция IsPointInEllipse(p as Point) as Boolean.
3. Процедура отрисовки его в 2д на битмап. (именно "с поворотом").

Отрисовка с поворотом достаточна тривиальна:

Код: Выделить всё
Public Sub _draw_me(ByRef bm As Bitmap)
            Dim p As New Pen(Brushes.Red)
            Dim g As Graphics = Graphics.FromImage(bm)
            Dim r As New Rectangle(0, 0, 180, 60)
            g.RotateTransform(40)
            g.DrawEllipse(Pens.Red, r)
End Sub


Вопрос в том, как отразить это в Мат формуле??

==============================================
Мне нужна мат. формула эллипса с углом наклона, и
функция IsPointInEllipse(p as Point) as Boolean.
==============================================

Что я нашёл по теме:

http://math.stackexchange.com/questions ... and-the-ot

По ссылке - детальные трансформации формул с объясниниями.
--
Заранее спасибо за любую помощь!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re: Мат/ модель эллипса, её отрисовка в 2д и IsPointInEllips

Сообщение xenomorph » 08.01.2014 (Ср) 3:23

Ну, пока никого нет - я с лопатой копаю дальше :-).

http://www.physicsforums.com/showthread.php?t=448289

Обнаружил параметрическую формулу того, что мне надо.

x = b cos t
y = a sin t

Read more: http://www.physicsforums.com

Но я слабо представляю, как это реализовать в коде ((.
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Мат/ модель эллипса, её отрисовка в 2д и IsPointInEllips

Сообщение pronto » 08.01.2014 (Ср) 6:19

Делать поворот точки удобнее всего в полярных координатах
Код: Выделить всё
C = Cos(alpha): S = Sin(alpha)

Do
   x1 = r1 * Cos(F)
   y1 = r2 * Sin(F)

   x2 = x1 * C + y1 * S + cx
   y2 = y1 * C - x1 * S + cy
   F = F + pi/90
   If F >= 2pi Then Exit Do
   Picture1.Line -(x2, y2), vbBlack
Loop

Где:
alpha — угол поворота всей фигуры
x1, y1 — координаты точки на линии эллипса
x2, y2 — координаты точки на линии эллипса после поворота на угол alpha
F — угол точки на линии эллипса
cx, cy — координаты центра вращения
O, sancta simplicitas!

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re: Мат/ модель эллипса, её отрисовка в 2д и IsPointInEllips

Сообщение xenomorph » 09.01.2014 (Чт) 3:39

2pronto - Спасибо большое!
Но я, видимо, прогулял эту часть алгебры в школе :( .

Я пересмотрел раздел вики по полярным координатам, и понял, что надо изучать матчасть.

Поскольку я продолжил копать самостоятельно - я нашёл все решения своим вопросам,
и делюсь ответами (а вдруг, кому-то пригодится!):

--
1. Разворот точки в системе координат по 0:0:

Код: Выделить всё
Public Function RotatePoint(ByVal dbl_Angle As Double, ByVal p As Point) As Point
        '
        'theory: http://stackoverflow.com/questions/5180685/get-coordinates-after-rotation
        '
        Dim a As Double = dbl_Angle * System.Math.PI / 180.0
        Dim dbl_CosA As Double = Math.Cos(a)
        Dim dbl_SinA As Double = Math.Sin(a)
        Dim pt_FPoint As Point = New Point(p.X * dbl_CosA - p.Y * dbl_SinA, p.X * dbl_SinA + p.Y * dbl_CosA)
        Return pt_FPoint
        '
End Function


2. Ответ на вопрос "Лежит ли точка в эллипсе?" решается с помощью одного из
свойств эллипса, а именно: "The sum of the distances from any point P on the ellipse to those two foci is constant and equal to the major axis (PF1 + PF2 = 2a)."

http://en.wikipedia.org/wiki/Ellipse

Таким образом, _isPoint_InEllipse() просчитывается в 2 этапа:
1. Находим координаты обоих Фокусов эллипса.
2. Проверяем Евклидово расстояние.

Код: Выделить всё
Public Function _isPoint_InEllipse(ByVal p As Point) As Boolean
        '
        'http://mathforum.org/library/drmath/view/63045.html
        '|P - C1| + |P - C2| < 2a
        '
        _countEllipseFocusesLocation()
        '
        Dim f1d As Double = _euc_Distance_int(p, Me.p_F1)
        Dim f2d As Double = _euc_Distance_int(p, Me.p_F2)
        '
        Dim i_MajorAxisLength As Integer = 0
        If Me.i_XRadius > Me.i_YRadius Then
            i_MajorAxisLength = Me.i_XRadius
        Else
            i_MajorAxisLength = Me.i_YRadius
        End If

        If f1d + f2d < 2 * i_MajorAxisLength Then
            Return True
        Else
            Return False
        End If
        '
End Function


Код: Выделить всё
Private Sub _countEllipseFocusesLocation()
        '
        'theory: http://www.mathopenref.com/ellipsefoci.html
        'practical: http://www.algebra.com/algebra/homework/Quadratic-relations-and-conic-sections.faq.question.300296.html
        '
        Dim i_FDistance As Integer = 0 'angle invariant:
        If Me.i_YRadius < Me.i_XRadius Then
            i_FDistance = Math.Sqrt(Me.i_XRadius ^ 2 - Me.i_YRadius ^ 2)
        Else
            i_FDistance = Math.Sqrt(Me.i_YRadius ^ 2 - Me.i_XRadius ^ 2)
        End If
        '
        'count foci coordinates:
        '(plain - no transform:)
        p_F1.X = 0
        p_F1.Y = i_FDistance
        p_F1 = RotatePoint(Me.i_Angle, p_F1)
        '
        p_F2.X = 0
        p_F2.Y = -i_FDistance
        '
        'transform to absolute:
        p_F2 = RotatePoint(Me.i_Angle, p_F2)
        '
        _AdjustAbsoluteLocation(p_F1)
        _AdjustAbsoluteLocation(p_F2)
        '
End Sub


Исходный код с угловыми трансформациями и графиком - прилагается.

p.s. При проходе мышки по Картинке с эллипсом в текстовом поле будет отображаться текущая
координата и "Да\Нет" результат от функции "_IsPointInEllipse".
--
Всем Спасибо!
Вложения
dev_Ellipse.rar
(53.2 Кб) Скачиваний: 214
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Мат/ модель эллипса, её отрисовка в 2д и IsPointInEllips

Сообщение pronto » 09.01.2014 (Чт) 6:11

Большое пожалуйста! :)
Скажи, а принадлежность точки эллипсу твоим методом корректно определяется, если он повёрнут?
PS Да, сам проверил...
O, sancta simplicitas!


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38

    TopList