Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gradient with equal corners is generating some variation #368

Closed
dankamongmen opened this issue Feb 21, 2020 · 9 comments
Closed

gradient with equal corners is generating some variation #368

dankamongmen opened this issue Feb 21, 2020 · 9 comments
Assignees
Labels
bug Something isn't working
Milestone

Comments

@dankamongmen
Copy link
Owner

If i ask for a gradient where all four corners are the exact same value, every cell in the gradient ought be that same value. I've just added a unit test which shows this not to be the case. See Ncplane::Stain in tests/ncplane.cpp.

@dankamongmen dankamongmen added the bug Something isn't working label Feb 21, 2020
@dankamongmen dankamongmen added this to the 1.3.0 milestone Feb 21, 2020
@dankamongmen dankamongmen self-assigned this Feb 21, 2020
@dankamongmen
Copy link
Owner Author

Hrmm this is exactly what Fills::Monochromatic ought be testing, and it passes fine...

@dankamongmen
Copy link
Owner Author

4088997700000000 4088997700000000 4088997700000000 4088997700000000 4088997740000000 yx 0 0 8 8

@dankamongmen
Copy link
Owner Author

Yeah this is all fucked up.

schwarzgerat $ ./a.out 0 64 128 255 40 40
colors: 0 64
128 255
geom: 40x40
0 2 3 5 6 8 10 11 13 14 16 18 19 21 22 24 26 27 29 30 32 34 35 37 38 40 42 43 45 46 48 50 51 53 54 56 58 59 61 62
3 5 6 8 10 12 14 15 17 18 20 22 23 24 25 27 29 31 33 34 36 38 39 41 42 44 46 47 49 51 53 55 56 58 59 61 63 64 65 66
6 9 10 12 13 15 17 18 20 21 23 25 26 28 30 32 34 35 37 38 40 42 43 45 46 48 51 52 54 55 57 59 60 62 63 65 67 68 70 72
10 12 13 15 17 18 20 21 23 25 27 29 31 32 33 35 37 39 41 42 44 46 47 49 50 53 55 56 58 60 61 63 64 66 68 70 72 73 75 76
13 15 17 19 19 21 24 25 27 29 30 32 34 36 37 40 41 42 45 46 48 51 52 53 54 57 59 60 63 63 65 68 69 71 73 74 76 78 80 81
16 18 20 21 23 25 27 29 30 32 34 36 38 39 41 43 45 47 48 50 52 54 56 57 59 61 63 65 66 68 70 72 74 75 77 79 81 83 84 86
19 22 23 25 26 29 31 32 34 35 38 39 41 43 45 46 49 50 53 54 56 58 60 61 63 65 68 69 71 72 74 77 78 80 81 84 85 87 89 91
22 25 26 28 30 32 34 35 38 39 41 44 45 47 48 51 52 54 56 58 60 62 64 66 67 69 72 72 75 77 79 81 82 85 86 88 91 92 93 95
26 28 29 31 33 35 37 39 41 42 45 47 48 51 52 54 57 58 60 62 64 66 68 70 71 73 76 77 79 81 83 85 87 88 90 93 95 96 99 100
29 31 32 35 37 38 41 43 44 46 48 51 53 54 56 59 60 62 64 65 68 70 72 74 75 78 80 81 84 86 87 90 92 93 95 97 100 101 103 105
32 35 36 38 40 42 45 46 48 50 52 55 56 58 60 62 65 66 68 70 72 75 76 78 80 82 85 86 88 90 92 95 96 98 100 102 105 106 108 110
35 37 39 42 43 46 47 50 51 53 56 58 60 61 63 65 68 70 72 74 76 79 79 82 84 86 88 90 93 94 96 98 100 102 104 107 109 111 112 114
38 40 43 45 46 49 51 53 55 57 59 62 63 66 67 70 72 74 76 77 80 83 84 86 88 90 92 94 97 98 101 103 105 107 109 111 114 115 117 119
42 44 46 48 50 52 55 56 59 60 63 65 67 69 71 73 76 77 80 81 84 86 88 90 92 94 97 99 101 103 104 108 109 111 113 116 118 120 122 124
45 47 49 51 53 55 58 60 62 64 66 69 70 73 74 78 80 82 84 86 88 90 92 94 96 98 101 103 105 107 109 112 114 115 118 120 123 124 127 128
48 50 53 54 57 59 61 64 65 68 70 72 75 76 79 81 83 85 87 90 92 94 96 98 101 103 105 107 109 112 114 116 118 120 123 125 127 129 131 134
51 53 56 58 60 63 65 67 69 70 74 76 78 81 82 84 88 89 91 93 96 98 100 102 105 107 109 112 114 116 118 121 123 125 126 130 132 133 136 138
54 57 59 61 63 66 68 70 72 74 77 79 82 84 86 89 91 93 96 97 100 103 104 106 109 111 114 116 118 120 123 125 127 129 131 134 136 139 140 143
58 60 63 65 66 69 72 74 76 78 81 83 85 88 89 92 95 97 99 102 104 107 108 110 113 115 118 120 123 124 126 130 132 133 136 139 141 143 146 147
61 63 66 68 70 72 75 78 80 81 84 86 89 91 94 97 99 100 103 105 108 111 112 114 117 119 122 125 127 129 131 134 136 138 140 143 145 148 150 153
64 67 70 72 74 76 79 82 84 85 88 91 94 96 97 100 103 105 108 109 112 115 117 120 121 124 127 129 132 133 136 139 141 143 145 148 151 153 155 157
67 70 72 74 77 80 82 84 86 89 92 95 97 99 100 103 106 109 111 113 116 118 121 124 125 128 131 132 135 138 140 143 145 147 150 152 156 157 159 161
70 73 75 77 81 83 86 88 90 92 95 98 101 102 105 108 110 112 115 117 120 122 125 128 129 132 135 137 139 142 145 148 150 152 154 156 160 162 163 167
74 76 79 81 84 86 89 92 94 96 99 102 104 106 108 111 114 116 118 121 124 126 129 132 133 136 139 141 144 147 148 152 154 156 159 161 165 166 169 171
77 80 82 84 87 89 92 95 97 100 102 105 108 109 112 116 117 120 123 125 128 131 133 136 137 140 144 145 148 150 153 156 158 160 164 165 169 172 173 176
80 83 85 88 90 93 96 98 101 103 106 109 111 114 116 119 122 124 127 129 132 135 137 140 142 144 148 150 153 155 157 161 163 165 168 170 174 176 178 181
83 86 89 91 94 97 100 102 104 106 110 112 116 117 120 122 125 127 130 133 136 139 141 144 146 149 152 154 157 159 162 166 168 170 172 175 178 181 182 186
86 89 92 94 97 100 102 106 107 110 113 116 119 121 123 127 129 132 134 137 140 143 145 148 150 153 156 158 161 164 167 169 172 174 177 179 183 185 187 190
90 93 96 98 101 103 106 109 111 113 117 119 123 124 127 130 133 135 139 141 144 147 150 152 154 157 161 163 166 168 170 174 176 178 181 184 187 190 192 195
93 96 99 100 104 106 110 112 115 117 120 123 126 129 131 135 137 139 142 144 148 150 154 156 158 161 165 167 169 173 175 179 181 183 186 188 192 194 197 200
96 99 102 104 108 110 113 116 118 121 124 127 130 132 135 138 141 144 146 149 152 155 158 160 163 165 169 172 174 177 179 183 186 187 191 193 197 200 201 205
99 102 106 107 110 114 116 119 122 124 128 130 133 136 138 141 145 147 150 153 156 159 161 164 167 169 173 176 178 181 184 187 189 192 195 198 201 204 206 209
102 105 109 111 114 117 120 123 125 128 131 134 138 139 142 146 148 151 154 156 160 163 165 168 171 174 177 180 183 185 188 192 194 197 200 202 206 209 210 214
106 108 112 114 117 120 123 127 128 131 135 137 141 143 146 149 153 155 158 160 164 167 169 172 175 178 181 185 187 190 192 196 199 200 204 207 210 213 216 219
109 111 115 117 121 123 127 130 132 135 138 142 145 147 149 154 156 159 161 165 168 171 173 177 179 182 185 188 191 194 197 201 204 205 209 211 216 218 220 223
112 115 118 121 124 127 130 133 136 139 142 145 148 151 154 157 160 162 166 169 172 175 177 181 184 186 190 192 196 199 201 205 207 210 214 216 220 222 225 229
115 118 122 124 128 131 133 137 139 141 146 149 152 154 157 160 164 167 170 172 176 179 182 185 188 190 194 197 200 203 206 209 212 214 217 221 225 227 229 233
118 121 125 127 130 134 137 141 143 145 149 152 155 158 161 165 168 170 173 176 180 183 186 189 192 194 198 201 204 207 210 214 217 219 222 225 229 232 234 238
122 124 128 130 134 137 141 144 146 149 153 156 160 162 164 168 171 174 177 181 184 187 190 193 196 199 202 205 208 211 214 219 222 223 227 230 234 237 239 242
125 128 132 134 137 140 143 147 149 152 156 159 163 166 169 173 176 178 181 184 188 191 194 197 200 203 207 210 213 216 218 222 225 227 231 234 238 241 244 248
schwarzgerat $

