|
|
@ -2414,7 +2414,7 @@ void ImageDrawPixelV(Image *dst, Vector2 position, Color color) |
|
|
|
{ |
|
|
|
ImageDrawPixel(dst, (int)position.x, (int)position.y, color); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Draw line within an image |
|
|
|
void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color) |
|
|
|
{ |
|
|
@ -2423,99 +2423,89 @@ void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int en |
|
|
|
// https://classic.csunplugged.org/wp-content/uploads/2014/12/Lines.pdf |
|
|
|
|
|
|
|
int changeInX = (endPosX - startPosX); |
|
|
|
int abs_changeInX = (changeInX < 0)? -changeInX : changeInX; |
|
|
|
int absChangeInX = (changeInX < 0)? -changeInX : changeInX; |
|
|
|
int changeInY = (endPosY - startPosY); |
|
|
|
int abs_changeInY = (changeInY < 0)? -changeInY : changeInY; |
|
|
|
int absChangeInY = (changeInY < 0)? -changeInY : changeInY; |
|
|
|
|
|
|
|
int startU, startV, endU, V_step; // Substitutions, either U = X, V = Y or vice versa. See loop at end of function |
|
|
|
//int endV; // This is not needed, but to aid understanding it is left in the code below. |
|
|
|
|
|
|
|
int A, B, P; // See linked paper above. Explained down in the main loop. |
|
|
|
|
|
|
|
int is_x_y_reversed = (abs_changeInY < abs_changeInX); |
|
|
|
int startU, startV, endU, stepV; // Substitutions, either U = X, V = Y or vice versa. See loop at end of function |
|
|
|
//int endV; // Not needed but left for better understanding, check code below |
|
|
|
int A, B, P; // See linked paper above, explained down in the main loop |
|
|
|
int reversedXY = (absChangeInY < absChangeInX); |
|
|
|
|
|
|
|
if (is_x_y_reversed) |
|
|
|
if (reversedXY) |
|
|
|
{ |
|
|
|
A = 2*abs_changeInY; |
|
|
|
B = A - 2*abs_changeInX; |
|
|
|
P = A - abs_changeInX; |
|
|
|
A = 2*absChangeInY; |
|
|
|
B = A - 2*absChangeInX; |
|
|
|
P = A - absChangeInX; |
|
|
|
|
|
|
|
if (changeInX > 0) |
|
|
|
if (changeInX > 0) |
|
|
|
{ |
|
|
|
startU = startPosX; |
|
|
|
startV = startPosY; |
|
|
|
endU = endPosX; |
|
|
|
//endV = endPosY; |
|
|
|
//endV = endPosY; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
startU = endPosX; |
|
|
|
startV = endPosY; |
|
|
|
endU = startPosX; |
|
|
|
//endV = startPosY; |
|
|
|
//endV = startPosY; |
|
|
|
|
|
|
|
// since start and end are l">reversed: |
|
|
|
// Since start and end are reversed |
|
|
|
changeInX = -changeInX; |
|
|
|
changeInY = -changeInY; |
|
|
|
} |
|
|
|
|
|
|
|
V_step = (changeInY < 0)? -1 : 1; |
|
|
|
stepV = (changeInY < 0)? -1 : 1; |
|
|
|
|
|
|
|
ImageDrawPixel(dst, startU, startV, color); // At this point they are correctly ordered... |
|
|
|
ImageDrawPixel(dst, startU, startV, color); // At this point they are correctly ordered... |
|
|
|
} |
|
|
|
else // all X and Y are reversed in here: |
|
|
|
else |
|
|
|
{ |
|
|
|
A = 2*abs_changeInX; |
|
|
|
B = A - 2*abs_changeInY; |
|
|
|
P = A - abs_changeInY; |
|
|
|
A = 2*absChangeInX; |
|
|
|
B = A - 2*absChangeInY; |
|
|
|
P = A - absChangeInY; |
|
|
|
|
|
|
|
if (changeInY > 0) |
|
|
|
{ |
|
|
|
startU = startPosY; |
|
|
|
startV = startPosX; |
|
|
|
endU = endPosY; |
|
|
|
//endV = endPosX; |
|
|
|
//endV = endPosX; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
startU = endPosY; |
|
|
|
startV = endPosX; |
|
|
|
endU = startPosY; |
|
|
|
//endV = startPosX; |
|
|
|
//endV = startPosX; |
|
|
|
|
|
|
|
// since start and end are l">reversed: |
|
|
|
// Since start and end are reversed |
|
|
|
changeInX = -changeInX; |
|
|
|
changeInY = -changeInY; |
|
|
|
} |
|
|
|
|
|
|
|
V_step = (changeInX < 0)? -1 : 1; |
|
|
|
stepV = (changeInX < 0)? -1 : 1; |
|
|
|
|
|
|
|
ImageDrawPixel(dst, startV, startU, color); // ... but need to be reversed here. Repeated in the main loop below. |
|
|
|
ImageDrawPixel(dst, startV, startU, color); // ... but need to be reversed here. Repeated in the main loop below |
|
|
|
} |
|
|
|
|
|
|
|
// We already drew the start point. If we started at startU+0, the line would be crooked and too short. |
|
|
|
for (int U = startU+1, V = startV; U <= endU; U += 1) |
|
|
|
// We already drew the start point. If we started at startU + 0, the line would be crooked and too short |
|
|
|
for (int u = startU + 1, v = startV; u <= endU; u++) |
|
|
|
{ |
|
|
|
if (P >= 0) |
|
|
|
{ |
|
|
|
V += V_step; // Adjusts whenever we stray too far from the direct line. Details in the linked paper above. |
|
|
|
P += B; // Remembers that we corrected our path. |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
P += A; // Remembers how far we are from the direct line. |
|
|
|
} |
|
|
|
if (is_x_y_reversed) // Substitutions may be in wrong order for drawing: |
|
|
|
{ |
|
|
|
ImageDrawPixel(dst, U, V, color); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
ImageDrawPixel(dst, V, U, color); |
|
|
|
v += stepV; // Adjusts whenever we stray too far from the direct line. Details in the linked paper above |
|
|
|
P += B; // Remembers that we corrected our path |
|
|
|
} |
|
|
|
else P += A; // Remembers how far we are from the direct line |
|
|
|
|
|
|
|
if (reversedXY) ImageDrawPixel(dst, u, v, color); |
|
|
|
else ImageDrawPixel(dst, v, u, color); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Draw line within an image (Vector version) |
|
|
|
void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color) |
|
|
|
{ |
|
|
|