Jak udělat gradient? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak udělat gradient? – C / C++ – Fórum – Programujte.comJak udělat gradient? – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
ingiraxo+15
Grafoman
2. 4. 2012   #1
-
0
-

Čau,

řešim menší problém, potřebuju, aby se mi vytvořil gradient podle délky, ale jakmile délka přeskočí přes 255px, tak je to v háji... 

void gradient(...)
{
    ...

    float red = 255 / Length; // pocet casti (problem pokud je >255)
    int intRed = 0;

    // vykresluje jednotlive prvky, kde kazdy ma svoji barvu
    foreach (...)
    {
        g.setBrush(QBrush(QColor::fromRgb(intRed, 100, 50), Qt::SolidPattern));
        g.drawRoundRect(X, Y, WX, WY);

        intRed += red;
    }

    ...
}

Můžete mi poradit jak to teda mám řešit? aby se mi barva rozprostřela podle délky "Length" :(

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
2. 4. 2012   #2
-
0
-

bude to chtit aktualni hodnotu jako float...  kdyz ti delka prekroci 255 mas red mensi nez 1 ...  a to se "odsekne" na 0 kdyz se prevede na int

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondra.holub+1
Stálý člen
2. 4. 2012   #3
-
0
-

Nevím přesně, jaký máš rozsah toho Length. Ale obecně, pokud potřebuješ mapovat jeden lineárně rozmístěný rozsah na jiný, tak je to lineární funkce, tedy y = Ax + B. Jde jenom o to, správně si stanovit koeficienty A a B. Toho dosáhneš tak, že znáš dva body vstupního rozsahu (dejme tomu x1 a x2) a jim odpovídající body výstupního rozsahu (y1 a y2). Může to být třeba minimum a maximum, záleží na situaci. Pak už stačí jenom tyto body dosadit do obecné rovnice:

y = Ax + B

y1 = Ax1 + B
y2 = Ax2 + B

To je triviální soustava lineárních rovnic o dvou neznámých (neznámé jsou A a B). Tu si můžeš obecně vyřešit a vyjde to něco jako

A = (y2 - y1) / (x2 - x1)
B = y1 - Ax1

A máš vyhráno. Ještě je třeba nezapomenout na kontrolu, že x1 != x2. Pak už jakékoliv x přepočítáš na y.

Nahlásit jako SPAM
IP: 194.138.12.–
ingiraxo+15
Grafoman
2. 4. 2012   #4
-
0
-

KIIV: Zaokrouhlovat přes ceil nebo floor jsem zkoušel, ale to mi právě vůbec nevyřešilo problém, spíš mi to ještě zhoršilo (všude jsem měl jednu barvu jenom)

ondra: ten rozsah se mění dynamicky, jednou tam vleze třeba 10,120,210 ale i přes 255 a to s tou rovnicí nějak nevim, co bych si tam měl dosadit, když jediný co znam je délka popř. rozmezí barvy 0-255 :/

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
2. 4. 2012   #5
-
0
-

Tak už jsem to vyřešil  

void gradient(...)
{
    ...

    QColor c1 = QColor::fromRgb(255, 100, 50); // jakou barvou budu koncit
    QColor c2 = QColor::fromRgb(0, 100, 50); // jakou zacinat
    int i = 0

    foreach (...)
    {
        float part = float(i++) / Length; // pocet casti dle delky
        int red = c1.red() * part + c2.red() * (1 - part); // prumer

        g.setBrush(QBrush(QColor::fromRgb(red, 100, 50), Qt::SolidPattern));
        g.drawRoundRect(X, Y, WX, WY);
    }

    ...
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
2. 4. 2012   #6
-
0
-

myslel sem to asi takto:

float intRed =0

for...

  intRed += red;

  QColor::fromRgb( (int) intRed, 100, 50)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 71 hostů

Podobná vlákna

Jak to udělat — založil Dave

Jak udělat archiv — založil Jabbo_Hutt

Jak to lze udělat — založil Radka

Jak udělat Textcolor? — založil Mircosoft

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý