Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Gradient a výřez

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Gradient a výřez

Autor: griffin

17:18:38 30.08.2010

Nevim jestli to potrebujes resit nejak primo matematicky (tos nenapsal), ale nebylo by lepsi si obrazek nacist jako texturu a pracovat s ni stejne jak to dela napriklad OpenGL nebo DirectX? Tj. ze se nepracuje primo s pixelama, ale s texelama, ktery se potom mapuji na vysledny tvar. V tvem pripade zazoomovany obdelnik/ctverec.
Potom pri zoomovani textury pouzit vhodne filtrovani - [url]http://en.wikipedia.org/wiki/Texture_filtering[/url].
Nebo zrovna pouzit OGL/DX pokud se to hodi/je moznost.

Citovat příspěvek

 

Re: Gradient a výřez

Autor: peta1

12:26:38 17.08.2010

http://peter-mlich.wz.cz/web/js/prjpw/index.html
# 3 Barevný přechod šestnástkově
# 3 Barevný přechod RGB
http://axpsu.fpf.slu.cz/~web/js-color.htm

V color duha1 je
R = konst
G = krivka pres sinus
B = linearni krivka
Duha2 je nejaka prostorova sinusova krivka a vyrez z ni.
Kostka ctyr barev nahore je resena klasickou rovnici pro i,j
f = i/l; // i=0..l, l je pocet barev, f je sila force
r = c1[0]*(1-f) + c2[0]*f;
g = c1[1]*(1-f) + c2[1]*f;
b = c1[2]*(1-f) + c2[2]*f;
Cili linearni prechod mezi barvami.
x........y........z

Ty chces udelat co? linearni prechod, kdy mas rozestup barev
x.............y...z
? jestli ano, musis znat polohu barvy y, kdyz neni uprostred. Pak uz to spocitas viz prvni odkaz na barevne prechody. Cili linearne prechod mezi x-y a y-z.
Pokud chces nelinearni zavislost, pak neni nic jednodussi, definuj jakou? Kazdou barvu zvlast nebo vsechny spolecne? Treba prepocitat podle HSL?
V tech vzoreccich je to vse, co se tyce f.

Citovat příspěvek

 

Re: Gradient a výřez

Autor: tcesky

15:14:31 02.08.2010

1. Zmena barev je gradient, tedy precod mezi dvema barvami podle nejakeho interpolacniho vzorce. Pak staci v mem priklade nahradit vzorecek pro interpolaci.

2. Zmena barev se ridi nejakym neznamym pravidlem. Pak uloha nema zname reseni. Priblizne to lze udelat tak, ze pri zoomu mezi radkou A a B se bude pro pixel na relativni poloze d brat barva z radky A + (int)d *(B-A)).

Zdravim

TC

PS. Jeste stesti, ze ten ilustracni obrazek nebyla jenom souvisla cerna.

Citovat příspěvek

 

Re: Gradient a výřez

Autor: MartinPerry

15:05:23 02.08.2010

No ten obrazek byl pouze ilustrační... Třeba tady je více barev
[img]http://www.perry.cz/files/prechod.png [/img]

A zoom aby sel jen treba +- 10% okolo te bile

Citovat příspěvek

 

Re: Gradient a výřez

Autor: tcesky

15:01:07 02.08.2010

Ktere barvy krome horniho okraje a dolniho okraje mas na mysli?

TC

Citovat příspěvek

 

Re: Gradient a výřez

Autor: MartinPerry

14:48:26 02.08.2010

Ntj.. ale v rámci zoomu může být barev klidně 5. U tebe vidím pořád dvě

Citovat příspěvek

 

Re: Gradient a výřez

Autor: tcesky

14:09:01 02.08.2010

Kolik barev je v tom zoomu? Vice nez dve? Co dela ten trackbar v mem pripade? Neni to snad ten zoom? Copak je asi videt v panelech panelTop a panelBot?

TC

Citovat příspěvek

 

Re: Gradient a výřez

Autor: MartinPerry

14:03:17 02.08.2010

No to interpoluje pouze mezi 2 barvami... to jsem psal, že vyřešit umím.. Problém je, když mám barev více (interpolace jsou OK, ale problém je právě s tím "zoomem")

Citovat příspěvek

 

Re: Gradient a výřez

Autor: tcesky

13:39:28 02.08.2010

Viz priloha.

[code]
[color=#0000ff]using[/color][color=#000000] System;
[/color][color=#0000ff]using[/color][color=#000000] System.Collections.Generic;
[/color][color=#0000ff]using[/color][color=#000000] System.ComponentModel;
[/color][color=#0000ff]using[/color][color=#000000] System.Data;
[/color][color=#0000ff]using[/color][color=#000000] System.Drawing;
[/color][color=#0000ff]using[/color][color=#000000] System.Linq;
[/color][color=#0000ff]using[/color][color=#000000] System.Text;
[/color][color=#0000ff]using[/color][color=#000000] System.Windows.Forms;

[/color][color=#0000ff]namespace[/color][color=#000000] MartinPerrier
{
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]partial[/color][color=#000000] [/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]Form1[/color][color=#000000] : [/color][color=#2b91af]Form
[/color][color=#000000] {
[/color][color=#2b91af]Perry[/color][color=#000000] left, top, bot;
[/color][color=#0000ff]public[/color][color=#000000] Form1()
{
InitializeComponent();

trackBar1.Value = 50;
left = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Perry[/color][color=#000000](panelLeft, [/color][color=#2b91af]Color[/color][color=#000000].Red, [/color][color=#2b91af]Color[/color][color=#000000].Blue);
topToolStripMenuItem.Click += [/color][color=#0000ff]delegate[/color][color=#000000] { Change([/color][color=#0000ff]true[/color][color=#000000]); };
bottomToolStripMenuItem.Click += [/color][color=#0000ff]delegate[/color][color=#000000] { Change([/color][color=#0000ff]false[/color][color=#000000]); };
trackBar1.ValueChanged += [/color][color=#0000ff]delegate[/color][color=#000000] { Split(); };
top = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Perry[/color][color=#000000](panelTop, [/color][color=#2b91af]Color[/color][color=#000000].Empty, [/color][color=#2b91af]Color[/color][color=#000000].Empty);
bot = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Perry[/color][color=#000000](panelBot, [/color][color=#2b91af]Color[/color][color=#000000].Empty, [/color][color=#2b91af]Color[/color][color=#000000].Empty);
Split();
}
[/color][color=#0000ff]void[/color][color=#000000] Split()
{
[/color][color=#0000ff]var[/color][color=#000000] c = left.Interpol(1.0-([/color][color=#0000ff]double[/color][color=#000000])trackBar1.Value / 100);
top.top = left.top;
bot.bot = left.bot;
top.bot = bot.top = c;
Refresh();
}
[/color][color=#0000ff]void[/color][color=#000000] Change([/color][color=#0000ff]bool[/color][color=#000000] top)
{
colorDialog1.Color = top ? left.top : left.bot;
[/color][color=#0000ff]if[/color][color=#000000] (colorDialog1.ShowDialog() == [/color][color=#2b91af]DialogResult[/color][color=#000000].OK)
{
[/color][color=#0000ff]if[/color][color=#000000] (top) left.top = colorDialog1.Color;
[/color][color=#0000ff]else[/color][color=#000000] left.bot = colorDialog1.Color;
Split();
}
}
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]Perry
[/color][color=#000000] {
[/color][color=#2b91af]Color[/color][color=#000000] z_top, z_bot;
[/color][color=#2b91af]Panel[/color][color=#000000] z_panel;
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#2b91af]Color[/color][color=#000000] top { [/color][color=#0000ff]get[/color][color=#000000] { [/color][color=#0000ff]return[/color][color=#000000] z_top; } [/color][color=#0000ff]set[/color][color=#000000] { z_top = [/color][color=#0000ff]value[/color][color=#000000]; } }
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#2b91af]Color[/color][color=#000000] bot { [/color][color=#0000ff]get[/color][color=#000000] { [/color][color=#0000ff]return[/color][color=#000000] z_bot; } [/color][color=#0000ff]set[/color][color=#000000] { z_bot = [/color][color=#0000ff]value[/color][color=#000000]; } }
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#2b91af]Color[/color][color=#000000] Interpol([/color][color=#0000ff]double[/color][color=#000000] r)
{
[/color][color=#0000ff]return[/color][color=#000000] [/color][color=#2b91af]Color[/color][color=#000000].FromArgb(
([/color][color=#0000ff]int[/color][color=#000000])z_top.R + ([/color][color=#0000ff]int[/color][color=#000000])(r * (z_bot.R - z_top.R)),
([/color][color=#0000ff]int[/color][color=#000000])z_top.G + ([/color][color=#0000ff]int[/color][color=#000000])(r * (z_bot.G - z_top.G)),
([/color][color=#0000ff]int[/color][color=#000000])z_top.B + ([/color][color=#0000ff]int[/color][color=#000000])(r * (z_bot.B - z_top.B)));
}
[/color][color=#0000ff]public[/color][color=#000000] Perry([/color][color=#2b91af]Panel[/color][color=#000000] panel, [/color][color=#2b91af]Color[/color][color=#000000] top, [/color][color=#2b91af]Color[/color][color=#000000] bottom)
{
z_panel = panel;
z_top = top;
z_bot = bottom;
panel.Paint += [/color][color=#0000ff]delegate[/color][color=#000000]([/color][color=#0000ff]object[/color][color=#000000] sender, [/color][color=#2b91af]PaintEventArgs[/color][color=#000000] e)
{
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < z_panel.Height; i++)
[/color][color=#0000ff]using[/color][color=#000000] ([/color][color=#0000ff]var[/color][color=#000000] p = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Pen[/color][color=#000000](Interpol(([/color][color=#0000ff]double[/color][color=#000000])i / ([/color][color=#0000ff]double[/color][color=#000000])z_panel.Height)))
e.Graphics.DrawLine(p, 0, i, z_panel.Width, i);
};
}

}
}
[/color][/code]
[size=10px]Designed for "uvadeni kodu bez jakehokoliv vysvetleni, ktere mozna pomuze v dany okamzik, ale nic nevyresi do budoucna a takovy clovek se stejne nestane vyvojarem a na slozitejsi otazky uz nedojde"[/size]


TC

Citovat příspěvek

 

Gradient a výřez

Autor: MartinPerry

11:58:12 02.08.2010

Zdravím,

mám problém s gradientním přechodem.

Potřebuju abych zadal výřez gradientu a vykreslilo se mi to do stejně velké plochy, akorát roztažené (něco jako kdybych v tom gradientu zoomoval). Např. tady:
[img]http://hexapixel.com/wp-content/uploads/2010/01/gradient.jpg [/img]
Když zadám rozsah 0 - 100%, chci celý přechod
Když zadám 0-50%, tak chci jenom spodní polovinu
Pro 50% - 75% bych chtěl jenom část přechodu od 2 do 1

Pokud mám jenom 2 barvy, tak je vše OK, ale u více barev nevím jak na to.

Pro dvě barvy to mám takhle:
new_r1 = r1 + (r2 - r1) * startPrecent;
new_g1 = g1 + (g2 - g1) * startPrecent;
new_b1 = b1 + (b2 - b1) * startPrecent;
new_a1 = a1 + (a2 - a1) * startPrecent;

new_r2 = r2 - (r2 - r1) * (1 - endPercent);
new_g2 = g2 - (g2 - g1) * (1 - endPercent);
new_b2 = b2 - (b2 - b1) * (1 - endPercent);
new_a2 = a2 - (a2 - a1) * (1 - endPercent);

Jenomže pro více barev je to nepoužitelné, protože se musí měnit i poměry nějak :S

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: