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)

На полку. В бумажном виде. Хотя два десятка строк мог бы и не записывать.

Написал достаточно сложную функцию.

достаточно сложную

:)

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

Функцией пользуйся сам, если она имеет практическое значение, а остальным дай пару формул и «напальцевое» объяснение что тут у тебя происходит.

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

Напальцевое объяснение в комментариях на пасте.

inn
() автор топика

достаточно сложную функцию

бугага

Deleted
()

С флоатами и градиентами я на "косячок" напоролся, когда в куде трассировку лучей делал: точность дюжеть низкая. Там надо как-то хитро... Но, конечно, если элементарщину посчитать, то достаточно получить компоненты X и Y градиента (сверткой с соответствующими фильтрами), а потом sqrt.

Вот только зачастую в методиках анализа изображения по градиентам (поиски краев, например) точного значения вычислять не нужно: хватит и суммы модулей [latex]|\frac{\partial F}{x}|+|\frac{\partial F}{y}|[/latex].

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

Ну ты только сделай так, чтобы она сразу показывалась, а не сохранить гифку предлагала.

crowbar
()

Спасибо, ща на этой штуке потренирую SSE (в плане - перепишу слегка)

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

x1*(y2-y1)*(y2-y1)+tx*(x2-x1)*(x2-x1)+(x2-x1)*(y2-y1)*(ty-y1)

А это не формула квадрата суммы часом? Получается

x1*(y2-y1)*(y2-y1)+tx*(x2-x1)*(x2-x1)+(x2-x1)*(y2-y1)*(ty-y1)
=>
a=(y2-y1)*sqrt(x1) b = (x2-x1)*sqrt(tx)
=>
a^2 + b^2 + 2ab * (ty - y1) / (2 *sqrt(x1)*sqrt(tx)) + 2ab - 2ab
=>
(a + b)^2 + 2ab * (ty - y1) / (2 *sqrt(x1)*sqrt(tx)) - 2ab
=> (a + b)^2 + 2ab ((ty - y1)/2 *sqrt(x1)*sqrt(tx) - 1)

Так же проще считать (a, b надо вычислить заранее)

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

Напиши ещё несколько функций, по смыслу связанных с этой, назови их общим названием в качестве библиотеки, закоммить на Гитхаб, сопроводив описанием на нескольких языках и ни к чему не обязывающей лицензией. Тогда люди легко смогут найти и использовать этот код.

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

А тута:

(x2-x1)*(tx-Dx) / (y2-y1) + ty;

Будет

b*(tx-Dx)*sqrt(x1)/a*sqrt(tx) +ty

корни тоже вычислить заранее

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

Шо-то ты перемудрил.

NAB_A * x2 + NAB_B * y2 + NAB_C =
AB_B * x2 - AB_A * y2 - AB_B * x1 + AB_A * y1 =
(x1-x2) * (x2-x1)  + (y2-y1) * (y1-y2) < 0
если только точки (x1,y1) и (x2,y2) не совпадают. Так что первое условие можно просто заменить на
NAB_A * tx + NAB_B * ty + NAB_C >= 0
или просто на
(x1-x2) * (tx-x1) + (y1-y2) * (ty-y1) >= 0
Аналогично со вторым условием; кстати, мутабельность ты туда впендюрил совершенно зря, сам запутаешься.

Дальше я не смотрел, но, похоже, это быдлокод.

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

(x1-x2) * (tx-x1) + (y1-y2) * (ty-y1) >= 0

Нечитаемое говно.

Дальше я не смотрел, но, похоже, это быдлокод.

Пиши лучше.

мутабельность

В контексте?

inn
() автор топика

shit! Только прочитав полностью текст темы, понял, что речь не о градиентах, а о цвете!

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

И как оно там работает? Что-то я явной методики не понял. А с codecogs все просто. И работает:

[latex]\forall a \in \mathfrak{R}[/latex]

Eddy_Em ☆☆☆☆☆
()

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

положи в /dev/null

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

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

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

Нечитаемое говно.

Нечитаемое говно — это то, что ты написал. Здесь же просто скалярное произведение, и оно очевидно.

Пиши лучше.

Я всегда пишу лучше.

В контексте?

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

Miguel ★★★★★
()

посмотрел код. С гитхабом я переборщил. ЭТО только в /dev/null можно класть.

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

Пиши лучше.

Я всегда пишу лучше.

а что, можно хуже?

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

Я сразу предупреждаю, я не особо вникал. Но где там флоаты сравниваются с нулем. Там есть только <=0 и >=0, но там это вполне нормально

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

Будет подсчитано значение на отрезке [0,255]. Всё ок

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

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

И товарищ спрашивает «куда это положить»? Я ХЗ как там у него диск разбит и куда он там свои проекты лОжит... но пытаться осчастливливать человечество этим кодом явно не стоит. При этом в ответ на разумные критические замечания товарищ начиает дуть щеки. Зря.

AIv ★★★★★
()

оставь в ~/home/projects/

dikiy ★★☆☆☆
()

На гитхаб.

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

Конкретно, нужно вставить в начало своего исходника в комментарии вот это:

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the «License»); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an «AS IS» BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

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

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

справедливости ради замечу, что gcc всё это исправит в x86, я почти уверен

(но да, попахивает...)

emulek
()

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

на дискету, дискету закопай

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