个人认为该算法应该比DDA画线算法快一点,因为比DDA画线算法少量一些浮点运算,跟Bresenham算法我就不好判断了。我没有比较过,只是直观想法。发现bug的随便配碰喷,只是希望不要骂,谢谢。
#include <stdint.h>
#include "svga.h"
#include <stdio.h>
#include "svga.c"
#include <math.h>
int line(int16_t x1,int16_t y1,int16_t x2,int16_t y2,int8_t color)
{
float slope; //X方向的变化量和Y方向的变化量的比值(或者△Y/△X)
int16_t x,y; int16_t dx,dy;
int16_t temp;
int16_t addv=0,s;
dx=x2-x1; dy=y2-y1;
/*
判断是△Y/△X还是△X/△Y,目的是保证,变化量为1的方向总是变化较大的方向,根据DDA画线算法这样 可以使画出的县更接近真实的线。而在我这个算法里可以解决变化量的比值大于1
*/
if(abs(dx)<abs(dy))
{
/*
保证正方向增长
*/
if(y1>y2)
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
x=x1; y=y1;
/*
计算变化量的比值 然后根据(Y2-Y1)/(X2-X1)=m 令Y2-Y1=1,即Y方向的像素增长; 那么X2-X1=m;
*/
slope=(float)dx/dy;
/*
将浮点数转换为整数(十六进制)表示,由于前面已经保证slope<1,所以s表示的 16进制数即跟slope小数部分表示相同,不知道,我是否解释的清楚。
*/
s=(uint16_t)(slope*0x10000);
if(slope<0)
{
/*
slope<0时需要多这步的处理
*/
s=0xFFFF-s;
for(;y<y2;y++)
{
dot((int)x,(int)y,color);
/*
addv保存跟s相减后的结果,不足的像x借 下面那条内联汇编就是处理addv借去的值
*/
addv-=s;
asm sbb word ptr x,0
/*
asm adc word ptr x,0 asm sub word ptr x,1
*/
}
}
/*
后面的处理基本同上
*/
else
{
for(;y<y2;y++)
{
dot((int)x,(int)y,color);
addv+=s;
asm adc word ptr x,0
}
}
}
else if(dx-dy==0)
{
for(;x1<x2;x1++)
dot(x1,y1++,color);
}
else
{
if(x1>x2)
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
x=x1;
y=y1;
slope=(float)dy/dx;
s=(uint16_t)(slope*0x10000);
if(slope<0)
{
s=0xFFFF-s;
for(;x<x2;x++)
{
dot(x,y,color);
addv-=s;
asm sbb word ptr y,0;
/* asm sub word ptr y,1 */
}
}
else
{
for(;x<x2;x++)
{
dot((int)x,(int)y,color);
addv+=s;
asm adc word ptr y,0
}
}
}
}
#include <stdint.h>
#include "svga.h"
#include <stdio.h>
#include "svga.c"
#include <math.h>
int line(int16_t x1,int16_t y1,int16_t x2,int16_t y2,int8_t color)
{
float slope; //X方向的变化量和Y方向的变化量的比值(或者△Y/△X)
int16_t x,y; int16_t dx,dy;
int16_t temp;
int16_t addv=0,s;
dx=x2-x1; dy=y2-y1;
/*
判断是△Y/△X还是△X/△Y,目的是保证,变化量为1的方向总是变化较大的方向,根据DDA画线算法这样 可以使画出的县更接近真实的线。而在我这个算法里可以解决变化量的比值大于1
*/
if(abs(dx)<abs(dy))
{
/*
保证正方向增长
*/
if(y1>y2)
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
x=x1; y=y1;
/*
计算变化量的比值 然后根据(Y2-Y1)/(X2-X1)=m 令Y2-Y1=1,即Y方向的像素增长; 那么X2-X1=m;
*/
slope=(float)dx/dy;
/*
将浮点数转换为整数(十六进制)表示,由于前面已经保证slope<1,所以s表示的 16进制数即跟slope小数部分表示相同,不知道,我是否解释的清楚。
*/
s=(uint16_t)(slope*0x10000);
if(slope<0)
{
/*
slope<0时需要多这步的处理
*/
s=0xFFFF-s;
for(;y<y2;y++)
{
dot((int)x,(int)y,color);
/*
addv保存跟s相减后的结果,不足的像x借 下面那条内联汇编就是处理addv借去的值
*/
addv-=s;
asm sbb word ptr x,0
/*
asm adc word ptr x,0 asm sub word ptr x,1
*/
}
}
/*
后面的处理基本同上
*/
else
{
for(;y<y2;y++)
{
dot((int)x,(int)y,color);
addv+=s;
asm adc word ptr x,0
}
}
}
else if(dx-dy==0)
{
for(;x1<x2;x1++)
dot(x1,y1++,color);
}
else
{
if(x1>x2)
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
x=x1;
y=y1;
slope=(float)dy/dx;
s=(uint16_t)(slope*0x10000);
if(slope<0)
{
s=0xFFFF-s;
for(;x<x2;x++)
{
dot(x,y,color);
addv-=s;
asm sbb word ptr y,0;
/* asm sub word ptr y,1 */
}
}
else
{
for(;x<x2;x++)
{
dot((int)x,(int)y,color);
addv+=s;
asm adc word ptr y,0
}
}
}
}
