Page 1 of 1

Drawing angled lines with user specified angles

Posted: Mon Jan 26, 2009 9:45 pm
by sbucher
I'm trying to write a program for my sinclair that requires drawing lines at various angles using user specified degree input.
I'm having trouble finding the correct way to do this.
Can anyone give me some pointers? or perhaps a sample line of code?
thanks...

Re: Drawing angled lines with user specified angles

Posted: Wed Jan 28, 2009 4:06 pm
by siggi
This is a fast line drawing routine written in C. Since it uses only integer arthmetic and add/subtract/shift operations, it can easily be ported to assembler.
Using BASIC with the ZX81 is also possible, but would be very slow, because everything would be calculated using floating-point arithmetic.
Of course you still need the sin oder cos functions first to calculate the destination coordinates of the line depending on the given angle.

Code: Select all

//---------------------------------------------------------------------------
//draws a line from x1, y1 to x2, y2; line can be drawn in any direction
//set show to 1 to draw pixel, set to 0 to clear pixel
//---------------------------------------------------------------------------
void DrawLine(int x1, int y1, int x2, int y2, unsigned char show)
{
    int dx, dy, stepx, stepy, fraction;

    dy = y2 - y1;
    dx = x2 - x1;

    if (dy < 0)
    {
        dy = -dy;
        stepy = -1;
    }
    else
    {
        stepy = 1;
    }

    if (dx < 0)
    {
        dx = -dx;
        stepx = -1;
    }
    else
    {
        stepx = 1;
    }

    dy <<= 1;
    dx <<= 1;

    LCD_SetPixel(x1, y1, show);

    if (dx > dy)
    {
        fraction = dy - (dx >> 1);
        while (x1 != x2)
        {
            if (fraction >= 0)
            {
                y1 += stepy;
                fraction -= dx;
            }

            x1 += stepx;
            fraction += dy;
            LCD_SetPixel(x1, y1, show);
        }
    }
    else
    {
        fraction = dx - (dy >> 1);
        while (y1 != y2)
        {
            if (fraction >= 0)
            {
                x1 += stepx;
                fraction -= dy;
            }
            y1 += stepy;
            fraction += dx;
            LCD_SetPixel(x1, y1, show);
        }
    }
}
HTH Siggi

Re: Drawing angled lines with user specified angles

Posted: Sat Jan 31, 2009 6:01 pm
by sbucher
Hi,
I'm ok with drawing straight lines and inputting the line lengths. What I'm having trouble with is writing code to plot angled lines.
Let's say I want to start at point 0,22 and draw a straight line 1.75 inches.
Now I want to start at the same point, draw another 1.75 inch line, but... this line goes off at a 54.5 degree angle from the starting point.
This is where I'm stuck. I'm not sure what the sinclair basic line of command would be for this...

Re: Drawing angled lines with user specified angles

Posted: Sat Jan 31, 2009 7:20 pm
by RWAP
Ah for that you will need to remember what the angle is at all times and use SIN and COS (sine and co-sine) calculations to work out the change to the current x,y co-ordinate to find the end of the line.

x=x+(SIN(angle)*length)
y=y+(COS(angle)*length)

Re: Drawing angled lines with user specified angles

Posted: Mon Feb 02, 2009 10:18 pm
by sbucher
I'm having a bit of trouble trying to put the whole thing together. Any chance of you writing a sample line of code in s-basic as a example? I think if I can see an example that'll help.
I'm trying to write a program that does "tangent projection" that is,drawing a series of lines at various angles to define a unfolded pattern.

Re: Drawing angled lines with user specified angles

Posted: Thu Feb 05, 2009 10:38 pm
by sbucher
Hi,
I finally got this figured out, I got a couple books on sinclair basic and some other advise and it's working.
Thanks for your time and suggestions, they were a big help and appreciated...

Re: Drawing angled lines with user specified angles

Posted: Fri Feb 06, 2009 7:41 am
by RWAP
Why not post the relevant code, to help others in a similar situation?

Re: Drawing angled lines with user specified angles

Posted: Fri Feb 06, 2009 7:50 pm
by sbucher
Here's the code. It'll print the x and y coordinates of an angled line endpoint to a line of user specified length and angle.
For the sake of experimenting I assumed 1" would be 12 pixel movements but I know that's probably not right. I'll fiix that later. Right now I was just interested in getting it to work.

Code: Select all

1 PRINT “ANGLE=: “;
2 INPUT A
3 CLS
4 PRINT “LINE LENGTH=: “;
5 INPUT B
6 CLS
7 LET C= B*12
10 LET ANGLE=A*PI/180
20 LET STARTX = 0
30 LET STARTY = 2
40 LET ENDX = STARTX + C* COS (ANGLE)
50 LET ENDY = STARTY + C* SIN (ANGLE)
60 PRINT “X=: “;
70 PRINT “Y=: “;