@dankamongmen
Copy link
Owner Author

Disgusting. This should have never been allowed into production:

schwarzgerat $ ./a.out 0 64 128 255 10 10
colors: 0 64
128 255
geom: 10x10
0 6 13 19 26 32 38 45 51 58
13 19 27 34 41 48 54 63 69 76
26 33 41 48 57 64 71 79 87 95
38 46 55 63 72 80 88 97 105 114
51 60 69 78 88 96 105 114 123 132
64 74 84 94 103 112 121 132 141 151
77 87 97 108 117 128 137 148 158 169
90 101 111 123 133 144 154 166 176 187
102 114 125 138 148 160 171 183 194 206
115 128 139 152 164 176 188 200 212 225
schwarzgerat $

@dankamongmen
Copy link
Owner Author

MUCH better:

schwarzgerat $ ./a.out 0 64 128 255 20 20
colors: 0 64
128 255
geom: 20x20
0 3 6 10 13 16 20 23 26 30 33 37 40 43 47 50 53 57 60 64
6 10 13 17 20 24 27 31 35 38 42 45 49 52 56 59 63 66 70 74
13 17 20 24 28 32 35 39 43 46 50 54 58 61 65 69 72 76 80 84
20 24 27 31 35 39 43 47 51 55 59 63 66 70 74 78 82 86 90 94
26 31 35 39 43 47 51 55 59 63 67 71 75 79 83 87 92 96 100 104
33 37 42 46 50 54 59 63 67 71 76 80 84 88 93 97 101 105 110 114
40 44 49 53 58 62 66 71 75 80 84 88 93 97 102 106 111 115 119 124
47 51 56 60 65 70 74 79 83 88 93 97 102 106 111 116 120 125 129 134
53 58 63 68 72 77 82 87 92 96 101 106 111 115 120 125 130 134 139 144
60 65 70 75 80 85 90 95 100 105 110 114 119 124 129 134 139 144 149 154
67 72 77 82 87 92 98 103 108 113 118 123 128 133 138 144 149 154 159 164
74 79 84 89 95 100 105 111 116 121 126 132 137 142 148 153 158 164 169 174
80 86 91 97 102 108 113 119 124 130 135 140 146 151 157 162 168 173 179 184
87 93 98 104 110 115 121 127 132 138 143 149 155 160 166 172 177 183 189 194
94 100 105 111 117 123 129 134 140 146 152 158 164 169 175 181 187 193 198 204
101 107 113 119 124 130 136 142 148 154 160 166 172 178 184 190 196 202 208 214
107 113 120 126 132 138 144 150 157 163 169 175 181 187 194 200 206 212 218 224
114 120 127 133 139 146 152 158 165 171 177 184 190 196 203 209 215 222 228 234
121 127 134 140 147 153 160 166 173 179 186 192 199 205 212 218 225 231 238 244
128 134 141 148 154 161 168 174 181 188 194 201 208 214 221 228 234 241 248 255
schwarzgerat $

