[CDR X5-X8] при пакетной обработке не всегда видится шейп (Непредсказуемый IsOnShape)

Статус
Закрыто для дальнейших ответов.

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
Вот тоже столкнулся с этой проблемой - автору как-то удалось достичь +/- стабильной работы функции? Или найти альтернативу?
я уже писал решение для этой проблемы. может не совсем красивое - но реально рабочее.
проверял уже раз 100 - ни разу небыло ошибок
...
лечится просто - увеличением масштаба до максимума, тогда граница "уменьшается" до минимума относительно текущего масштабного размера контура и в нее практически невозможно попасть....
 

ydobemos

Участник
Сообщения
50
Реакции
1
я уже писал решение для этой проблемы. может не совсем красивое - но реально рабочее.
проверял уже раз 100 - ни разу небыло ошибок
...
лечится просто - увеличением масштаба до максимума, тогда граница "уменьшается" до минимума относительно текущего масштабного размера контура и в нее практически невозможно попасть....

Спасибо за ответ.

Не слишком элегенатно, по этому и спросил. Надо будет проверить. Мне нужнен не совсем контур а как-раз точки внутри объекта.

Приближение делайте в коде, вроде ActiveWindow.ActiveView.SetViewPoint 0, 0, 32000 или вручную?
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
мне тоже нужна точка внутри объекта. таким образом мы минимизируем толщину контура.
приближение конечно же делаю кодом
Application.Optimization = True
ActiveWindow.ActiveView.Zoom = 260000
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
таким образом мы минимизируем толщину контура.
Не минимизируете толщину контура, а
где-то внутри растрируют шейп и проверяют на попадание в закрашенную область. Соответственно, реальный размер растрированного шейпа привязан к экранному, т.е. к текущему масштабу.
т.е увеличиваете точность за счет увеличения разрешения
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
не суть важно как это происходит )
толщина линии контура для расчетов становится меньше...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
толщина линии контура для расчетов становится меньше...
Ну если моя гипотеза верна ( а судя по всему, так и есть) то внутри алгоритма нет никакой линии контура
Есть наборы пикселов попадающих на границу контура, внутрь него и все остальные
 

ydobemos

Участник
Сообщения
50
Реакции
1
Гмм, все же не совсем помогает вроде. Я создаю функцию нахождения похожих объектов. Для этого происходит что-то вроде создания растра объекта (т.е. он делится на секторы и в каждом секторе мы проверяем попадает ли точка на объект). Если точка попадает то суммируется уникальный идентификатор.

Потом все объекты с одинаковыми идентификаторами выделяются.

Кодово это выглядит вот так:

Код:
Sub SelectSimilar()
    If CheckDoc(1) Then
   
        'boostStart "Index"
       
        ActiveWindow.ActiveView.Zoom = 32000
        Dim S As Shape
        Dim T As Shape
        Dim SR As New ShapeRange
        Dim TR As ShapeRange
        Dim A As Long
        Dim OurShape As Currency
        Set T = ActiveSelectionRange.Shapes.First
        SR.Add T
        Set TR = ActivePage.Shapes.All
        OurShape = SimilarityRating(T)
        ReDim Catalogue(TR.Count + 1, 2) As Currency
        For A = 1 To TR.Count
            Set S = TR(A)
            Catalogue(A, 1) = SimilarityRating(S)
            Catalogue(A, 2) = S.StaticID
            Debug.Print Catalogue(A, 1)
        Next A
        For A = 1 To TR.Count
            If Catalogue(A, 1) = OurShape Then
                Set S = ActivePage.FindShape(, , Catalogue(A, 2))
                If S.SizeHeight > T.SizeHeight * 0.5 And S.SizeHeight < T.SizeHeight * 1.5 And T.SizeWidth > S.SizeWidth * 0.5 And T.SizeWidth < S.SizeWidth * 1.5 Then
                SR.Add S
                End If
            End If
        Next A
        SR.CreateSelection
        ActiveWindow.ActiveView.ToFitSelection
        'boostFinish True
    End If
