1 ' Texture mapping and different interpolation methods,
\r
2 ' by Timo Laidla & Svjatoslav Agejenko
\r
6 ' 0 - no interpolation
\r
7 ' 1 - linear interpolation
\r
8 ' 2 - cosinus interpolation
\r
9 ' 3 - quadric interpolation
\r
10 ' 4 - double texture, main with linear interpolation + mikro texture,
\r
11 ' for very close up look.
\r
12 ' 5 - smart interpolation. Rounds up sharp edges, good for drawings.
\r
13 ' ESC - exit program
\r
16 DECLARE SUB initsmart ()
\r
17 DECLARE FUNCTION intsmart! (bx1!, by1!, sx!, sy!)
\r
18 DECLARE FUNCTION getmappix! (x!, y!, s!)
\r
19 DECLARE SUB initmap ()
\r
20 DECLARE FUNCTION intmap! (bx1!, by1!, sx!, sy!)
\r
22 DECLARE FUNCTION intcos! (bx1!, by1!, sx!, sy!)
\r
23 DECLARE FUNCTION intlin! (bx1!, by1!, sx!, sy!)
\r
24 DECLARE FUNCTION intcub! (bx1!, by1!, sx!, sy!)
\r
25 DECLARE FUNCTION Cub! (n0!, n1!, n2!, n3!, x!)
\r
26 DECLARE SUB hline (x1!, x2!, y!, u1!, v1!, u2!, v2!)
\r
27 DECLARE SUB lin (x1!, y1!, x2!, y2!, u1!, v1!, u2!, v2!)
\r
28 DECLARE SUB poly (x1!, y1!, x2!, y2!, x3!, y3!, u1!, v1!, u2!, v2!, u3!, v3!)
\r
29 DECLARE SUB start ()
\r
31 DIM SHARED buf(0 TO 99, 0 TO 99)
\r
33 DIM SHARED xbuf(0 TO 199)
\r
34 DIM SHARED ubuf(0 TO 199)
\r
35 DIM SHARED vbuf(0 TO 199)
\r
40 DIM SHARED map1(0 TO 63, 0 TO 63)
\r
41 DIM SHARED map2(0 TO 31, 0 TO 31)
\r
42 DIM SHARED map3(0 TO 15, 0 TO 15)
\r
43 DIM SHARED map4(0 TO 7, 0 TO 7)
\r
44 DIM SHARED map5(0 TO 3, 0 TO 3)
\r
45 DIM SHARED map6(0 TO 1, 0 TO 1)
\r
49 DIM SHARED smart(0 TO 31, 0 TO 31)
\r
60 IF a$ = CHR$(27) THEN SYSTEM
\r
61 IF a$ = "0" THEN mode = 0
\r
62 IF a$ = "1" THEN mode = 1
\r
63 IF a$ = "2" THEN mode = 2
\r
64 IF a$ = "3" THEN mode = 3
\r
65 IF a$ = "4" THEN mode = 4
\r
66 IF a$ = "5" THEN mode = 5
\r
67 poly RND * 319, RND * 199, RND * 319, RND * 199, RND * 319, RND * 199, 3, 3, su, 3, 3, su
\r
70 FUNCTION Cub (v0, v1, v2, v3, x)
\r
72 p = (v3 - v2) - (v0 - v1)
\r
77 Cub = (p * (x * x * x)) + (q * (x * x)) + (r * x) + s
\r
85 poly 0, 0, 159, 0, 0, 99, 10, 10, 20, 10, 10, 20
\r
86 poly 159, 0, 159, 99, 0, 99, 20, 10, 20, 20, 10, 20
\r
89 poly 160, 0, 319, 0, 160, 99, 10, 10, 20, 10, 10, 20
\r
90 poly 319, 0, 319, 99, 160, 99, 20, 10, 20, 20, 10, 20
\r
93 poly 0, 100, 159, 100, 0, 199, 10, 10, 20, 10, 10, 20
\r
94 poly 159, 100, 159, 199, 0, 199, 20, 10, 20, 20, 10, 20
\r
97 poly 160, 100, 319, 100, 160, 199, 10, 10, 20, 10, 10, 20
\r
98 poly 319, 100, 319, 199, 160, 199, 20, 10, 20, 20, 10, 20
\r
115 poly 0, 0, 159 * s, 0, 0, 99 * s, 10, 10, 20, 10, 10, 20
\r
116 poly 159 * s, 0, 159 * s, 99 * s, 0, 99 * s, 20, 10, 20, 20, 10, 20
\r
120 poly 0, 0 + y, 159 * s, 0 + y, 0, 99 * s + y, 10, 10, 20, 10, 10, 20
\r
121 poly 159 * s, 0 + y, 159 * s, 99 * s + y, 0, 99 * s + y, 20, 10, 20, 20, 10, 20
\r
125 poly 0, 0 + y, 159 * s, 0 + y, 0, 99 * s + y, 10, 10, 20, 10, 10, 20
\r
126 poly 159 * s, 0 + y, 159 * s, 99 * s + y, 0, 99 * s + y, 20, 10, 20, 20, 10, 20
\r
130 poly 0, 0 + y, 159 * s, 0 + y, 0, 99 * s + y, 10, 10, 20, 10, 10, 20
\r
131 poly 159 * s, 0 + y, 159 * s, 99 * s + y, 0, 99 * s + y, 20, 10, 20, 20, 10, 20
\r
135 poly 160, 0, 319, 0, 160, 99, 10, 10, 20, 10, 10, 20
\r
136 poly 319, 0, 319, 99, 160, 99, 20, 10, 20, 20, 10, 20
\r
148 FUNCTION getmappix (x, y, s)
\r
156 getmappix = map6(x * 1, y * 1)
\r
161 getmappix = map5(x * 3, y * 3)
\r
166 getmappix = map4(x * 7, y * 7)
\r
171 getmappix = map3(x * 15, y * 15)
\r
176 getmappix = map2(x * 31, y * 31)
\r
180 getmappix = map1(x * 63, y * 63)
\r
185 SUB hline (ox1, ox2, y, ou1, ov1, ou2, ov2)
\r
186 IF ox1 = ox2 THEN GOTO 1
\r
204 ass = x2 - x1 ' amount of steps
\r
210 ru = uv * a / ass + u1
\r
211 rv = vv * a / ass + v1
\r
213 bx1 = INT(ru) ' interpolatsioon
\r
220 PSET (rx, y), buf(bx1, by1)
\r
222 PSET (rx, y), intlin(bx1, by1, sx, sy)
\r
224 PSET (rx, y), intcos(bx1, by1, sx, sy)
\r
226 PSET (rx, y), intcub(bx1, by1, sx, sy)
\r
228 PSET (rx, y), intmap(bx1, by1, sx, sy)
\r
230 PSET (rx, y), intsmart(bx1, by1, sx, sy)
\r
240 DIM byte AS STRING * 1
\r
242 OPEN "polymap.dat" FOR BINARY AS #1
\r
249 PSET (x + 64, y), c
\r
250 PSET (x, y + 64), c
\r
251 PSET (x + 64, y + 64), c
\r
258 map2(x, y) = (map1(x * 2, y * 2) + map1(x * 2 + 1, y * 2) + map1(x * 2, y * 2 + 1) + map1(x * 2 + 1, y * 2 + 1)) / 4
\r
259 PSET (x + 150, y), map2(x, y)
\r
265 map3(x, y) = (map2(x * 2, y * 2) + map2(x * 2 + 1, y * 2) + map2(x * 2, y * 2 + 1) + map2(x * 2 + 1, y * 2 + 1)) / 4
\r
266 PSET (x + 200, y), map3(x, y)
\r
272 map4(x, y) = (map3(x * 2, y * 2) + map3(x * 2 + 1, y * 2) + map3(x * 2, y * 2 + 1) + map3(x * 2 + 1, y * 2 + 1)) / 4
\r
273 PSET (x + 220, y), map4(x, y)
\r
279 map5(x, y) = (map4(x * 2, y * 2) + map4(x * 2 + 1, y * 2) + map4(x * 2, y * 2 + 1) + map4(x * 2 + 1, y * 2 + 1)) / 4
\r
280 PSET (x + 250, y), map5(x, y)
\r
287 map6(x, y) = (map5(x * 2, y * 2) + map5(x * 2 + 1, y * 2) + map5(x * 2, y * 2 + 1) + map5(x * 2 + 1, y * 2 + 1)) / 4
\r
289 PSET (x + 260, y), map6(x, y)
\r
295 PRINT "Average:", map7
\r
300 LINE (0, 0)-(15, 15), 1, BF
\r
301 LINE (16, 0)-(31, 15), 2, BF
\r
302 LINE (0, 16)-(15, 31), 3, BF
\r
303 LINE (16, 16)-(31, 31), 4, BF
\r
305 CIRCLE (0, 0), 15, 5, , , 1
\r
307 CIRCLE (31, 0), 15, 6, , , 1
\r
309 CIRCLE (0, 31), 15, 7, , , 1
\r
311 CIRCLE (31, 31), 15, 8, , , 1
\r
316 smart(x, y) = POINT(x, y)
\r
323 FUNCTION intcos (bx1, by1, sx, sy)
\r
326 c2 = buf(bx1 + 1, by1)
\r
327 c3 = buf(bx1 + 1, by1 + 1)
\r
328 c4 = buf(bx1, by1 + 1)
\r
329 f = (1 - COS(sy * pi)) * .5
\r
330 tonel = c1 * (1 - f) + c4 * f
\r
331 toner = c2 * (1 - f) + c3 * f
\r
332 f2 = (1 - COS(sx * pi)) * .5
\r
333 intcos = tonel * (1 - f2) + toner * f2
\r
338 FUNCTION intcub (bx1, by1, sx, sy)
\r
340 c11 = buf(bx1 - 1, by1 - 1)
\r
341 c21 = buf(bx1 - 0, by1 - 1)
\r
342 c31 = buf(bx1 + 1, by1 - 1)
\r
343 c41 = buf(bx1 + 2, by1 - 1)
\r
345 c12 = buf(bx1 - 1, by1 - 0)
\r
346 c22 = buf(bx1 - 0, by1 - 0)
\r
347 c32 = buf(bx1 + 1, by1 - 0)
\r
348 c42 = buf(bx1 + 2, by1 - 0)
\r
350 c13 = buf(bx1 - 1, by1 + 1)
\r
351 c23 = buf(bx1 - 0, by1 + 1)
\r
352 c33 = buf(bx1 + 1, by1 + 1)
\r
353 c43 = buf(bx1 + 2, by1 + 1)
\r
355 c14 = buf(bx1 - 1, by1 + 2)
\r
356 c24 = buf(bx1 - 0, by1 + 2)
\r
357 c34 = buf(bx1 + 1, by1 + 2)
\r
358 c44 = buf(bx1 + 2, by1 + 2)
\r
360 tone1 = Cub(c11, c12, c13, c14, sy)
\r
361 tone2 = Cub(c21, c22, c23, c24, sy)
\r
362 tone3 = Cub(c31, c32, c33, c34, sy)
\r
363 tone4 = Cub(c41, c42, c43, c44, sy)
\r
365 tone = Cub(tone1, tone2, tone3, tone4, sx)
\r
366 IF tone < 0 THEN tone = 0
\r
367 IF tone > 255 THEN tone = 255
\r
373 FUNCTION intlin (bx1, by1, sx, sy)
\r
376 c2 = buf(bx1 + 1, by1)
\r
377 c3 = buf(bx1 + 1, by1 + 1)
\r
378 c4 = buf(bx1, by1 + 1)
\r
379 tonel = (c4 - c1) * sy + c1
\r
380 toner = (c3 - c2) * sy + c2
\r
381 intlin = (toner - tonel) * sx + tonel
\r
385 FUNCTION intmap (bx1, by1, sx, sy)
\r
388 c2 = buf(bx1 + 1, by1)
\r
389 c3 = buf(bx1 + 1, by1 + 1)
\r
390 c4 = buf(bx1, by1 + 1)
\r
391 tonel = (c4 - c1) * sy + c1
\r
392 toner = (c3 - c2) * sy + c2
\r
393 f = (toner - tonel) * sx + tonel
\r
395 nsx = sx / 4 + (bx1 MOD 4) / 4
\r
396 nsy = sy / 4 + (by1 MOD 4) / 4
\r
398 intmap = getmappix(nsx, nsy, pixs) / 255 * f
\r
402 FUNCTION intsmart (bx1, by1, sx, sy)
\r
404 p = smart(sx * 31, sy * 31)
\r
407 IF (buf(bx1 + 1, by1) = buf(bx1 + 1, by1 + 1)) AND (buf(bx1, by1 + 1) = buf(bx1 + 1, by1 + 1)) THEN r = buf(bx1 + 1, by1) ELSE r = buf(bx1, by1)
\r
409 IF (buf(bx1, by1) = buf(bx1, by1 + 1)) AND (buf(bx1, by1 + 1) = buf(bx1 + 1, by1 + 1)) THEN r = buf(bx1, by1) ELSE r = buf(bx1 + 1, by1)
\r
411 IF (buf(bx1, by1) = buf(bx1 + 1, by1)) AND (buf(bx1 + 1, by1) = buf(bx1 + 1, by1 + 1)) THEN r = buf(bx1, by1) ELSE r = buf(bx1, by1 + 1)
\r
413 IF (buf(bx1, by1) = buf(bx1, by1 + 1)) AND (buf(bx1, by1) = buf(bx1 + 1, by1)) THEN r = buf(bx1, by1) ELSE r = buf(bx1 + 1, by1 + 1)
\r
417 r = buf(bx1 + 1, by1)
\r
419 r = buf(bx1, by1 + 1)
\r
421 r = buf(bx1 + 1, by1 + 1)
\r
427 SUB lin (x1, y1, x2, y2, u1, v1, u2, v2)
\r
430 hline x1, x2, y1, u1, v1, u2, v2
\r
435 rx1 = INT(x1): ry1 = INT(y1): rx2 = INT(x2): ry2 = INT(y2)
\r
436 ru1 = INT(u1): rv1 = INT(v1): ru2 = INT(u2): rv2 = INT(v2)
\r
438 rx1 = INT(x2): ry1 = INT(y2): rx2 = INT(x1): ry2 = INT(y1)
\r
439 ru1 = INT(u2): rv1 = INT(v2): ru2 = INT(u1): rv2 = INT(v1)
\r
448 FOR a = 0 TO ass - 1
\r
451 x = xv * a / ass + rx1
\r
452 u = uv * a / ass + ru1
\r
453 v = vv * a / ass + rv1
\r
455 IF xbuf(y) = -1 THEN
\r
460 hline INT(x), xbuf(y), y, u, v, ubuf(y), vbuf(y)
\r
466 SUB poly (x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3)
\r
468 p = SQR((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
\r
469 p = p + SQR((x3 - x2) ^ 2 + (y3 - y2) ^ 2)
\r
470 p = p + SQR((x3 - x1) ^ 2 + (y3 - y1) ^ 2)
\r
472 p1 = SQR((u1 - u2) ^ 2 + (v1 - v2) ^ 2)
\r
473 p1 = p1 + SQR((u3 - u2) ^ 2 + (v3 - v2) ^ 2)
\r
474 p1 = p1 + SQR((u3 - u1) ^ 2 + (v3 - v1) ^ 2)
\r
478 'PRINT "pixel size", pixs
\r
490 lin x1, y1, x2, y2, u1, v1, u2, v2
\r
491 lin x2, y2, x3, y3, u2, v2, u3, v3
\r
492 lin x3, y3, x1, y1, u3, v3, u1, v1
\r
512 LINE (x, 100)-(x, 199), x
\r
517 ' LINE (a, 0)-(a, 200), a
\r
526 CIRCLE (x, y), RND * su / 10, c
\r
536 buf(x, y) = POINT(x, y)
\r