§ Матрица дизеринга
Матрица 8x81int lookup[8][8] = 2{ 3 { 0, 32, 8, 40, 2, 34, 10, 42}, 4 {48, 16, 56, 24, 50, 18, 58, 26}, 5 {12, 44, 4, 36, 14, 46, 6, 38}, 6 {60, 28, 52, 20, 62, 30, 54, 22}, 7 { 3, 35, 11, 43, 1, 33, 9, 41}, 8 {51, 19, 59, 27, 49, 17, 57, 25}, 9 {15, 47, 7, 39, 13, 45, 5, 37}, 10 {63, 31, 55, 23, 61, 29, 53, 21}, 11}
§ Вычисление
Каждый цветовой компонент рассчитывается путем вычисления формулы:new_clrgb = old_clrgb + k*(lookup[y & 7][x & 7] - m);
- m = 32 (зависит от разрядности, здесь 8*8/2=32)
- k = коэффициент размаха, например k=4 будет выдавать -128..127
- old_cl = старый цвет от 0 до 255 (к примеру)
- new_cl = полученный цвет
Можно сделать проще, если это черно-белая картинка:
- index_cl = 0, если new_cl < 128
- indec_cl = 1, если new_cl >= 128
§ Пример программы
1SCREEN 12 2 3DATA 0, 32, 8,40, 2,34,10,42 4DATA 48,16,56,24,50,18,58,26 5DATA 12,44, 4,36,14,46, 6,38 6DATA 60,28,52,20,62,30,54,22 7DATA 3, 35,11,43, 1,33, 9,41 8DATA 51,19,59,27,49,17,57,25 9DATA 15,47, 7,39,13,45, 5,37 10DATA 63,31,55,23,61,29,53,21 11 12DIM SHARED pat(0 TO 7, 0 TO 7) 13 14FOR i = 0 TO 7: FOR j = 0 TO 7: READ pat(j, i): NEXT: NEXT 15 16k = 4 17FOR y = 0 TO 480 18FOR x = 0 TO 640 19 20 m = (x + y) MOD 256 21 cl = (pat(x MOD 8, y MOD 8) - 32) * k + m 22 23 IF cl > 128 THEN cl = 15 ELSE cl = 0 24 PSET (x, y), cl 25 26NEXT 27NEXT
§ Цветной вариант
1... 2 3 ' --- 4 r = y \ 2 MOD 256 5 g = y \ 2 MOD 256 6 b = 255 7 ' --- 8 9 clr = (pat(x MOD 8, y MOD 8) - 32) * k + r 10 clg = (pat(x MOD 8, y MOD 8) - 32) * k + g 11 clb = (pat(x MOD 8, y MOD 8) - 32) * k + b 12 13 IF clr > 128 THEN r = 1 ELSE r = 0 14 IF clg > 128 THEN g = 1 ELSE g = 0 15 IF clb > 128 THEN b = 1 ELSE b = 0 16 17 PSET (x, y), 8 + (b + g * 2 + r * 4) 18 19...