Draw Line

The Partridge Family were neither partridges nor a family. Discuss.
Post Reply
Walka
Posts: 19
Joined: September 7th, 2014, 3:45 am

Draw Line

Post by Walka » September 12th, 2017, 5:00 pm

In Chili's tutorial series years ago he taught us how to make a draw line function early on. I quit programming for quite and awhile and so I am going back through he new series again to brush up on my skills. I noticed that in this new series he does not show a draw line function. I've only made it to lesson 20 of the beginner series this may be something that he does indeed show later but I have yet to see it. I have found an excellent draw line function that works flawlessly(so far) and I just wanted to share it with the group.

Code: Select all

void Graphics::DrawLine(float x1, float y1, float x2, float y2, Color & color)
{
	const bool steep = (fabs(y2 - y1) > fabs(x2 - x1));
	if (steep)
	{
		std::swap(x1, y1);
		std::swap(x2, y2);
	}

	if (x1 > x2)
	{
		std::swap(x1, x2);
		std::swap(y1, y2);
	}

	const float dx = x2 - x1;
	const float dy = fabs(y2 - y1);

	float error = dx / 2.0f;
	const int ystep = (y1 < y2) ? 1 : -1;
	int y = (int)y1;

	const int maxX = (int)x2;

	for (int x = (int)x1; x<maxX; x++)
	{
		if (steep)
		{
			PutPixel(y, x, color);
		}
		else
		{
			PutPixel(x, y, color);
		}

		error -= dy;
		if (error < 0)
		{
			y += ystep;
			error += dx;
		}
	}
}

User avatar
chili
Site Admin
Posts: 3948
Joined: December 31st, 2011, 4:53 pm
Location: Japan
Contact:

Re: Draw Line

Post by chili » September 13th, 2017, 1:15 am

This looks like Bresenham. I won't do Bresenham when I teach straight line drawing (I like to teach something that is as close to y=mx+b as possible because it is the easiest for most to understand), but it is the way to go if you want the most efficient algorithm.

Still trying to figure out when I want to go over straight line. Will definitely do it though, not only for its own sake but also because linear math is essential to master for game dev.
Chili

Walka
Posts: 19
Joined: September 7th, 2014, 3:45 am

Re: Draw Line

Post by Walka » September 13th, 2017, 2:12 am

It is Bresenham. I got it off rosettacode.com. I was trying to figure it out on my own but i could not for the life remember how to fix the problem when the line would not draw.

User avatar
chili
Site Admin
Posts: 3948
Joined: December 31st, 2011, 4:53 pm
Location: Japan
Contact:

Re: Draw Line

Post by chili » September 13th, 2017, 2:19 am

There is another related algorithm for drawing thin line circles that doesn't need any sqrt or even floating point.
Chili

Walka
Posts: 19
Joined: September 7th, 2014, 3:45 am

Re: Draw Line

Post by Walka » September 13th, 2017, 2:28 am

I got a quick question for you. I am trying to load my old projects in VS15 that I wrote in VS10. I am getting this error "LNK1104 cannot open file ' dxerr.lib' " any idea how to fix this?

User avatar
chili
Site Admin
Posts: 3948
Joined: December 31st, 2011, 4:53 pm
Location: Japan
Contact:

Re: Draw Line

Post by chili » September 13th, 2017, 2:44 am

Go into the solution settings, linker settings, remove dxerr.lib from the list of libraries imported. It isn't actually needed.
Chili

Post Reply