Reviewed ImageDrawLine() formating
This commit is contained in:
parent
ff2b8d6db1
commit
00911b0842
@ -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 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 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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user