Вопрос к сообществу программистов по поводу авторства

 

Вопрос к сообществу программистов по поводу авторства. Мне нужна была функция поворота изображения. И я нашел интересный для себя вариант.

void Rotate(int x_off,int y_off, //the offsets, or top-left of box
            int Nx, int Ny, //width and height
            float scale, //the scaling factor
            int x_cent,int y_cent, //rotation around this point
            float ang) //the rotation angle
{
    long sscale=sin(ang)*65536L/scale;
    long cscale=cos(ang)*65536L/scale;
    long xc=((long)x_cent<<16) - ((Nx>>1)*(cscale+sscale));
    long yc=((long)y_cent<<16) - ((Ny>>1)*(cscale-sscale));
    char far *scn=base_screen+x_off+y_off*320;
    for (int y=0;y<Ny;y++)
    {
        long xlong=xc;
        long ylong=yc;
        for (int x=0;x<Nx;)
        {
            register int tempx=xlong>>16;
            register int tempy=ylong>>16;

            if( (tempx<0) || (tempx>=320) || (tempy<0) || (tempy>=200) )
                scn[x++]=0;
            else
                scn[x++]=buffer[tempx+y320[tempy]];

            xlong+=cscale;
            ylong-=sscale;
        }
        scn+=320;
        xc+=sscale;
        yc+=cscale;
    }
}

Он поворачивал изображения, но совсем не так, как мне надо было. Сначала пытался что-то изменить в оригинале, но ничего не выходило. По итогу просто засел за листком бумаги и написал свой алгоритм. При этом при реализации какие-то общие названия переменных менять не стал, чтобы видеть лучше, как мной придуманное отличается от того, что было найдено. Вот мой сырой (без оптимизации) опубликованный в КБ код

static void Rotate( const int x_cent, const int y_cent, //rotation around this point
                      const double ang,  //the rotation angle
                      const int Width,
                      const uint &In[],
                      uint &Out[] )
  {
    ::ArrayCopy(Out, In);

    if (!ang)
      return;

    const int Height = ArraySize(In) / Width;
    int y320[];

    ::ArrayResize(y320, Height);

    for(int n=0;n<Height;n++) y320[n]=n*Width;

    ::ArrayResize(Out, ::ArraySize(In));
    ::ArrayInitialize(Out, 0);

    const double Sin = ::MathSin(-ang);
    const double Cos = ::MathCos(-ang);

    int scn = 0;

    for (int y = 0; y < Height; y++)
    {
      for (int x=0;x<Width; x++)
      {
        const int x2 = x - x_cent;
        const int y2 = y - y_cent;

        const int x1 = (int)(Cos * x2 - Sin * y2) + x_cent;
        const int y1 = (int)(Sin * x2 + Cos * y2) + y_cent;

        Out[scn + x]= ((x1<0) || (x1>=Width) || (y1<0) || (y1>=Height)) ? 0 : In[x1+y320[y1]];
      }

      scn += Width;
    }
  }


Я не указал ссылку на оригинал, потому что посчитал, что алгоритм (хоть и примитивный) полностью мой. А совпадения названий переменных и общий подход - не столь важен. Понятно, что масштабы не сравнимы, но вспомнил давнюю историю LAME vs Fraunhofer, когда оказалось, что альтернативная реализация MP3 основана полностью на своем коде.

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

DEMO.DESIGN FAQ
  • www.enlight.ru
DEMO.DESIGN FAQ
 
fxsaber:

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

Любое изобретение опирается на аналоги, кроме открытия.   Дать ссылку в описании на аналог Вы можете, но авторство в любом случае остается за Вами.

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

 
Serqey Nikitin:

Любое изобретение опирается на аналоги, кроме открытия.   Дать ссылку в описании на аналог Вы можете, но авторство в любом случае остается за Вами.

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

Понял, Спасибо!

 
fxsaber:

Вопрос к сообществу программистов по поводу авторства. Мне нужна была функция поворота изображения. И я нашел интересный для себя вариант.


Интересно, а варианты со сглаживанием не находили?

 
Nikolai Semko:

Интересно, а варианты со сглаживанием не находили?


Вот, что то об этом нашел.
https://habrahabr.ru/post/160401/

интересно, такие вещи могут быть востребованы в MQL сообществе.

Прецизионный поворот растрового изображения на произвольный угол
Прецизионный поворот растрового изображения на произвольный угол
  • 2002.12.12
  • habrahabr.ru
Поворот растрового изображения на углы, кратные 90°, относительно геометрического центра изображения – задача тривиальная и решается без потери качества простым преобразованием координат каждого пикселя. Для поворота растрового изображения на произвольный угол разработаны быстрые но не оптимальные алгоритмы, дающие приемлемую для практических...
 
Nikolai Semko:

Вот, что то об этом нашел.
https://habrahabr.ru/post/160401/

Да, из комментария к этой статье нашел вариант, с которым начал работать. Реализовывать сглаживание не стал.

интересно, такие вещи могут быть востребованы в MQL сообществе.

Возможно, поворот появится в Canvas.mqh в следующем билде. А так те же часы получились легко.

 
fxsaber:

Возможно, поворот появится в Canvas.mqh в следующем билде. А так те же часы получились легко.

О, это уже интересно. Поворот со сглаживанием?
 
Nikolai Semko:
О, это уже интересно. Поворот со сглаживанием?

Если вопрос касался Canvas.mqh, то точно есть без сглаживания.

 
fxsaber:

Нет, в описании написано же. Да и на видео это хорошо видно.

Если вопрос касался Canvas.mqh, то точно есть без сглаживания.

Эффектно. Но какой практический смысл? 

 
Vasiliy Sokolov:

Эффектно. Но какой практический смысл? 

В чем смысл поворота?