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

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
А какая разница? Баг ведь у вас именно в вычислении фунции Area от комбинированных объектов
Я вам, кстати, советую в саппорт кореловский описание бага отправить, получается, что это только в новой версии,в старых пофиксили
 

ydobemos

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

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

Код:
Sub SimilarOrNot()
    Dim S As Shape
    Dim T As Shape
    Dim SR As New ShapeRange

    Set S = ActiveSelectionRange.Shapes.First
    SR.Add S

    For Each T In ActivePage.Shapes

        If IsSimilar(S, T) Then SR.Add T

    Next T

    SR.CreateSelection

End Sub

Function IsSimilar(S As Shape, T As Shape) As Boolean

    IsSimilar = False

    Dim V As Shape
    Dim W As Shape
    Dim Z As Shape
    Dim AreaA As Double
    Dim AreaB As Double

    If S.StaticID <> T.StaticID Then
        Set V = T.Duplicate
        V.Outline.Color.RGBAssign 255, 0, 0
        V.SetSize , S.SizeHeight
        V.CenterX = S.CenterX
        V.CenterY = S.CenterY

        Set W = S.Trim(V, True, True)
        Set Z = V.Trim(S, False, True)

        If Not W Is Nothing Then
            AreaA = W.Curve.Area
            W.Delete
        End If

        If Not Z Is Nothing Then
            AreaB = Z.Curve.Area
            Z.Delete
        End If

        If AreaA + AreaB < S.DisplayCurve.Area * 0.1 Then IsSimilar = True

    End If

End Function

Как только мы повышаем процент сравнения обрезков начинают выделяться и совершенно неподходящие объекты или все равно только очень похожие. Этого не достаточно.

Покажите мне что ваш метод лучше хэша на реальном примере с не прямоугольными фигурами.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Что-то я не заметил у вас в коде приведения к общему размеру 'hmmm'
 

_MBK_

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

ydobemos

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

Вот что выделяет ваш метод (зеленый объект изначальный):
Trim.jpg


И вот мой (с квадратным
Hash.jpg
хэшом на 5 клеток):
 

_MBK_

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851

ydobemos

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Я, наверное пытаюсь ткнуть вас носом в очевидные вещи, но кэп подсказывает что площадь фигур полученных из (1-3) при правильной работе реализации должна быть по определению меньше чем (1-2) и (1-4)
upload_2017-4-27_11-23-20.png

Проверяйте у себя внимательно
 

ydobemos

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

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
upload_2017-4-27_11-33-43.png

Или вы хотите сказать - не верь глазам своим? 'otbline''fp'
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Гм, копнул чуть глубже - функция area реализована косячно по определению. Косяк заключается в том, что она корректно работает только с кривыми без самопересечений. Как только контур пересекает сам себя, площадь полученной фигуры начинает отниматься от общей площади в любом случае. Причем баг тянется с самых ранних версий к последним. Лечится через Create Boundary от фигуры - данная операция (вроде как) создает корректный контур без самопересечений. 'hmmm'
 

ydobemos

Участник
Сообщения
50
Реакции
1
Гм, копнул чуть глубже - функция area реализована косячно по определению. Косяк заключается в том, что она корректно работает только с кривыми без самопересечений. Как только контур пересекает сам себя, площадь полученной фигуры начинает отниматься от общей площади в любом случае. Причем баг тянется с самых ранних версий к последним. Лечится через Create Boundary от фигуры - данная операция (вроде как) создает корректный контур без самопересечений. 'hmmm'
Ну как всегда с корелом, все через какие-то обходные пути. А вы, повторюсь, твердили что это все такие базовые функции, совершенно надежные итд.

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну как всегда с корелом, все через какие-то обходные пути. А вы, повторюсь, твердили что это все такие базовые функции, совершенно надежные итд.
Честно говоря, я и сам не ожидал такой подлянки от функции area
Но с другой стороны, у вас алгоритм мало того что гораздо более медленный (итерации) непредсказуемый и менее точный (опять же за счет итерационности), вдобавок, содержит такую же бомбу замедленного действия IsOnShape
Ибо ее действие гарантированно содержит баги
 

ydobemos

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

И он уж точно не более медленный - если у корела на создание контура уходит больше врмени чем тут на все операции.

По моим тэстам после добавки ActiveWindow.ActiveView.Zoom = 256000 результаты уж точно лучше вашего метода без хаков (вроде контура).

Вот, ради удобства добавлю самую свежую версию. Меняя значение Степс можно менять точность хэша и таким образом подогнать метод под разные ситуации. Поставил две кнопки "Точнее" и "Менее точно" и все.

Код:
Sub SelectSimilar()

    If CheckDoc(1) Then
    
        'boostStart "Index"
        
        ActiveWindow.ActiveView.Zoom = 256000

        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 = 4

    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 228
Реакции
10 851
Насчет итераций я конечно погорячился, алгоритм у вас не итерационный, но тем хуже
К примеру, у вас вот такие контура будут считаться похожими
upload_2017-4-27_16-5-36.png

А такие - нет
upload_2017-4-27_16-6-1.png


Но повторяю, б-га ради, если вам так ваш алгоритм нравится, используйте его.
Сколько раз убеждал себя не вступать в спор с начинающими программистами, гордыми собственным творением а все никак не удерживаюсь ;)
 

ydobemos

Участник
Сообщения
50
Реакции
1
Но повторяю, б-га ради, если вам так ваш алгоритм нравится, используйте его.
Сколько раз убеждал себя не вступать в спор с начинающими программистами, гордыми собственным творением а все никак не удерживаюсь ;)
Ну, только потому что я тут на форуме недавно и мое мнение не совпадает с вашим я вряд ли начинающий программист, с вба в кореле работаю уже лет 11, пожалуй.

Вы активно игнорируете то что мое изначальное заявление о том что функциям кривых в Кореле верить нельзя оказалось верным. И без разных изврашений не получить достоверный результат с вашим методом.

Если это не так то создайте функцию которая будет достоверно давать повторяемый результат.

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

Не ясно как розовый контур может считаться похожим на зеленый в первом примере?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну, только потому что я тут на форуме недавно и мое мнение не совпадает с вашим я вряд ли начинающий программист, с вба в кореле работаю уже лет 11, пожалуй.
Не совсем так. Потому что вы упорно игнорируете все резоны, которые я вам излагаю уже второй день.
И цепляетесь за любую не относящюся к делу мелочь, дабы защитить свой алгоритм, который совершенно неустойчив. Да, многие функции в кореле сделаны заднепроходно, ну и что с того? Ведь вы пользуете ту же самую косолапую объектную модель с теми же самыми глючными функциями. Причем на глючность IsOnShape уже сами нарвались.
Я с чего то трачу свое время, пытаясь вам доказать, что ваш алгоритм - очень грубо упрощенный вариант предлагаемого мной, но вы как ребенок, у которого отбирают поломанную игрушку упираетесь и сучите ножками.
Если это не так то создайте функцию которая будет достоверно давать повторяемый результат.
Зачем? Это ваша проблема, не моя. Не нравится кореловская модель - пользуйте иллюстраторовскую. Пишите (Лев несколько экранов предлагал как) прямую собственную реализацию IsOnShape, Area и т.д. - флаг в руки! Или пользуйтесь своим алгоритмом если он уж так вам нравится! Я ж с самого начала сказал что не претендую на роль вашего гуру!
Не ясно как розовый контур может считаться похожим на зеленый в первом примере?
Как раз вполне ясно - в ключевых точках от которых вы считаете б-гомерзкий IsOnShape верхние контуры дают одинаковый хэш а нижние - нет
Почему я каждую очевидную вещь вам разжевывать должен?
 

ydobemos

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

Возможно потому что вы, похоже, просто придумываете как функционирует алгоритм вместо того чтобы посмотреть как он функционирует. Где тут что-либо совпадает?

2017.04.27 16.34.44.05 - Huh.cdr - Page 1.png
 
Статус
Закрыто для дальнейших ответов.