Страницы: 1 2 3 След.
RSS
Как убрать замыкание ломаной линии
 
Здравствуйте, форумчане.
Помогите разобраться с непростым вопросом.

Макрос рисует параллельную линию, но в конце - замыкает ее, так что получается контур.
В результате - получается не полное подобие.
И кроме того - Начало и конец рисуемой линии - более удлинены, по сравнению с оригиналом.
Отрезки должны быть - одинаковыми по длине.

Как поправить макрос, чтобы рисуемая линия не замыкалась и чтобы все отрезки - рисуемой линии по длине совпадали бы с оригиналом ?
 
Макрос поправить не возьмусь, но могу порекомендовать заглянуть в похожую тему на форуме
Получить подобие ломаной кривой, в плоскости
Возможно что-нибудь покажется Вам интересным
 
IKor, это вообще не по моей теме.
 
Цитата
SkyGreen написал:
не по моей теме
Вам виднее, но я бы на Вашем месте внимательно присмотрелся к предложениям Игоря Гончаренко. Особенно в посте №37
 
Цитата
SkyGreen написал:
это вообще не по моей теме.
Странно, а по описанию именно то что Вам надо.  Вы взяли Макрос, которые рассчитан на замкнутый контур. По этому и результат получается замкнуты, при этом искажается длина краевых отрезков. А вот сохранить длины остальных отрезков при равных отступах от оригинала  - невозможно . Это тоже обсуждалось в теме по указанной ссылке.
По вопросам из тем форума, личку не читаю.
 
Ясно.
Как тогда хотя бы - сделать линию - незамыкающейся ?
 
Доброе время суток
Цитата
SkyGreen написал:
Макрос рисует параллельную линию, но в конце - замыкает ее, так что получается контур.
Это ваш макрос? Если да, то достаточно поправить Sub GetPolylinePoints, изменив размерность ReDim polyPoints(1 To n) вместо ReDim polyPoints(1 To n + 1) и не записывать в последнюю точку координаты первой (признак замыкания).
 
Андрей VG, Только вот название темы надо записать как …. Я вот думал Параллельная поли-линия рисуется не так как надо, Но вот пытался предствить параллельную поли-линию и сдался :-).
По вопросам из тем форума, личку не читаю.
 
Цитата
Андрей VG написал:
достаточно поправить Sub GetPolylinePoints, изменив размерность ReDim polyPoints(1 To n) вместо ReDim polyPoints(1 To n + 1) и не записывать в последнюю точку координаты первой (признак замыкания).

Изменил.
Код
Sub GetPolylinePoints(ByVal shp As Shape, ByRef n As Long, ByRef polyPoints() As GeomPoint)
    Dim nds As ShapeNodes, nd As ShapeNode
    Dim dx As Double, dy As Double, d As Double
    Dim i As Long, j As Long
    Set nds = shp.Nodes
    n = nds.Count
    ReDim polyPoints(1 To n)
    For i = 1 To n
        Set nd = nds(i)
        polyPoints(i).x = nd.Points(1, 1)
        polyPoints(i).y = nd.Points(1, 2)
    Next
    polyPoints(n + 1).x = polyPoints(1).x
    polyPoints(n + 1).y = polyPoints(1).y
    For i = n To 1 Step -1
        dx = polyPoints(i).x - polyPoints(i + 1).x
        dy = polyPoints(i).y - polyPoints(i + 1).y
        If dx * dx + dy * dy < 1 Then
            For j = i To n
                polyPoints(i).x = polyPoints(i + 1).x
                polyPoints(i).y = polyPoints(i + 1).y
            Next
            n = n - 1
        End If
    Next
    ReDim Preserve polyPoints(1 To n)
End Sub
Что-то пока не работает.
 
Цитата
SkyGreen написал:
Что-то пока не работает.
И даже нечто сообщает - почему. Но вы настолько застенчивы, чтобы показать это сообщение?
Было написано
Цитата
Андрей VG написал:
и не записывать в последнюю точку координаты первой (признак замыкания).
Тогда почему в коде присутствует?
Цитата
SkyGreen написал:
   polyPoints(n + 1).x = polyPoints(1).x
   polyPoints(n + 1).y = polyPoints(1).y
 
Цитата
SkyGreen написал:
IKor , это вообще не по моей теме
Оff. Не нашел пользователя с фамилией Лобачевский. :)  
Владимир
 
Цитата
Андрей VG написал:
Тогда почему в коде присутствует?:    polyPoints(n + 1).x = polyPoints(1).x    polyPoints(n + 1).y = polyPoints(1).y

Я убрал этот элемент.
И теперь код выглядит так:
Код
Sub GetPolylinePoints(ByVal shp As Shape, ByRef n As Long, ByRef polyPoints() As GeomPoint)
    Dim nds As ShapeNodes, nd As ShapeNode
    Dim dx As Double, dy As Double, d As Double
    Dim i As Long, j As Long
    Set nds = shp.Nodes
    n = nds.Count
    ReDim polyPoints(1 To n)
    For i = 1 To n
        Set nd = nds(i)
        polyPoints(i).x = nd.Points(1, 1)
        polyPoints(i).y = nd.Points(1, 2)
    Next
    'polyPoints(n + 1).x = polyPoints(1).x
    'polyPoints(n + 1).y = polyPoints(1).y
    For i = n To 1 Step -1
        dx = polyPoints(i).x - polyPoints(i + 1).x
        dy = polyPoints(i).y - polyPoints(i + 1).y
        If dx * dx + dy * dy < 1 Then
            For j = i To n
                polyPoints(i).x = polyPoints(i + 1).x
                polyPoints(i).y = polyPoints(i + 1).y
            Next
            n = n - 1
        End If
    Next
    ReDim Preserve polyPoints(1 To n)
End Sub
Но он по-прежнему не работает.
Изменено: SkyGreen - 28.09.2019 08:09:23
 
Выручайте, форумчане.
 
 а можете сформулировать и описать задачу, которую решаете?
на всякий случай напомню, в каждой задаче программист должен точно понимать ответы на 3 вопроса:
1. исходные данные
2. результат
3. алгоритм*
* алгоритм требуется если это что-то особенное, специфическое, не являющееся общеизвестным способом и должно пояснять как из исходных данных получить  результаты
Изменено: Ігор Гончаренко - 28.09.2019 14:55:20
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
а можете сформулировать и описать задачу, которую решаете?
Так, а что формулировать?
Я в общем-то в первом сообщении ее описал. Сделать так, чтобы линия не зацикливалась - и все.
Вот один форумчанин дал совет:
Цитата
Андрей VG написал:
Тогда почему в коде присутствует?   polyPoints(n + 1).x = polyPoints(1).x    polyPoints(n + 1).y = polyPoints(1).y
Я убрал - этот кусок кода.
Но ошибка все равно появляется - и линия не чертится.

Я и спрашиваю - как так, почему не срабатывает эта технология ?
 
не хотите описать задачу - решайте ее самостоятельно, через некоторое время разберетесь со всеми проблемами, возникшими в ходе решения
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
SkyGreen написал:
Я в общем-то в первом сообщении ее описал
Вам и ответили. Тут ситуация ровно как в этом анекдоте :)
 
Андрей VG, да хороший анекдот.

А все-таки почему код не работает ?
Подскажите - может еще что-то в нем изменить.
 
Цитата
SkyGreen написал:
А все-таки почему код не работает ?
Просто не в том месте подсказал произвести изменения. Приношу свои извинения. А в том где нужно, простое изменение размерности не проходит - первая точка формируемого массива точек создаваемой полилинии вторая (по крайней мере для текущего примера) в массиве точек исходной. Так что устранение замыкания не приводит к нужному результату. Вникать же в код, увы, нет желания.
 
