网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月08日漏签0天
c语言吧 关注:798,841贴子:4,356,193
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 2回复贴,共1页
<<返回c语言吧
>0< 加载中...

少量浮点运算实现画线算法

  • 只看楼主
  • 收藏

  • 回复
  • FdiskSys
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
个人认为该算法应该比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
   }
   }
   }
}



  • FdiskSys
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看了上面的代码我想说一句,百度垃圾。第一不支持UTF-8,第二还吃空格,还有回车,编辑器不支持Tab键。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 2回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示