langs a-z
This commit is contained in:
parent
db842d013d
commit
d066446780
11389 changed files with 98361 additions and 1020 deletions
|
|
@ -0,0 +1,40 @@
|
|||
let draw_line ~img ~color ~p0:(x0,y0) ~p1:(x1,y1) =
|
||||
|
||||
let steep = abs(y1 - y0) > abs(x1 - x0) in
|
||||
|
||||
let plot =
|
||||
if steep
|
||||
then (fun x y -> put_pixel img color y x)
|
||||
else (fun x y -> put_pixel img color x y)
|
||||
in
|
||||
|
||||
let x0, y0, x1, y1 =
|
||||
if steep
|
||||
then y0, x0, y1, x1
|
||||
else x0, y0, x1, y1
|
||||
in
|
||||
let x0, x1, y0, y1 =
|
||||
if x0 > x1
|
||||
then x1, x0, y1, y0
|
||||
else x0, x1, y0, y1
|
||||
in
|
||||
|
||||
let delta_x = x1 - x0
|
||||
and delta_y = abs(y1 - y0) in
|
||||
let error = -delta_x / 2
|
||||
and y_step =
|
||||
if y0 < y1 then 1 else -1
|
||||
in
|
||||
let rec loop x y error =
|
||||
plot x y;
|
||||
if x <= x1 then
|
||||
let error = error + delta_y in
|
||||
let y, error =
|
||||
if error > 0
|
||||
then (y + y_step), (error - delta_x)
|
||||
else y, error
|
||||
in
|
||||
loop (succ x) y error
|
||||
in
|
||||
loop x0 y0 error
|
||||
;;
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/* Draw a line from (x0, y0) to (x1, y1). 13 May 2010 */
|
||||
/* Based on Rosetta code proforma. */
|
||||
|
||||
/* Declarations for image and selected color, for 4-bit colors. */
|
||||
declare image(40,40) bit (4), color bit (4) static initial ('1000'b);
|
||||
|
||||
draw_line: procedure (xi, yi, xf, yf );
|
||||
declare (xi, yi, xf, yf) fixed binary (31) nonassignable;
|
||||
declare (x0, y0, x1, y1) fixed binary (31);
|
||||
declare (deltax, deltay, x, y, ystep) fixed binary;
|
||||
declare (error initial (0), delta_error) float;
|
||||
declare steep bit (1);
|
||||
|
||||
x0 = xi; y = YI; y0 = yi; x1 = xf; y1 = yf;
|
||||
steep = abs(y1 - y0) > abs (x1 - x0);
|
||||
if steep then
|
||||
do; call swap (x0, y0); call swap (x1, y1); end;
|
||||
if x0 > x1 then
|
||||
do; call swap (x0, x1); call swap (y0, y1); end;
|
||||
deltax = x1 - x0; deltay = abs(y1 - y0);
|
||||
delta_error = deltay/deltax;
|
||||
if y0 < y1 then ystep = 1; else ystep = -1;
|
||||
do x = x0 to x1;
|
||||
if steep then image(y, x) = color; else image(x, y) = color;
|
||||
if steep then put skip list (y, x); else put skip list (x, y);
|
||||
error = error + delta_error;
|
||||
if error >= 0.5 then do; y = y + ystep; error = error - 1; end;
|
||||
end;
|
||||
|
||||
swap: procedure (a, b);
|
||||
declare (a, b) fixed binary (31);
|
||||
declare t fixed binary (31);
|
||||
t = a; a = b; b = t;
|
||||
end swap;
|
||||
|
||||
end draw_line;
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|.........*
|
||||
..........|.......**.
|
||||
..........|.....**...
|
||||
..........|...**.....
|
||||
----------+-**-------
|
||||
..........**.........
|
||||
........**|..........
|
||||
.......*..|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
..........|..........
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
sub line(Bitmap $bitmap, $x0 is copy, $x1 is copy, $y0 is copy, $y1 is copy) {
|
||||
my $steep = abs($y1 - $y0) > abs($x1 - $x0);
|
||||
if $steep {
|
||||
($x0, $y0) = ($y0, $x0);
|
||||
($x1, $y1) = ($y1, $x1);
|
||||
}
|
||||
if $x0 > $x1 {
|
||||
($x0, $x1) = ($x1, $x0);
|
||||
($y0, $y1) = ($y1, $y0);
|
||||
}
|
||||
my $Δx = $x1 - $x0;
|
||||
my $Δy = abs($y1 - $y0);
|
||||
my $error = 0;
|
||||
my $Δerror = $Δy / $Δx;
|
||||
my $y-step = $y0 < $y1 ?? 1 !! -1;
|
||||
my $y = $y0;
|
||||
for $x0 .. $x1 -> $x {
|
||||
my $pix = Pixel.new(R => 100, G => 200, B => 0);
|
||||
if $steep {
|
||||
$bitmap.set-pixel($y, $x, $pix);
|
||||
} else {
|
||||
$bitmap.set-pixel($x, $y, $pix);
|
||||
}
|
||||
$error += $Δerror;
|
||||
if $error >= 0.5 {
|
||||
$y += $y-step;
|
||||
$error -= 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
Procedure BresenhamLine(x0 ,y0 ,x1 ,y1)
|
||||
If Abs(y1 - y0) > Abs(x1 - x0);
|
||||
steep =#True
|
||||
Swap x0, y0
|
||||
Swap x1, y1
|
||||
EndIf
|
||||
If x0 > x1
|
||||
Swap x0, x1
|
||||
Swap y0, y1
|
||||
EndIf
|
||||
deltax = x1 - x0
|
||||
deltay = Abs(y1 - y0)
|
||||
error = deltax / 2
|
||||
y = y0
|
||||
If y0 < y1
|
||||
ystep = 1
|
||||
Else
|
||||
ystep = -1
|
||||
EndIf
|
||||
For x = x0 To x1
|
||||
If steep
|
||||
Plot(y,x)
|
||||
Else
|
||||
Plot(x,y)
|
||||
EndIf
|
||||
error - deltay
|
||||
If error < 0
|
||||
y + ystep
|
||||
error + deltax
|
||||
EndIf
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
#Window1 = 0
|
||||
#Image1 = 0
|
||||
#ImgGadget = 0
|
||||
#width = 300
|
||||
#height = 300
|
||||
|
||||
Define.i Event
|
||||
Define.f Angle
|
||||
|
||||
If OpenWindow(#Window1, 0, 0, #width, #height, "Bresenham's Line PureBasic Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
|
||||
If CreateImage(#Image1, #width, #height)
|
||||
ImageGadget(#ImgGadget, 0, 0, #width, #height, ImageID(#Image1))
|
||||
StartDrawing(ImageOutput(#Image1))
|
||||
FillArea(0,0,-1,$FFFFFF) :FrontColor(0)
|
||||
While Angle < 2*#PI
|
||||
BresenhamLine(150,150,150+Cos(Angle)*120,150+Sin(Angle)*120)
|
||||
Angle + #PI/60
|
||||
Wend
|
||||
|
||||
StopDrawing()
|
||||
SetGadgetState(#ImgGadget, ImageID(#Image1))
|
||||
Repeat
|
||||
Event = WaitWindowEvent()
|
||||
Until Event = #PB_Event_CloseWindow
|
||||
EndIf
|
||||
EndIf
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
SUB draw_line(x1, y1, x2, y2, colour)
|
||||
x_dist = abs(x2-x1)
|
||||
y_dist = abs(y2-y1)
|
||||
IF y2-y1 < -x_dist OR x2-x1 <= -y_dist THEN
|
||||
SWAP x1, x2 ' Swap start and end points
|
||||
SWAP y1, y2
|
||||
END IF
|
||||
IF x1 < x2 THEN x_step = 1 ELSE x_step = -1
|
||||
IF y1 < y2 THEN y_step = 1 ELSE y_step = -1
|
||||
|
||||
IF y_dist > x_dist THEN ' steep angle, step by y
|
||||
error = y_dist/2
|
||||
x = x1
|
||||
FOR y = y1 TO y2
|
||||
canvas.Pset(x, y, colour)
|
||||
error = error - x_dist
|
||||
IF error < 0 THEN
|
||||
x = x + x_step
|
||||
error = error + y_dist
|
||||
END IF
|
||||
NEXT y
|
||||
ELSE ' not steep, step by x
|
||||
error = x_dist/2
|
||||
y = y1
|
||||
FOR x = x1 TO x2
|
||||
canvas.Pset(x, y, colour)
|
||||
error = error - y_dist
|
||||
IF error < 0 THEN
|
||||
y = y + y_step
|
||||
error = error + x_dist
|
||||
END IF
|
||||
NEXT y
|
||||
END IF
|
||||
|
||||
END SUB
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
SUB PaintCanvas
|
||||
draw_line 200, 10, 100, 200, &H00ff00
|
||||
draw_line 100, 200, 200, 400, &H00ff00
|
||||
draw_line 200, 400, 300, 200, &H00ff00
|
||||
draw_line 300, 200, 200, 10, &H00ff00
|
||||
END SUB
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
(lx0, ly0, lx1, ly1)
|
||||
Prgm
|
||||
Local steep, x, y, dx, dy, ystep, error, tmp
|
||||
abs(ly1 - ly0) > abs(lx1 - lx0) → steep
|
||||
If steep Then
|
||||
lx0 → tmp
|
||||
ly0 → lx0
|
||||
tmp → ly0
|
||||
lx1 → tmp
|
||||
ly1 → lx1
|
||||
tmp → ly1
|
||||
EndIf
|
||||
If lx0 > lx1 Then
|
||||
lx0 → tmp
|
||||
lx1 → lx0
|
||||
tmp → lx1
|
||||
ly0 → tmp
|
||||
ly1 → ly0
|
||||
tmp → ly1
|
||||
EndIf
|
||||
lx1 - lx0 → dx
|
||||
abs(ly1 - ly0) → dy
|
||||
when(ly0 < ly1, 1, –1) → ystep
|
||||
intDiv(dx, 2) → error
|
||||
ly0 → y
|
||||
For x,lx0,lx1
|
||||
If steep Then: PxlChg x, y :Else: PxlChg y, x :EndIf
|
||||
error - dy → error
|
||||
If error < 0 Then
|
||||
y + ystep → y
|
||||
error + dx → error
|
||||
EndIf
|
||||
EndFor
|
||||
EndPrgm
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
// Daw a line using Bresenham's line algorithm.
|
||||
// #1=x1, #2=y1; #3=x2, #4=y2
|
||||
|
||||
:DRAW_LINE:
|
||||
Num_Push(31,35)
|
||||
#31 = abs(#3-#1) // x distance
|
||||
#32 = abs(#4-#2) // y distance
|
||||
if (#4-#2 < -#31 || #3-#1 <= -#32) {
|
||||
#99=#1; #1=#3; #3=#99 // swap start and end points
|
||||
#99=#2; #2=#4; #4=#99
|
||||
}
|
||||
if (#1 < #3) { #34=1 } else { #34=-1 } // x step
|
||||
if (#2 < #4) { #35=1 } else { #35=-1 } // y step
|
||||
|
||||
if (#32 > #31) { // steep angle, step by Y
|
||||
#33 = #32 / 2 // error distance
|
||||
while (#2 <= #4) {
|
||||
Call("DRAW_PIXEL")
|
||||
#33 -= #31
|
||||
if (#33 < 0) {
|
||||
#1 += #34 // move right
|
||||
#33 += #32
|
||||
}
|
||||
#2++ // move up
|
||||
}
|
||||
} else { // not steep, step by X
|
||||
#33 = #31 / 2
|
||||
while (#1 <= #3) {
|
||||
Call("DRAW_PIXEL")
|
||||
#33 -= #32
|
||||
if (#33 < 0) {
|
||||
#2 += #35 // move up
|
||||
#33 += #31
|
||||
}
|
||||
#1++ // move right
|
||||
}
|
||||
}
|
||||
Num_Pop(31,35)
|
||||
return
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
include c:\cxpl\codes; \intrinsic 'code' declarations
|
||||
[SetVid($112); \set 640x480 graphics in 24-bit color
|
||||
Move(10, 20); \set start of line segment
|
||||
Line(600, 400, $123456);\draw line segment, red=$12, green=$34, blue=$56
|
||||
if ChIn(1) then []; \wait for keystroke while viewing graphic screen
|
||||
SetVid(3); \restore normal text mode
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue