Тема: Полигон ро часовой стрелке построен, или нет?
Подскажите пожалуста, как узнать полигон построен по часовой стрелке или против часовой?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Полигон ро часовой стрелке построен, или нет?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите пожалуста, как узнать полигон построен по часовой стрелке или против часовой?
Указать большое число сторон, например 1024, выбрать опцию Edge и насладиться зрелищем строительства 1024-стороннего многоугольника против часовой стрелки!
А посмотреть на плоскость многоугольника с другой стороны ?
> VK
Спроси у Алисы...
)))нАРОД Я ЛЮБЛЮ УЛЫБАТЬСЯ))), но может мне может подсказать что нить более существенное...может кто знает???
Я определяю по такому алгоритму:
1. Сканирую полилинию и нахожу самую левую точку (или одну из них)
2. По углу с этой вершиной определяю направление полилинии
Полилиния должна быть не самопересекающаяся
По углу с этой вершиной
какой угол вы имеете в виду ? И что это даёт для определения направления ?
Помнится, была здесь тема по определению направления поворота линии в вершине (влево/вправо)... Кажется должно подойти для этой проблемы.
Что касается полигона... Вобще то такого примитива в АКАДе нет. Есть полилиния. Если рассматривать только полилинии, полученные командой МНОГОУГОЛЬНИК, то скорей всего можно проанализировать их Z-вектор (группа 210 DXF) и на основании > Leonid (2005-01-31 21:43:07) сделать вывод о направлении... Ну, это предположение, не более
Разъясняю пунк 2
Береться найденая точка, а так же предыдущая и следующая (конечно пропускаются отрезки с нулевой длинной) знак этого угола с вершиной в найденой точке и определяет направление обхода полилинии.
Алгоритм может быть не лучший, интересно услышать другие решения
Алгоритм может быть не лучший, интересно услышать другие решения
Для полилинии алгоритм реализованый на Лиспе есть тут:
https://www.caduser.ru/forum/topic12649.html
при желании, наверное, можно сделать аналог и на VBA.
а уже на VBA есть тут:
https://www.caduser.ru/forum/topic7724.html
но оценить, насколько это разумно - не могу, по причине того, что VBA знаю еле-еле.
> Leonid R.
углами я пробовал год назад, запутался страшно, помню, выкрутился установкой UCS по полилинии, а как дальше - не помню уже.
> ЯR
Спасибо за коды.
Да, хорошо. Единственное замечание, я бы добавил обработку не замкнутой полилинии.
Вот что в итог получилось у меня))
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 ' ïðîòèâ ÷àñîâîé
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
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Полигон ро часовой стрелке построен, или нет?
Форум работает на PunBB, при поддержке Informer Technologies, Inc