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)
Ответ на: комментарий от emulek

Эта версия изменяется лишь при очень глобальных изменениях. Посмотри строчку 796, должно быть

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

уже сделал, доволен :D Теперь можно нормально писать матан тут. Еще бы придумать, чтобы при переносе картинки в текст автоматом подставлялся код латеха. Вроде сделать можно, ибо картинка - это ссылка вместе с кодом, насколько я понял.

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

Если честно, да незачем. Перемещение можно закодить отдельно, а вращать кватернионами. И того надо хранить 4 (поворот) + 3 (перемещение) числа вместо 16. Это к слову. Не, а чё, не так? Просто я ща как раз пишу рендерер и мне очень интересно, как надо.

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

Вот моё вращение с sse, покритикуй быдлокодец )

дык если тебе ОДНУ матрицу надо вращать, то её можно хоть на bash'е просчитывать, какая разница? Зачем тут sse? Используй простые числа double. И обычный код на сишечке. БЕЗ оптимизаций.

А оптимизации и сами умножения точек на матрицу AFAIK делаются сейчас прямо в видеокарте. Т.е. если у тебя в сцене Over9000 объектов, то тебе надо засунуть Over9000 +1 матриц. А карта сама нарисует каждый объект из Over9000 полигонов.

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

Можно туда title добавить. Drag-n-drop не пользуюсь вообще (и презираю это), так что в этом ничем не помогу.

Eddy_Em ☆☆☆☆☆
()

Тебя что, в детстве побили учебником по Фотртрану?

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

ОДНУ матрицу надо вращать

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

Зачем тут sse?

SIMD.

И обычный код на сишечке.

Там есть такое

https://github.com/shamazmazum/voxvision/blob/rnd/src/vect-ops/vect-ops.c

минимум умножений на одну точку

Умножение матрицы 4x4 на столбец 1x4 это 16 умножений и 16 сложений. У меня шланг дал 6 умножений, 2 сложения и 7 перестановок. Ох, подсчет инструкций - дурацкое занятие, но если ты хочешь.

А сколько чего хранить — вопрос десятый.

Кватернион помещается в 1 регистр, а матрица?

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

А оптимизации и сами умножения точек на матрицу AFAIK делаются сейчас прямо в видеокарте.

Извини, в какой ещё видеокарте?

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

Запилил бы кто пулл-реквест с чем-то не костыльным :(

maxcom, возможно ли рассмотрение установки MathJax на лор? У них даже cdn есть, так что нагрузка не есть проблемой: http://www.mathjax.org/download/

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 1)
Ответ на: комментарий от shamaz

Извини, в какой ещё видеокарте?

GPU видеокарты оптимизирован на матричные вычисления, поэтому если тебе дофига надо подобного считать, то глупо это делать на CPU! Тем паче, что 100500 ядер видеокарты это сделают куда быстрей четырех-восьми ядер твоего CPU; пусть даже частота тактирования GPU и меньше в 4 раза!

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

Да в принципе оно может ты верно говоришь, но в той же бзде ничего такого нет пока. И пока это не очень распространено, приходится обходиться cpu.

А вообще я-то быдлокодер, а у Кена Сильвермана уже готовый движок есть офигенно быстрый и только на CPU.

Да, а с вокселями GPU поможет? Причём как там распараллелить те же функции поиска по октодеревьям я не знаю. Хотя сам рейтрейсинг должен легко параллелиться.

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

в той же бзде ничего такого нет пока

Блин, фигово. Как же я буду в бзде без куды после линуксокапца-то? ☹

Кена Сильвермана уже готовый движок есть офигенно быстрый и только на CPU

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

а с вокселями GPU поможет?

Естественно. В современных видюшках уже про 3D все знают.

как там распараллелить те же функции поиска по октодеревьям я не знаю

Надыть почитать кудоруководство. ХЗ, что там за последнее время нового сделали, я-то все по трехлетней давности мануалам сижу. У меня древнючая видюха, больше 1.1 не умеет все равно.

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

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

Это же Кен Сильверман! Duke Nukem 3d, Blood, итд итп.

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

Чойта ненужно? Почему это тег «код» - нужно, а «латех» - не нужно? лор - это не сайт о программировании, а сайт о линуксе, вообще-то. А линуксоиды славятся любовью к маргинальным монстрам, каковым и является латех, так что вот так.

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

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

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

Никогда. Представь себе. Если игра позже ~2004-го года, то и не смог бы (у меня как раз произошел тогда полный переход на линукс), если раньше — хз, может 98-я мастдайка не тянула?

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

Что «в контексте»? У тебя там за каким-то фигом меняется переменная NAB_C.

Комментарии читать не обучены? Там две разные прямые.

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

Или напиши человеческую документацию,

Документация по ссылке на пасту.

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

И что? Почему твоя религия позволяет заводить переменную NAB_A, которая ВСЕГДА равна AB_B (нахрена???), но при этом заставляет пихать две разных величины в NAB_C?

Miguel ★★★★★
()

Куда ее деть, чтобы не потерялась

stackoverflow

pkurg ★★★★
()
Последнее исправление: pkurg (всего исправлений: 1)

Как вариант:

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

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

Че реально? И даже конфликтов не возникает? Ато наработе запарились уже думать почему svn вдруг решит показать конфликт, а иногда ваще не захочет апдейтить пару файлов.

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

Ужик ( cetjs2) не "предлогал" еще заменить слово "положить" на "покласть" ☺

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

Ты один там код пишешь чтоли? Так-то надо еще ветки (бранчи), откаты на старые версии (также отдельных файлов), адекватное разрешение конфликтов (это когда Вася и Петя поменяли один исходник) и куча еще всего. SVN с этим всем заметно не справляется. Я предлагал переход на git, но я-то умею, а эти жалкие людишки-пограмисты даже мануал прочитать не могут.

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

И сдохнет оно под армом. Поздравляю.

inn
() автор топика
Ответ на: комментарий от Miguel

(нахрена???)

Религия вам не позволяет понимать, что данная реализация предназначена для показа общего алгоритма действий? Переменным, содержащим что-то даны имена исходя из контекста, которые объясняются в комментариях. Кому надо - тот оптимизирует вместо того, чтобы писать свое с нуля.

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

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

Eddy_Em ☆☆☆☆☆
()

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

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

Ну ты не забывай, что я — не программист. И вообще, я — хрен с горы ☺

Я не являюсь специалистом совершенно ни в какой области ☹ Зато лезу со своим "авторитетным мнением" во все!

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