Тема: Полигон ро часовой стрелке построен, или нет?

Подскажите пожалуста, как узнать полигон построен по часовой стрелке или против часовой?

Re: Полигон ро часовой стрелке построен, или нет?

Указать большое число сторон, например 1024, выбрать опцию Edge и насладиться зрелищем строительства 1024-стороннего многоугольника против часовой стрелки!

Re: Полигон ро часовой стрелке построен, или нет?

А посмотреть на плоскость многоугольника с другой стороны ? wink

Re: Полигон ро часовой стрелке построен, или нет?

> VK
Спроси у Алисы...

Re: Полигон ро часовой стрелке построен, или нет?

)))нАРОД Я ЛЮБЛЮ УЛЫБАТЬСЯ))), но может мне может подсказать что нить более существенное...может кто знает???

Re: Полигон ро часовой стрелке построен, или нет?

Я определяю по такому алгоритму:
1. Сканирую полилинию и нахожу самую левую точку (или одну из них)
2. По углу с этой вершиной определяю направление полилинии
Полилиния должна быть не самопересекающаяся

Re: Полигон ро часовой стрелке построен, или нет?

Leonid R. пишет:

По углу с этой вершиной

какой угол вы имеете в виду ? И что это даёт для определения направления ?

Re: Полигон ро часовой стрелке построен, или нет?

Помнится, была здесь тема по определению направления поворота линии в вершине (влево/вправо)... Кажется должно подойти для этой  проблемы.
Что касается полигона... Вобще то такого примитива в АКАДе нет. Есть полилиния. Если рассматривать только полилинии, полученные командой МНОГОУГОЛЬНИК, то скорей всего можно проанализировать их Z-вектор (группа 210 DXF) и на основании > Leonid (2005-01-31 21:43:07) сделать вывод о направлении... Ну, это предположение, не более

Re: Полигон ро часовой стрелке построен, или нет?

Разъясняю пунк 2
Береться найденая точка, а так же предыдущая и следующая (конечно пропускаются отрезки с нулевой длинной) знак этого угола с вершиной в найденой точке и определяет направление обхода полилинии.
Алгоритм может быть не лучший, интересно услышать другие решения

Re: Полигон ро часовой стрелке построен, или нет?

Leonid R. пишет:

Алгоритм может быть не лучший, интересно услышать другие решения

Для полилинии алгоритм реализованый на Лиспе есть тут:
https://www.caduser.ru/forum/topic12649.html
при желании, наверное, можно сделать аналог и на VBA.
а уже на VBA есть тут:
https://www.caduser.ru/forum/topic7724.html
но оценить, насколько это разумно - не могу, по причине того, что VBA знаю еле-еле.

Re: Полигон ро часовой стрелке построен, или нет?

> Leonid R.
углами я пробовал год назад, запутался страшно, помню, выкрутился установкой UCS по полилинии, а как дальше - не помню уже.

Re: Полигон ро часовой стрелке построен, или нет?

> ЯR
Спасибо за коды.

Re: Полигон ро часовой стрелке построен, или нет?

Да, хорошо. Единственное замечание, я бы добавил обработку не замкнутой полилинии.

Re: Полигон ро часовой стрелке построен, или нет?

Вот что в итог получилось у меня))
1.Clear_VRT чистит полигон от "лишних" точек
2.get_dir определяет направление линии
3.revers реверсирует линию
Замкнутый полигон или нет не важно ...
Public Sub Clear_VRT()
Dim AcObj As AcadEntity
Dim AcSelObj As AcadSelectionSet
Dim VRT() As Double
Dim Lpoint() As Double
Dim i As Integer, k As Integer, p As Integer
Dim FL_point As Boolean
'On Error Resume Next
Set AcSelObj = Select_Obj("lwpolyline", "?", "1")
For Each AcObj In AcSelObj
    p = 1
    VRT = AcObj.Coordinate(0)
    ReDim Preserve Lpoint(p)
    Lpoint(p - 1) = VRT(0)
    Lpoint(p) = VRT(1)
    p = p + 2
    For i = 1 To (UBound(AcObj.Coordinates) + 1) / 2 - 1
        FL_point = False
        VRT = AcObj.Coordinate(i)
        For k = 0 To UBound(Lpoint) Step 2
               If Round(VRT(0), 8) = Round(Lpoint(k), 8) And _
                  Round(VRT(1), 8) = Round(Lpoint(k + 1), 8) Then
                  FL_point = True
               End If
        Next
         If FL_point = False Then
                  ReDim Preserve Lpoint(p)
                  Lpoint(p - 1) = VRT(0)
                  Lpoint(p) = VRT(1)
                  p = p + 2
        End If
    Next
    Dim AcLWPol As AcadLWPolyline
    Set AcLWPol = ThisDrawing.ModelSpace.AddLightWeightPolyline(Lpoint)
    AcLWPol.Layer = AcObj.Layer
    AcLWPol.Linetype = AcObj.Linetype
    AcLWPol.Lineweight = AcObj.Lineweight
    AcLWPol.color = AcObj.color
    AcLWPol.Closed = AcObj.Closed
    If get_dir(AcLWPol) = True Then
        revers AcLWPol
    End If
    AcObj.Delete
Next
AcSelObj.Delete
End Sub
Private Function get_dir(ByVal pl As AcadLWPolyline) As Boolean
        Dim s As Double
        Dim i As Integer
            Dim VRR As Integer
            VRR = (UBound(pl.Coordinates) + 1) / 2 - 1
            For i = 0 To VRR
                If i = 0 Then
                s = s + (pl.Coordinate(i + 1)(0) - pl.Coordinate(VRR)(0)) * pl.Coordinate(i)(1)
                ElseIf i = VRR Then
                s = s + (pl.Coordinate(0)(0) - pl.Coordinate(i - 1)(0)) * pl.Coordinate(i)(1)
                Else
                s = s + (pl.Coordinate(i + 1)(0) - pl.Coordinate(i - 1)(0)) * pl.Coordinate(i)(1)
                End If
            Next
            s = s / 2
        If s > 0 Then
            get_dir = False ' ïî ÷àñîâîé
        ElseIf s < 0 Then
            get_dir = True ' &#239;&#240;&#238;&#242;&#232;&#226; &#247;&#224;&#241;&#238;&#226;&#238;&#233;
        End If
    End Function
Private Sub revers(PLobj As AcadLWPolyline)
Dim polig As Variant
Dim coord(1) As Double
Dim i As Integer, k As Integer
polig = PLobj.Coordinates
k = 0
For i = UBound(polig) To 0 Step -2
coord(0) = polig(i - 1)
coord(1) = polig(i)
PLobj.Coordinate(k) = coord
k = k + 1
Next
End Sub