(VBA, Excel) Сортировка точек стены по часовой стрелке, начиная с произвольной точки - PullRequest
0 голосов
/ 05 марта 2019

Я новичок здесь и также относительно новичок в VBA.Я боролся с этой проблемой некоторое время и не могу найти решение.У меня есть точки, которые соответствуют либо конечной точке стены, либо пересечению стены (показано на прикрепленном изображении).

Points

enter code here

Мне нужночтобы превратить эту информацию в точки вдоль границы стенки (от заданной толщины стенки), отсортированные по часовой стрелке от произвольной точки.См. Прикрепленное изображение.

Goal

Мне удалось создать точки на границах (очень приблизительно), сжимая каждый узел на половину толщины стенкии затем перемещая каждый результирующий узел «из стороны в сторону» в перпендикулярном направлении на половину толщины стенки.

Данные, которые у меня есть, показывают пары узлов для каждой линии.Эти пары соединений типа «AtoB» существуют от узла к узлу и не пересекаются с пересечением.Любые предложения или помощь будет принята с благодарностью.Я немного застрял.Спасибо!J

Ниже приведена выходная информация для стены в форме буквы "L": введите описание изображения здесь

Затем я беру координаты XY и сдвигаю их:

ReDim CoordsArr(9, 3) '10 Walls total available per pier

''' Store coord in variables '''
For coordrow = 0 To Counter - 2
CoordsArr(coordrow, 0) = Cells(24 + coordrow, 5)
CoordsArr(coordrow, 1) = Cells(24 + coordrow, 6)
CoordsArr(coordrow, 2) = Cells(24 + coordrow, 8)
CoordsArr(coordrow, 3) = Cells(24 + coordrow, 9)
Next coordrow
''' Generate New Corner Points '''
ReDim POINTS_XY(19, 7) 'Array as (x1,y1,x2,y2,x3,y3,x4,y4) for points 
'above and below CL
For coordrow = 0 To Counter - 2
If Abs(CoordsArr(coordrow, 3) - CoordsArr(coordrow, 1)) = 0 Then
If CoordsArr(coordrow, 0) < CoordsArr(coordrow, 2) Then
XnewL = CoordsArr(coordrow, 0) + thick / 2
XnewR = CoordsArr(coordrow, 2) - thick / 2
POINTS_XY(coordrow, 0) = XnewL
POINTS_XY(coordrow, 1) = thick / 2
POINTS_XY(coordrow, 2) = XnewL
POINTS_XY(coordrow, 3) = -thick / 2
POINTS_XY(coordrow, 4) = XnewR
POINTS_XY(coordrow, 5) = thick / 2
POINTS_XY(coordrow, 6) = XnewR
POINTS_XY(coordrow, 7) = -thick / 2
ElseIf CoordsArr(coordrow, 0) > CoordsArr(coordrow, 2) Then
XnewL = CoordsArr(coordrow, 0) - thick / 2
XnewR = CoordsArr(coordrow, 2) + thick / 2
POINTS_XY(coordrow, 0) = XnewL
POINTS_XY(coordrow, 1) = thick / 2
POINTS_XY(coordrow, 2) = XnewL
POINTS_XY(coordrow, 3) = -thick / 2
POINTS_XY(coordrow, 4) = XnewR
POINTS_XY(coordrow, 5) = thick / 2
POINTS_XY(coordrow, 6) = XnewR
POINTS_XY(coordrow, 7) = -thick / 2
End If
ElseIf Abs(CoordsArr(coordrow, 2) - CoordsArr(coordrow, 0)) = 0 Then
If CoordsArr(coordrow, 1) < CoordsArr(coordrow, 3) Then
YnewD = CoordsArr(coordrow, 1) + thick / 2
YnewU = CoordsArr(coordrow, 3) - thick / 2
POINTS_XY(coordrow, 0) = -thick / 2
POINTS_XY(coordrow, 1) = YnewD
POINTS_XY(coordrow, 2) = thick / 2
POINTS_XY(coordrow, 3) = YnewD
POINTS_XY(coordrow, 4) = -thick / 2
POINTS_XY(coordrow, 5) = YnewU
POINTS_XY(coordrow, 6) = thick / 2
POINTS_XY(coordrow, 7) = YnewU
ElseIf CoordsArr(coordrow, 1) > CoordsArr(coordrow, 3) Then
YnewD = CoordsArr(coordrow, 1) - thick / 2
YnewU = CoordsArr(coordrow, 3) + thick / 2
POINTS_XY(coordrow, 0) = -thick / 2
POINTS_XY(coordrow, 1) = YnewD
POINTS_XY(coordrow, 2) = thick / 2
POINTS_XY(coordrow, 3) = YnewD
POINTS_XY(coordrow, 4) = -thick / 2
POINTS_XY(coordrow, 5) = YnewU
POINTS_XY(coordrow, 6) = thick / 2
POINTS_XY(coordrow, 7) = YnewU
End If
End If
Next coordrow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...