Solved

Line Drawing Algorithm

Posted on 2003-11-26
7
1,553 Views
Last Modified: 2010-05-18
Hi Experts!

I Want To Write a Procedure That Draws a Line In Graphic Mode 640x480.
I Know That TP7.0 Has This Procedure in Graph.tpu But Because I'm Writing My New OS With Assembly,So I Have To Write a New Proc For Drawing Line.

I Have Read Bresenham's Line Algorithm But It Has a Lot Of Problems Like:
When Y is bigger then X The Procedure Draws Just a Straight Line.

Please Help Me.
(USE PUTPIXEL IN YOUR EXAMPLE)

Bye
Programmer-x
 
0
Comment
Question by:Hamidreza Vakilian
7 Comments
 
LVL 1

Expert Comment

by:yans
ID: 9827908
0
 
LVL 2

Accepted Solution

by:
MrT-RSI earned 50 total points
ID: 9832776
 procedure line(x1,y1,x2,y2 : integer;color : byte);
  var
    x21l,y21l,d1xl,d1yl,d2xl,d2yl,max21l,min21l,duml,loopl : integer;
  begin
    x21l := x2 - x1;
    y21l := y2 - y1;
    d1xl := sign(x21l);
    d1yl := sign(y21l);
    d2xl := d1xl;
    d2yl := 0;
    max21l := abs(x21l);
    min21l := abs(y21l);
    if max21l < min21l then begin
      d2xl := 0;
      d2yl := d1yl;
      duml := max21l; max21l := min21l; min21l := duml;
    end;
    duml := max21l shr 1;
    for loopl := 0 to max21l do begin
      putpixel(x1,y1,color);
      duml := duml + min21l;
      if duml >= max21l then begin
        duml := duml - max21l;
        x1 := x1 + d1xl;
        y1 := y1 + d1yl;
      end else begin
        x1 := x1 + d2xl;
        y1 := y1 + d2yl;
      end;
    end;
  end;

with

  function sign(a : integer) : integer; external;
    { Returns the sign of value a (negative: -1, positive: 1, zero: 0).      }

in 32 bit asm:

  sign proc near a : word
    cmp a,0
    setg al ;al = 1 if a > 0
    setl ah ;ah = 1 if a < 0
    sub al,ah ;-1 if a < 0, 0 if a = 0, 1 if a > 0
    cbw ;return an integer
    ret
  sign endp

This has a own putpixel, which also includes color, just remove the color param for normal putpixel.

Good luck,

- Rob.
0
 
LVL 14

Author Comment

by:Hamidreza Vakilian
ID: 9833949
Hi MrT-RSI!

Thanks For Your Code.
Can You Convert it To Assembly?
If You Do That,I Will Give 50 Points More.

Bye
Programmer-x
0
Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

 
LVL 12

Expert Comment

by:Hypo
ID: 9840670
I have an almost complete graphicengine/unit that you can use if you like, I wanted to use graphic
functions that were very optimized for speed in the graphicmodes I wanted to use...
so most of the routines I wrote in assembler and optimized them for mode 13 and
some other Vesa 2.0 modes,

/Hypo
0
 
LVL 2

Expert Comment

by:MrT-RSI
ID: 9842601
make that 150 and I'll do it !
0
 
LVL 14

Author Comment

by:Hamidreza Vakilian
ID: 9842889
Hi MrT-RSI!

All Right.I Have Converted It To Assembler,But It Has Some Errors When I Use it In My Program.If You Tell What I'm Doing Wrong I Will Give You That 50 Points More.(50+50=100)
**************************************************************
LINE      MACRO      X1,Y1,X2,Y2
LOCAL      CON1,CON2,OK,IF1,IF2,FIN
X21      DW      0
Y21      DW      0
D1X      DW      0
D1Y      DW      0
D2X      DW      0
D2Y      DW      0
MAX21      DW      0
MIN21      DW      0
DUM      DW      0
X      DW      X1
Y      DW      Y1
XX      DW      X2
YY      DW      Y2
PUSHA

MOV      AX,XX
SUB      AX,X
MOV      X21,AX

MOV      AX,YY
SUB      AX,Y
MOV      Y21,AX

SIGN      X21
MOV      D1X,AX

SIGN      Y21
MOV      D1Y,AX

MOV      AX,D1X
MOV      D2X,AX

MOV      D2Y,0

ABS      X21      
MOV      MAX21,AX

ABS      Y21
MOV      MIN21,AX

MOV      AX,MAX21

CMP      AX,MIN21
JL      CON1

JMP      OK

CON1:
MOV      D2X,0
MOV      AX,D1Y
MOV      D2Y,AX

MOV      AX,MAX21
MOV      DUM,AX

MOV      AX,MIN21
MOV      MAX21,AX

MOV      AX,DUM
MOV      MIN21,AX

OK:

MOV      AX,MAX21
SHR      AX,1
MOV      DUM,AX

MOV      CX,MAX21

CON2:            

PIXEL      X,Y

MOV      AX,DUM
ADD      AX,MIN21
MOV      DUM,AX

CMP      AX,MAX21
JGE      IF1
JMP      IF2

IF1:
MOV      AX,DUM
SUB      AX,MAX21
MOV      DUM,AX

MOV      AX,X
ADD      AX,D1X
MOV      X,AX

MOV      AX,Y
ADD      AX,D1Y
MOV      Y,AX

JMP      FIN

IF2:
MOV      AX,X
ADD      AX,D2X
MOV      X,AX

MOV      AX,Y
ADD      AX,D2Y
MOV      Y,AX

FIN:
LOOP      CON2      

POPA
ENDM
**************************************************************
Best Wishes...
Programmer-x
0
 
LVL 14

Author Comment

by:Hamidreza Vakilian
ID: 9845394
Hi MrT-RSI!

I Understood My Problem.I Converted It To ASM and It Works Very Good...

Best Wishes...
Programmer-x
0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How to send email in delphi with image 4 587
How to use WebDispatcher to retrieve data 3 400
Old Old code - Turbo Pascal issue 17 100
TVirtualStringTree  search using TEdit 7 121
Google Drive is extremely cheap offsite storage, and it's even possible to get extra storage for free for two years.  You can use the free account 15GB, and if you have an Android device..when you install Google Drive for the first time it will give…
Do you use a spreadsheet like Microsoft's Excel?  Have you ever wanted to link out to a non excel file on your computer or network drive?  This is the way I found to do it!
In a recent question (https://www.experts-exchange.com/questions/28997919/Pagination-in-Adobe-Acrobat.html) here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.

775 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question