End Sub
Function SimilarityRating(S As Shape) As Currency
    Dim X As Double
    Dim Y As Double
    Dim Size As Double
    Dim Steps As Double
    Dim Gap As Double
    Steps = 6
    Dim Index As Currency
    Dim A As Byte
    Index = 0
    A = 0
    If S.SizeHeight > S.SizeWidth Then
        Size = S.SizeHeight
    Else
        Size = S.SizeWidth
    End If
    Gap = Size / Steps
    Size = Size - Gap
    Gap = Size / Steps
    For Y = 0 To Steps
        For X = 0 To Steps
            If S.IsOnShape((S.CenterX - Size / 2) + X * Gap, (S.CenterY - Size / 2) + Y * Gap, Gap * 0.5) Then
                'Debug, can comment out
                'ActiveLayer.CreateEllipse2 (S.CenterX - Size / 2) + X * Gap, (S.CenterY - Size / 2) + Y * Gap, Gap * 0.5
                Index = Index + 2 ^ A
            Else
                'Debug, can comment out
                'ActiveLayer.CreateEllipse2 (S.CenterX - Size / 2) + X * Gap, (S.CenterY - Size / 2) + Y * Gap, Gap / 8
            End If
            A = A + 1
        Next X
    Next Y
   
    'Debug, can comment out
    'ActiveLayer.CreateArtisticText S.LeftX, S.BottomY - 1, Index, , , , 32
    SimilarityRating = Index
End Function
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Совершенно порочный алгоритм
Лично я бы делал так - вычитал один контур из другого и считал площадь разницы
Как то так
 

ydobemos

Участник
Сообщения
50
Реакции
1
Совершенно порочный алгоритм
Может не будем сразу спешить с выводами?

Лично я бы делал так - вычитал один контур из другого и считал площадь разницы
Как то так
И как это поможет найти визуально похожие объекты разных размеров? Мне нужны как раз примерно похожие объекты - например форма Т, форма Г , форма О.

Добавил пример - должны выделиться все розовые объекты (их размеры, формы, число точек в кривой слегка отличаются).
 

Вложения

  • Example.png
    Example.png
    226.1 КБ · Просм.: 824
Последнее редактирование:

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
Ну если моя гипотеза верна ( а судя по всему, так и есть) то внутри алгоритма нет никакой линии контура
Есть наборы пикселов попадающих на границу контура, внутрь него и все остальные
ну да, но граница контура получается разной толщины, в зависимости от масштаба.
...
я обрабатываю по 2000 - 3000 тысяч объектов за раз. и пока сбоя не было, по крайней мере я не заметил.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
И как это поможет найти визуально похожие объекты разных размеров? Мне нужны как раз примерно похожие объекты - например форма Т, форма Г , форма О.
Видимо я чего-то не догоняю? Вы хэшируете объекты и сравниваете хэши - так?
А моим способом фактически то же самое, но точнее
Разумеется, размеры приводить к одному надо иначе никак
ну да, но граница контура получается разной толщины, в зависимости от масштаба.
Само понятие векторной границы лишено смысла в данном случае
 

ydobemos

Участник
Сообщения
50
Реакции
1
Видимо я чего-то не догоняю? Вы хэшируете объекты и сравниваете хэши - так?
А моим способом фактически то же самое, но точнее
Разумеется, размеры приводить к одному надо иначе никак

Если я правильно понял то по методу предлагаемому вами все фигуры в этой картинке "одинаковые", а также если в деталях разные мелкие детали (вроде текста по краям) это может влиять на результат.

Чем плохо визуальное хеширование для визуального сравнения объектов?

Но, в обшем результаты намного лучше прежднего, спасибо, @Nezar
 

Вложения

  • Example 2.png
    Example 2.png
    4.6 КБ · Просм.: 816

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Чем плохо визуальное хеширование для визуального сравнения объектов?
Потому что вы фактически делаете то же самое что и я вам советую, только в очень грубом приближении
Подумайте почему
А повернутые фигуры ваш алгоритм тоже не распознает как похожие
Или я все равно чего то недопонимаю?
 

ydobemos

Участник
Сообщения
50
Реакции
1
Потому что вы фактически делаете то же самое что и я вам советую, только в очень грубом приближении
Подумайте почему
А повернутые фигуры ваш алгоритм тоже не распознает как похожие
Или я все равно чего то недопонимаю?
Мне как раз не нужны повернутые фигуры а, повторюсь, визально похожие точно в том положении в каком они расположены. Выше я добавил пример.
Может это языковый барьер (Русский не мой родной язык), но мне не ясно как одно значение различия плошади может сравниться с хэшом формы объекта.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
но мне не ясно как одно значение различия плошади может сравниться с хэшом формы объекта.
Мне сложно объяснить вам,особенно при наличии языкового барьера
Попробую нарисовать принцип
upload_2017-4-26_17-34-36.png
 

ydobemos

Участник
Сообщения
50
Реакции
1
Мне сложно объяснить вам,особенно при наличии языкового барьера
Попробую нарисовать принцип
Посмотреть вложение 92390
Это я понял. И создал реальный пример - розовый объект базовый. На мой взгляд то что осталось бы после накладывания объектов сильно похоже во всех них. А вот с хэшом намного яснее.