@dankamongmen
Copy link
Owner Author

Not yet perfect, though. The middle here ought be 112, not 111:

[schwarzgerat](0) $ ./a.out  0 64 128 255 5 5
colors:	0	64
	128	255
geom:	5x5
0	16	32	48	64	
32	51	71	91	111	
64	87	111	135	159	
96	123	151	179	207	
128	159	191	223	255	
[schwarzgerat](0) $ 

(128 + 64 + 255) / 4 == 111.75. So it's a rounding issue, but nonetheless, we ain't done until we're done. Let's see that become 112. This implementation uses float anyway, so it's gonna be rewritten to use integer math in any case. Let's do it.

@dankamongmen
Copy link
Owner Author

BOOM, MOTHERFUCKERS. Integer math, perfect results:

[schwarzgerat](0) $ ./a.out  0 64 128 255 5 5
colors:	0	64
	128	255
geom:	5x5
0	16	32	48	64	
32	52	72	92	112	
64	88	112	136	160	
96	124	152	179	207	
128	160	192	223	255	
[schwarzgerat](0) $ 

our final equation of state becomes:

static int
calc_gradient_component(unsigned tl, unsigned tr, unsigned bl, unsigned br,
                        int y, int x, int ylen, int xlen){
  assert(xlen >= 2);
  assert(ylen >= 2);
  const int avm = (ylen - 1) - y;
  const int ahm = (xlen - 1) - x;
  const int tlc = ahm * avm * tl;
  const int blc = ahm * y * bl;
  const int trc = x * avm * tr;
  const int brc = y * x * br;
  const int divisor = (ylen - 1) * (xlen - 1);
  return ((tlc + blc + trc + brc) + divisor / 2) / divisor;
}

@dankamongmen
Copy link
Owner Author

dankamongmen commented Feb 23, 2020

Monochromatic checks out, as do vertical and horizontal:

[schwarzgerat](0) $ ./a.out  255 255 255 255 10 10
colors:	255	255
	255	255
geom:	10x10
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
[schwarzgerat](0) $ ./a.out  128 128 128 128 10 10
colors:	128	128
	128	128
geom:	10x10
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
128	128	128	128	128	128	128	128	128	128	
[schwarzgerat](0) $ ./a.out  0 0 0 0 10 10
colors:	0	0
	0	0
geom:	10x10
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	
[schwarzgerat](0) $ 

@dankamongmen
Copy link
Owner Author

Perfect vertical:

[schwarzgerat](0) $ ./a.out  0 0 255 255 10 10
colors:	0	0
	255	255
geom:	10x10
0	0	0	0	0	0	0	0	0	0	
28	28	28	28	28	28	28	28	28	28	
57	57	57	57	57	57	57	57	57	57	
85	85	85	85	85	85	85	85	85	85	
113	113	113	113	113	113	113	113	113	113	
142	142	142	142	142	142	142	142	142	142	
170	170	170	170	170	170	170	170	170	170	
198	198	198	198	198	198	198	198	198	198	
227	227	227	227	227	227	227	227	227	227	
255	255	255	255	255	255	255	255	255	255	
[schwarzgerat](0) $ ./a.out  254 254 255 255 10 10
colors:	254	254
	255	255
geom:	10x10
254	254	254	254	254	254	254	254	254	254	
254	254	254	254	254	254	254	254	254	254	
254	254	254	254	254	254	254	254	254	254	
254	254	254	254	254	254	254	254	254	254	
254	254	254	254	254	254	254	254	254	254	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
255	255	255	255	255	255	255	255	255	255	
[schwarzgerat](0) $ 

Perfect horizontal:

[schwarzgerat](0) $ ./a.out  0 1 0 1 10 10
colors:	0	1
	0	1
geom:	10x10
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
0	0	0	0	0	1	1	1	1	1	
[schwarzgerat](0) $ ./a.out  255 0 255 0 10 10
colors:	255	0
	255	0
geom:	10x10
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
255	227	198	170	142	113	85	57	28	0	
[schwarzgerat](0) $ 

dankamongmen added a commit that referenced this issue Feb 23, 2020
dankamongmen added a commit that referenced this issue Feb 23, 2020
Simplify and correct the gradient engine, resolving all test breakage.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant