Xiaolin Wu's line algorithm: Difference between revisions
Content added Content deleted
m (added a ;Task: and ;Related task: section header, added whitespace.) |
|||
Line 2,084: | Line 2,084: | ||
End Function |
End Function |
||
</lang> |
</lang> |
||
=={{header|Mathematica}}/{{header|Wolfram Language}}== |
|||
<lang Mathematica>ClearAll[ReverseFractionalPart, ReplacePixelWithAlpha, DrawEndPoint, DrawLine] |
|||
ReverseFractionalPart[x_] := 1 - FractionalPart[x] |
|||
ReplacePixelWithAlpha[img_Image, pos_ -> colvals : {_, _, _}, |
|||
alpha_] := Module[{vals,}, |
|||
vals = PixelValue[img, pos]; |
|||
vals = (1 - alpha) vals + alpha colvals; |
|||
ReplacePixelValue[img, pos -> vals] |
|||
] |
|||
DrawEndPoint[img_Image, pt : {x_, y_}, grad_, p_] := |
|||
Module[{xend, yend, xgap, px, py, i}, |
|||
xend = Round[x]; |
|||
yend = y + grad (xend - x); |
|||
xgap = ReverseFractionalPart[x + 0.5]; |
|||
{px, py} = Floor[{xend, yend}]; |
|||
i = ReplacePixelWithAlpha[img, p[{x, py}] -> {1, 1, 1}, ReverseFractionalPart[yend] xgap]; |
|||
i = ReplacePixelWithAlpha[i, p[{x, py + 1}] -> {1, 1, 1}, FractionalPart[yend] xgap]; |
|||
{px, i} |
|||
] |
|||
DrawLine[img_Image, p1 : {_, _}, p2 : {_, _}] := |
|||
Module[{x1, x2, y1, y2, steep, p, grad, intery, xend, yend, x, y, |
|||
xstart, ystart, dx, dy, i}, |
|||
{x1, y1} = p1; |
|||
{x2, y2} = p2; |
|||
dx = x2 - x1; |
|||
dy = y2 - y1; |
|||
steep = Abs[dx] < Abs[dy]; |
|||
p = If[steep, Reverse[#], #] &; |
|||
If[steep, |
|||
{x1, y1, x2, y2, dx, dy} = {y1, x1, y2, x2, dy, dx} |
|||
]; |
|||
If[x2 < x1, |
|||
{x1, x2, y1, y2} = {x2, x1, y2, y1} |
|||
]; |
|||
grad = dy/dx; |
|||
intery = y1 + ReverseFractionalPart[x1] grad; |
|||
{xstart, i} = DrawEndPoint[img, p[p1], grad, p]; |
|||
xstart += 1; |
|||
{xend, i} = DrawEndPoint[i, p[p2], grad, p]; |
|||
Do[ |
|||
y = Floor[intery]; |
|||
i = ReplacePixelWithAlpha[i, p[{x, y}] -> {1, 1, 1}, ReverseFractionalPart[intery]]; |
|||
i = ReplacePixelWithAlpha[i, p[{x, y + 1}] -> {1, 1, 1}, FractionalPart[intery]]; |
|||
intery += grad |
|||
, |
|||
{x, xstart, xend} |
|||
]; |
|||
i |
|||
] |
|||
image = ConstantImage[Black, {100, 100}]; |
|||
Fold[DrawLine[#1, {20, 10}, #2] &, image, AngleVector[{20, 10}, {75, #}] & /@ Subdivide[0, Pi/2, 10]]</lang> |
|||
=={{header|Nim}}== |
=={{header|Nim}}== |