LINUX.ORG.RU

Написал функцию, куда положить?

 ,


2

2

Написал достаточно сложную функцию. Куда ее деть, чтобы не потерялась в веках?

Что делает:
Cчитает уровень градиента в заданной точке. Задается A(x1, y1), B(x2, y2) - линия градиента, значения от 0 до 255. Также задается точка T(tx, ty) и считается значение градиента в этой точке.

Код:
http://paste.org.ru/?3ux5ln

Код без комментариев:

unsigned char GradientValue(int x1, int y1, int x2, int y2, int tx, int ty)
{
    if ((x1 == x2) && (y1 == y2))
        return 0;
    float AB_A = y2 - y1;
    float AB_B = x1 - x2;
    float NAB_A = AB_B;
    float NAB_B = -AB_A;
    float NAB_C = -NAB_A * x1 - NAB_B * y1;
    if ((NAB_A * x2 + NAB_B * y2 + NAB_C) *
        (NAB_A * tx + NAB_B * ty + NAB_C) <= 0)
        return 0;
    NAB_C = -NAB_A * x2 - NAB_B * y2;
    if ((NAB_A * x1 + NAB_B * y1 + NAB_C) *
        (NAB_A * tx + NAB_B * ty + NAB_C) <= 0)
        return 255;
    float Dx = (x1*(y2-y1)*(y2-y1)+tx*(x2-x1)*(x2-x1)+(x2-x1)*(y2-y1)*(ty-y1)) /
               ((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
    float Dy = (x2-x1)*(tx-Dx) /
               (y2-y1) + ty;
    float AD = sqrroot((Dx-x1)*(Dx-x1)+(Dy-y1)*(Dy-y1));
    float AB = sqrroot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    float Ratio = (AD / AB) * 255;
    return (unsigned char)Ratio;
}

Пример применения:

    int x, y;

    int basecolor  = SML_COLOUR_RED;
    int transcolor = SML_COLOUR_BLUE;
    unsigned char alpha;
    int colour;

    for (x = 0; x < 500; x++)
    for (y = 0; y < 500; y++)
    {
        alpha  = SmlGradientValue(50, 50, 450, 450, x, y);
        colour = SML_COL_MIX(basecolor, transcolor, alpha);
        SmlImagePixelSet(img1, colour, x, y);
    }

Результат:
https://dl.dropboxusercontent.com/u/31471800/p2p/grad.png

Перемещено mono из talks



Последнее исправление: inn (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

Где я несу чушь? Правильно, ты не можешь показать. А твое я могу. Примерно там, где ты сказал, что гитхаб не предназначен для того, чтобы кодом делиться. Я не видел на лоре более тупого поста уже дня, наверное, гм... Ну ладно, в принципе, это примерно такой же тупой пост, как и большинство в /толкс.

cdshines ★★★★★
()
Ответ на: комментарий от cdshines

Ну так ты сравни интерфейсы сосфоржа и гитхаба.

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Продолжайте наблюдения.

(Хинт: там все это есть, причем на поверхности)

cdshines ★★★★★
()

Запомни, ТС, обосрался — притворись троллем. А выложив пароль ты только истеричкой себя выставил.

crowbar
()

Ололо, выпилился, болезный.

Затроллили, изверги! Затrавили!!!

anonymous
()

Кто-нибудь может вкратце пересказать драму? А то Я_нихуя_не_понял_Лётчик.JPG

ТС в треде практически не писал. Ну, вывалил говнокод, ну, заклевали. Из-за этого самовыпиливаться штоле? Да тут тогда надо половине Development'а устраивать массовый суицЫд.

anonymous
()
Ответ на: комментарий от shamaz

Мне надо вращать вектора. Много.

так бы сразу и сказал:

http://lurkmore.to/Копипаста:Вован#.D0.9E.D1.80.D0.B8.D0.B3.D0.B8.D0.BD.D0.B0...

А я люблю обмазываться не свежим кватернионом и вращать. Каждый день я кодю по земле с черным amd64 для float и собераю в него все float которое вижу. На два полных мешка целый день уходит. Зато, когда после тяжёлого дня я прихожу домой, иду в gcc, включаю make…ммм и сваливаю в нее свое сокровище. И кодю, представляя, что меня поглотил единый организм SIMD. Мне вообще кажется, что float, умеют думать, у них есть свои семьи, города, чувства, не смывайте их в матрицы, лучше приютите у себя, говорите с ними, ласкайте их…. А вчера в x86, мне преснился чудный сон, как будто я нырнул в ALU, и оно прератилось в float, рыбы, водоросли, медузы, все из float, даже небо, даже Аллах!.

emulek
()
Ответ на: комментарий от Eddy_Em

Как же я буду в бзде без куды после линуксокапца-то?

вдоль делал?

emulek
()
Ответ на: комментарий от Eddy_Em

Ну и пофиг. Не играл.

игра прикольная. Но вот что там уродское — «графика». Такое уродство сложно найти даже для ZX-Spectrum.

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

emulek
()
Ответ на: комментарий от unt1tled

Никогда не использовал mercurial. И не понимаю зачем оно нужно после svn и git.

C++ после C# & PHP тоже не нужен. По тем же причинам.

emulek
()
Ответ на: комментарий от unt1tled

И даже конфликтов не возникает?

возникает. Но они решаемые.

emulek
()
Ответ на: комментарий от unt1tled

Я предлагал переход на git, но я-то умею, а эти жалкие людишки-пограмисты даже мануал прочитать не могут.

в hg для обезьян есть тортилла. Я сам не юзал, но знающие люди говорят, что даже самый тупой дегенерат справляется. Даже в WindowsXP. Там как-то мышкой коммиты и пуши делаются. Какое-то великое колдунство.

emulek
()
Ответ на: комментарий от crowbar

Запомни, ТС, обосрался — притворись троллем. А выложив пароль ты только истеричкой себя выставил.

а ты себя кем выставляешь? Типа тролль?

emulek
()
Ответ на: комментарий от emulek

А, да, забыл про hg st, hg add и hg del. Ну и hg up при разработке в нескольких местах.

Что за «glog» — не знаю. «merge» не нужен, когда один что-то пилишь.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Что за «glog» — не знаю.

тот же log но более удобный.

«merge» не нужен, когда один что-то пилишь.

во первых в одиночку, во вторых — на одном локалхосте, в третьих — одну версию.

с последним пунктом поясню: ты написал функцию(как ТС), и юзаешь в своих проектах. ВНЕЗАПНО ты решил улучшить. Если ты просто возьмёшь и начнёшь улучшать, то у тебя все твои проекты посыпятся — тебе нужно с оглядкой улучшать, чтоб ничего не сломать. Но ты можешь сделать вторую голову, и улучшать её. А вот когда она станет не только лучше, но и не будет ничего ломать, тогда и придёт черёд merge. А до того проекты будут работать на старой версии.

emulek
()
Ответ на: комментарий от AIv

А я базар люблю. Вот такой я извращенец!

это уже дело вкуса.

emulek
()
Ответ на: комментарий от crowbar

я и не нервничаю. С чего ты взял? Может я пароль выложил?

emulek
()

Эээ... Да всё же элементарно делается без корней и на целочисленной арифметике. Аж с одним делением(только d_2/2 на d_2>>1 поменять).

unsigned char GradientValue(int x1, int y1, int x2, int y2, int tx, int ty){
    int dx = x2-x1;
    int dy = y2-y1;
    int t1x = tx-x1;
    int t1y = ty-y1;
    int d_2 = dx*dx + dy*dy;
    int alpha = (255*(t1x*dx + t1y*dy) + d_2/2)/d_2;
    if(alpha>255) return 255;
    if(alpha<0) return 0;
    return alpha;
}
Waterlaz ★★★★★
()
Ответ на: комментарий от AIv

Вообще неплохо бы ввести на ЛОРе поддержку LaTeX...

обязательно надо! =)

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

только лучше писать long int t1x = tx-x1; итд, а то переполнения легко достичь.

Waterlaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.