В этом и был мой вопрос - как одно значение плошади, когда примерно похожие значения возможны в широком спектре объектов, может конкурировать с хэшом по точности.

Не говоря уже о времени - по моему накладывать объекты и дольше и рискованнее (если сложная геометрия).
 

Вложения

  • HashIt.png
    HashIt.png
    101.8 КБ · Просм.: 822

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
В этом и был мой вопрос - как одно значение плошади, когда примерно похожие значения возможны в широком спектре объектов, может конкурировать с хэшом по точности.
Да вы сами гляньте на свои рисунки - ваш хэш - это и есть более грубое усреднение разницы между двумя объектами! Причем в вашем случае разброс похожести в пределах одного и того же хэша ЗНАЧИТЕЛЬНО шире моего (выделено желтым)
upload_2017-4-26_18-12-28.png

Не говоря уже о времени - по моему накладывать объекты и дольше и рискованнее (если сложная геометрия).
Ничуть
Это буквально две встроенные кореловские операции
Причем, если у вас объекты - односвязные шейпы, то можно ограничиться одной-единственной - Combine
А вот ваш алгоритм предполагает офигенные проблемы, с первой из которых вы уже столкнулись
 
Последнее редактирование:

ydobemos

Участник
Сообщения
50
Реакции
1
Да вы сами гляньте на свои рисунки - ваш хэш - это и есть более грубое усреднение разницы между двумя объектами! Причем в вашем случае разброс похожести в пределах одного и того же хэша ЗНАЧИТЕЛЬНО шире моего (выделено желтым)
Посмотреть вложение 92393

Ничуть
Это буквально две встроенные кореловские операции
Причем, если у вас объекты - односвязные шейпы, то можно ограничиться одной-единственной - Combine
А вот ваш алгоритм предполагает офигенные проблемы, с первой из которых вы уже столкнулись
Мы тут говорим о форме - форма для хэша одинаковая у похожих фигур и другая для другого типа фигур. А чистое значение плошади может совпадать (вернее быть близким) фигур - как видим в картинке.

На мой взгляд то что хеш "сглаживает углы" похожести как раз плюс.

Edit: Похоже самое реальное решение это создать и вариант с вашим методом сравнить результаты.

А также - какие еше "офигенные проблемы" может создать такой алгоритм?
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
На мой взгляд то что хеш "сглаживает углы" похожести как раз плюс.
Ничуть
Я понимаю, что переубедить автора в том, что его алгоритм самый лучший практически невозможно, но поверьте мне как математику - ваш алгоритм является частным случаем моего, но с гораздо более грубым усреднением. Причем увеличение погрешности сопряжено с большим объемом непонятных случайных итераций, которые создают иллюзию повышения точности.
Если я правильно понял, вы ведь считаете хэш по некоторому количеству случайных выборок точек на шейпе? То есть,исходя из вашего алгоритма полностью похожими будут считаться совершенно различные контура, у которых точки этих выборок совпадают. А моим алгоритмом считается полная разница обоих контуров
 

ydobemos

Участник
Сообщения
50
Реакции
1
Ничуть
Я понимаю, что переубедить автора в том, что его алгоритм самый лучший практически невозможно, но поверьте мне как математику - ваш алгоритм является частным случаем моего, но с гораздо более грубым усреднением. Причем увеличение погрешности сопряжено с большим объемом непонятных случайных итераций, которые создают иллюзию повышения точности.
Если я правильно понял, вы ведь считаете хэш по некоторому количеству случайных выборок точек на шейпе? То есть,исходя из вашего алгоритма полностью похожими будут считаться совершенно различные контура, у которых точки этих выборок совпадают. А моим алгоритмом считается полная разница обоих контуров
Вовсе не считаю свой код идеальным, просто не вижу как процент различия площади хорошый параметр для установки различия обьектов.

Я же приложил весь код - могли попробовать и посмотреть - если активировать строчки Debug, то все станет ясно (тут смотрим картинку).

Hash.png

Хэш для всех обьектов генерится одинаково и базируется на квадратной матрице. Т.е. на хэш влияет форма и пропорции обьекта. В прикрепленном примере мы видим что в общем хэши достаточно точные и хорошо разделяют типы обьектов, только там где глючит IsOnShape (точка полная, но с обьектом даже не соприкасается) они отличаются. Обьеденив такой хеш с легкой проверкой размеров обьектов можно достичь приличной точности, но и достаточной гибкости.
 
Статус
Закрыто для дальнейших ответов.