Андрей VG, я в Вас верю.
Вы сможете помочь.
(Ну хотя бы в теории - что нужно поменять, чтобы заработало?)
Изменено: SkyGreen - 28.09.2019 20:57:22
 
Цитата
SkyGreen написал:
я в Вас верю.
Вернёмся к исходной постановке задачи.
Цитата
SkyGreen написал:
Макрос рисует параллельную линию, но в конце - замыкает ее, так что получается контур.
В результате - получается не полное подобие.
И кроме того - Начало и конец рисуемой линии - более удлинены, по сравнению с оригиналом.
Отрезки должны быть - одинаковыми по длине.
Следовательно, представленное решение не удовлетворяет поставленным условиям - смысл его разбирать?
Так как единственным требованием в постановке задачи является выделенное, то примем за определение параллельности двух ломаных такое определение. Две ломанные параллельны, если параллельны их соответствующие отрезки.
Изменено: Андрей VG - 29.09.2019 09:28:29
 
Андрей VG, вы просто делаете копию фигуры - это вообще не по моему вопросу.
А я же спросил просто - как убрать замыкание фигуры в конце построения - в имеющемся макросе.
Цитата
SkyGreen написал:
Как хотя бы - сделать линию - незамыкающейся ?
 
Цитата
SkyGreen написал:
вы просто делаете копию фигуры - это вообще не по моему вопросу.
Как раз по тому вопросу, который был описан в первом посте, это
Цитата
SkyGreen написал:
Как поправить макрос, чтобы рисуемая линия не замыкалась и чтобы все отрезки - рисуемой линии по длине совпадали бы с оригиналом ?
и то что выше там же в первом посте - решено представленным мною макросом. Нет замыкания, все отрезки рисуемой линии по длине совпадают с оригиналом.
Если из требований осталось только - редактирование макроса, чтобы исключить замыкание. То это нужно отразить и в первом посте и в названии темы (обратитесь к модераторам с новым названием темы). Тогда будет понятно, что нужно делать на самом деле, а не рыскать по всему обсуждению, чтобы найти, что на самом деле требования изменились. Порядок - он прежде всего :)
 
Тезка, привет!
ТС явно нужно смещение векторов, однако
Цитата
SkyGreen написал:
это вообще не по моей теме.

Зачем думать? Трясти надо! :D
 
И да, чуть подумаю за вас, SkyGreen. Вас будет устраивать решение с исключением замыкания для случая - исходная синяя ломаная, а результат красная пунктирная (смещение 20, левое правило)?
 
Андрей VG, так тут же опять идет такое же замыкание.
 
Цитата
SkyGreen написал:
так тут же опять идет такое же замыкание.
вопрос был не о замыкании - учитесь отвечать на вопросы.
Добавил смещение 30 - зелёное, 50 - фиолетовое. Вас устраивает такой результат из исходной синей?
 
Цитата
SkyGreen написал:
Параллельная линия рисуется неточно
Все ж меня интересует что значит рисуется неточно. Я б на месте Модераторов давно б закрыл тему. Не точно - это когда координаты верны, а рисует с отклонением от них. Если брать макрос для другой задачи и говорить что он не делает того что хочется, то …...
По вопросам из тем форума, личку не читаю.
 
Цитата
Андрей VG написал:
вопрос был не о замыкании
Нет, вопрос именно о замыкании.

Результат макроса который вы приводите - в точности такой же, какой приложил к первой теме я.
Рисуется линия, и в конце она замыкается.
Я уже несколько раз задавал один и тот же вопрос - как сделать так, чтобы эта линия не замыкалась ?
 
Цитата
SkyGreen написал:
Как поправить макрос, чтобы рисуемая линия не замыкалась?
Вот - я же написал еще в первом сообщении - в чем суть вопроса:
В том, что линия замыкается в конце.
Страницы: 1 2 3 След.
Наверх