Posted: Tue Mar 29, 2005 11:44 am Post subject: Polygon per-pixel control
Might not look that impressive but OMG it was hard. Every time u run it generates a new random polygon. Each polygon is broken down to the pixel. And to prove; I randomly genearted a colour (1, 10) for display and added a delay so you can see each pixel drawn.
I did this in 137 lines.
It's not 100%. You'll occasionally see a break in the middle but I'll have that fixed soon. I'm this much closer now to true texture mapping.
Posted: Tue Mar 29, 2005 6:03 pm Post subject: (No subject)
too lazy ...convert it to an .exe
Mazer
Posted: Tue Mar 29, 2005 6:27 pm Post subject: (No subject)
It is an exe. And as it was compiled for Turing, it's a very big exe. rar is a very common compression format for Windows (and oh hey, you can get it for Linux as well) so if you can't be bothered to use it I don't know what you're doing.
RaPsCaLLioN
Posted: Tue Mar 29, 2005 6:32 pm Post subject: (No subject)
There ya go. Added .ZIP
Sponsor Sponsor
GlobeTrotter
Posted: Tue Mar 29, 2005 7:52 pm Post subject: (No subject)
How fast is it w/o the delay?
RaPsCaLLioN
Posted: Tue Mar 29, 2005 8:14 pm Post subject: (No subject)
I just updated it. Click mouse to refresh. I took out the delay so... well for me it's as fast as I can click. Also no more errors (white lines). Try it out again.
Naveg
Posted: Wed Mar 30, 2005 12:12 am Post subject: (No subject)
thats pretty cool, wonder what kind of awesome stuff can be done with that
GlobeTrotter
Posted: Wed Mar 30, 2005 5:22 pm Post subject: (No subject)
I tried to code it, to see if I could, and I managed to get a very similar effect. The only real difference between mine and yours is that mine is a lot slower, even without a delay. Could you maybe post your source so I can compare?
code:
setscreen ("graphics:300,300")
fcn TripleMax (Num : array 0 .. 2 of int) : int
for i : 0 .. 2
if Num (i) > Num ((i + 1) mod 3) and Num (i) > Num ((i - 1) mod 3) then
result Num (i)
end if
end for
end TripleMax
fcn TripleMin (Num : array 0 .. 2 of int) : int
for i : 0 .. 2
if Num (i) < Num ((i + 1) mod 3) and Num (i) < Num ((i - 1) mod 3) then
result Num (i)
end if
end for
end TripleMin
proc ShadeTriangle (var Pointx : array 0 .. 2 of int, var Pointy : array 0 .. 2 of int, col : int)
for x : TripleMin (Pointx) .. TripleMax (Pointx)
for y : TripleMin (Pointy) .. TripleMax (Pointy)
if TriArea (Pointx (0), Pointy (0), Pointx (1), Pointy (1), Pointx (2), Pointy (2)) =
TriArea (x, y, Pointx (1), Pointy (1), Pointx (2), Pointy (2)) +
TriArea (Pointx (0), Pointy (0), x, y, Pointx (2), Pointy (2)) +
TriArea (Pointx (0), Pointy (0), Pointx (1), Pointy (1), x, y) then
drawdot (x, y, col)
end if
end for
end for
end ShadeTriangle
var TempPointx : array 0 .. 2 of int
var TempPointy : array 0 .. 2 of int
for i : 0 .. 2
TempPointx (i) := Rand.Int (1, maxx - 1)
TempPointy (i) := Rand.Int (1, maxy - 1)
Draw.Oval (TempPointx (i), TempPointy (i), 2, 2, 1)
end for
ShadeTriangle (TempPointx, TempPointy, 2)
RaPsCaLLioN
Posted: Wed Mar 30, 2005 10:37 pm Post subject: (No subject)
I'd rather not post source just yet. But... mine does not use any 'if' statements contained in loops. Nor does it use any multiplication and only 6 divides per polygon.
The only thing is my method is not self-contained. The two procedures that I used are both relying on an outside array. I need to fix this before I can progress.
Could you please explain what the 3 functions you created are calculating?
GlobeTrotter
Posted: Wed Mar 30, 2005 11:40 pm Post subject: (No subject)
The first two are pretty useless. They just give the max or the min of three inputted numbers since turing's min function and max function only work w/ two numbers.
I basically do a for statement, checking every pixel in a box around the triangle, to see if that pixel is inside the triangle. It is kind of inefficient. The third function is to calculate the area of a triangle, given three points. By checking if the sum of the three triangles formed between the given pixel, and the corners, adds up to the area of the triangle, I can know if the pixel is indside the triangle. If it is, it draws the pixel.
zylum
Posted: Fri Apr 01, 2005 9:24 pm Post subject: (No subject)
here's my attempt.. pretty fast, i think its the same way RaPsCaLLioN did his...
code:
setscreen ("offscreenonly")
var X : array 1 .. 3 of int
var Y : array 1 .. 3 of int
proc NewPoints
for i : 1 .. 3
X (i) := Rand.Int (maxx div 4, maxx div 4 * 3)
Y (i) := Rand.Int (maxy div 4, maxy div 4 * 3)
end for
var temp : int
for i : 1 .. 2
for j : i + 1 .. 3
if Y (i) < Y (j) then
temp := X (i)
X (i) := X (j)
X (j) := temp
temp := Y (i)
Y (i) := Y (j)
Y (j) := temp
end if
end for
end for
end NewPoints
proc ShadeTriangle
var b1, m1, b2, m2, b3, m3 : real
m1 := (Y (1) - Y (3)) / (X (1) - X (3) + 0.0001) + 0.0001
b1 := Y (1) - m1 * X (1)
m2 := (Y (1) - Y (2)) / (X (1) - X (2) + 0.0001) + 0.0001
b2 := Y (2) - m2 * X (2)
m3 := (Y (2) - Y (3)) / (X (2) - X (3) + 0.0001) + 0.0001
b3 := Y (3) - m3 * X (3)
for decreasing y : Y (1) .. Y (2)
for x : min (round ((y - b1) / m1), round ((y - b2) / m2)) .. max (round ((y - b1) / m1), round ((y - b2) / m2))
drawdot (x, y, Rand.Int (1, 10))
end for
end for
for decreasing y : Y (2) .. Y (3)
for x : min (round ((y - b1) / m1), round ((y - b3) / m3)) .. max (round ((y - b1) / m1), round ((y - b3) / m3))
drawdot (x, y, Rand.Int (1, 10))
end for
end for
View.Update
end ShadeTriangle
var mx, my, md : int
loop
NewPoints
ShadeTriangle
loop
mousewhere (mx, my, md)
exit when md = 1
end loop
cls
end loop
-57 lines and sometimes it draws a couple of polygons in a single mouse click (yes that fast). although some of the larger ones take a bit more time.