Dzień dobry,
próbuje napisać skrypt w pythonie który narysuje zadany gradient.
Pisząc skrypt natrafiłem na trudności związane z tym że moim językiem macierzystym jest C++, w nim zrobiłem mapkę wysokości i kilka innych zdań.
Niestety w tym zadaniu jest wymóg aby zrobić skrypt w Pythonie.
Z samym Pythonem radzę sobie mimo trudności jednak mam problem natury merytorycznej.
Nie ummiem wymyślić wzoru, formuły którą pobierjąc wartość v z zakresu od 0.0 do 1.0 wyilicząła by jaki należy teraz podać kolor pixela do rysowania tak aby uszyskać żadany gradient Siedziałem długo na color pickerami, patrzyłem różne modele barw, próbowałem wplatać w funkcje wyliczająca kolory r,b,g pixela funkcje matematyczne typu sinus a teraz nawet próbowałem robić to na masie instrukcji warunkowych. Oczywiście wszystko zawiodło, dodatkowym problemem jest to że w C++ stosuje obiektowe podejście do programowania a tutaj wymuszono na mnie podejście funkcyjne - sprawia mi to dodatkowa trudność bo nie jestem przyzwyczajony do tego sposobu myślenia o kodzie.
Jakiej pomocy oczekuje ale wezmę wszystko:
Chciałbym abyście naprowadzili mnie na wzór matematyczny który pozwoli uzyskać taki gradient jaki jest na obrazku w załączniku.
Jeśli w systemie RGB jest taki wzór problemem to napisałem w c++ funkcje która przelicza HSL czy HSV do systemu RGB, mogę ją zaimplementować w Python.
Cel - jak ma wyglądać drugi gradient od góry:
Obecny "efekt"
Kod źródłowy:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import division
import matplotlib
import math
import os
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib import rc
import numpy as np
from matplotlib import colors
krok = 0
def plot_color_gradients(gradients, names):
rc('legend', fontsize=10)
column_width_pt = 400
pt_per_inch = 72
size = column_width_pt / pt_per_inch
fig, axes = plt.subplots(nrows=len(gradients), sharex=True, figsize=(size, 0.75 * size))
fig.subplots_adjust(top=1.00, bottom=0.05, left=0.25, right=0.95)
for ax, gradient, name in zip(axes, gradients, names):
img = np.zeros((2, 1024, 3))
for i, v in enumerate(np.linspace(0, 1, 1024)):
img[:, i] = gradient(v)
im = ax.imshow(img, aspect='auto')
im.set_extent([0, 1, 0, 1])
ax.yaxis.set_visible(False)
pos = list(ax.get_position().bounds)
x_text = pos[0] - 0.25
y_text = pos[1] + pos[3]/2.
fig.text(x_text, y_text, name, va='center', ha='left', fontsize=10)
fig.savefig('my-gradients.pdf')
def hsv2rgb(h, s, v):
#
return (h, s, v)
def gradient_rgb_bw(v):
#gotowe
return (v,v ,v)
r = 0
g = 255
b = 0
def gradient_rgb_gbr(v):
global r
global g
global b
g = g - 0.5
if(g <= 0):g=0
if(v >0.2 and r==0):
b = b+ 0.5
if( b > 255):b=255
if (v > 0.55):r = r +0.5 #to niest na ifach juz z desperacji:(
print(r,g,b)
return ( int(r), int(g), int(b) )
def gradient_rgb_gbr_full(v):
return (v, v, 0)
def gradient_rgb_wb_custom(v):
return (0, 0, 0)
def gradient_hsv_bw(v):
return hsv2rgb(0, 0, 0)
def gradient_hsv_gbr(v):
return hsv2rgb(0, 0, 0)
def gradient_hsv_unknown(v):
return hsv2rgb(0, 0, 0)
def gradient_hsv_custom(v):
return hsv2rgb(0, 0, 0)
if __name__ == '__main__':
def toname(g):
return g.__name__.replace('gradient_', '').replace('_', '-').upper()
gradients = (gradient_rgb_bw, gradient_rgb_gbr, gradient_rgb_gbr_full, gradient_rgb_wb_custom,
gradient_hsv_bw, gradient_hsv_gbr, gradient_hsv_unknown, gradient_hsv_custom)
plot_color_gradients(gradients, [toname(g) for g in gradients])
Pozdrawiam
- gradient cel.png (2 KB) - ściągnięć: 24
- eket.png (36 KB) - ściągnięć: 45