Тема: Как определить "прогиб" линий на AcadPolyline?

дравствуйте,
пишу приложение на vba, необходимо установить прогиб линии для образования дуги в объекте AcadPolyline...
вопрос скорее из геометрии
как высчитатть коэф изгиба для метода SetBulge если известны координаты концов дуги и координаты точки лежащей на дуге?
писибо =)

Re: Как определить "прогиб" линий на AcadPolyline?

http://www.theswamp.org/index.php?page=18

Re: Как определить "прогиб" линий на AcadPolyline?

мое решение задачи, возможно не оптимальное и грубое, но зато работает =)) :
Private Function GetBuldge(point1 As GEO_POINT, point2 As GEO_POINT, pointOnArc As GEO_POINT) As Double
    Dim delta As Double
    delta = 2 * ((point1.X - point2.X) * (point1.Y - pointOnArc.Y) - (point1.X - pointOnArc.X) * (point1.Y - point2.Y))
    If (delta = 0) Then GetBuldge = 0: Exit Function
    Dim p2 As Double
    p2 = point1.X ^ 2 - point2.X ^ 2 + point1.Y ^ 2 - point2.Y ^ 2
    Dim p3 As Double
    p3 = point1.X ^ 2 - pointOnArc.X ^ 2 + point1.Y ^ 2 - pointOnArc.Y ^ 2
    Dim X As Double: Dim Y As Double
    X = (p2 * (point1.Y - pointOnArc.Y) - p3 * (point1.Y - point2.Y)) / delta
    Y = (p3 * (point1.X - point2.X) - p2 * (point1.X - pointOnArc.X)) / delta
    Dim R As Double
    R = Sqr((point1.X - X) ^ 2 + (point1.Y - Y) ^ 2)
    'R^2=Di^2+H2^2 so H2^2=R^2-Di^2 so H2=Sqr(R^2-Di^2)
    'H1 = R - H2
    'Bulge = H1 / Di
    Dim Di As Double
    Di = Sqr((point2.X - point1.X) ^ 2 + (point2.Y - point1.Y) ^ 2) / 2
    Dim h1 As Double: Dim h2 As Double
    h2 = Sqr(Abs(R ^ 2 - Di ^ 2))
    Dim sw As Double
    sw = Sqr(((point1.X + point2.X) / 2 - pointOnArc.X) ^ 2 + ((point1.Y + point2.Y) / 2 - pointOnArc.Y) ^ 2)
    If (sw > R) Then h1 = R + h2 Else h1 = R - h2
    Dim Bulge As Double
    Bulge = h1 / Di
    Dim vec As Double
    vec = (point2.X - point1.X) * (pointOnArc.Y - 0.5 * (point2.Y + point1.Y)) - (point2.Y - point1.Y) * (pointOnArc.X - 0.5 * (point2.X + point1.X))
    If (vec > 0) Then Bulge = -Bulge
    GetBuldge = Bulge
End Function

Re: Как определить "прогиб" линий на AcadPolyline?

да, GEO_POINT это структура
GEO_POINT{
double x
double y
}