• 中点画线算法


    中点画线算法(Midpoint Line Drawing Algorithm)是通过在每列像素中确定与理想直线最靠近的像素来进行扫描转换的。

    步骤实现     斜率: 0<=k<=1

    直线端点:(x1,y1),(x2,y2)
    1) 初始化。令 a=y1-y2, b=x2-x1, d=2*a+b, deta1=2*a, deta2=2*(a+b), x=x1, y=y1.
    2) 用颜色color画像素(x,y)。
    3) 判断x是否小于x2。如果x

    代码实现(基于VC 6.0)     斜率: 任意

     1 #define ROUND(a) ((int)(a+0.5))
     2 /* 中点直线生成算法 */
     3 void CDrawDC::LineMP(int x1, int y1, int x2, int y2, COLORREF color)
     4 {
     5     int a,b,x,y,d,da1,da2;
     6 
     7     if(x1<x2 && y1<y2){
     8         a=y1-y2;
     9         b=x2-x1;
    10         x=x1,y=y1;
    11         d=2*a+b;
    12         da1=2*a;
    13         da2=2*(a+b);
    14 
    15         SetPixel(ROUND(x),ROUND(y),color);
    16         for(;x<x2;){
    17             if(d<0){
    18                 x++;
    19                 y++;
    20                 d+=da2;
    21             }else{
    22                 x++;
    23                 d+=da1;
    24             }
    25             SetPixel(ROUND(x),ROUND(y),color);
    26         }
    27     }else if(x1>x2 && y1>y2){
    28         a=y2-y1;
    29         b=x1-x2;
    30         x=x2,y=y2;
    31         d=2*a+b;
    32         da1=2*a;
    33         da2=2*(a+b);
    34 
    35         SetPixel(ROUND(x),ROUND(y),color);
    36         for(;x<x1;){
    37             if(d<0){
    38                 x++;
    39                 y++;
    40                 d+=da2;
    41             }else{
    42                 x++;
    43                 d+=da1;
    44             }
    45             SetPixel(ROUND(x),ROUND(y),color);
    46         }
    47     }else if(x1>x2 && y1<y2){
    48         a=-y2;
    49         b=x1-x2;
    50         x=0,y=0;
    51         d=2*a+b;
    52         da1=2*a;
    53         da2=2*(a+b);
    54 
    55         SetPixel(ROUND(x1-x),ROUND(y+y1),color);
    56         for(;x<b;){
    57             if(d<0){
    58                 x++;
    59                 y++;
    60                 d+=da2;
    61             }else{
    62                 x++;
    63                 d+=da1;
    64             }
    65             SetPixel(ROUND(x1-x),ROUND(y+y1),color);
    66         }
    67     }else if(x1<x2 && y1>y2){
    68         a=-y1;
    69         b=x2-x1;
    70         x=0,y=0;
    71         d=2*a+b;
    72         da1=2*a;
    73         da2=2*(a+b);
    74 
    75         SetPixel(ROUND(x2-x),ROUND(y+y2),color);
    76         for(;x<b;){
    77             if(d<0){
    78                 x++;
    79                 y++;
    80                 d=d+da2;
    81             }else{
    82                 x++;
    83                 d+=da1;
    84             }
    85             SetPixel(ROUND(x2-x),ROUND(y+y2),color);
    86         }
    87     }
    88 }

    参考来源: 《计算机图形学实用教程(第三版)· 苏小红 编著》

  • 相关阅读:
    xpath 获取表单的值
    更改Linux语言环境
    推送证书p12文件转换成pem的命令
    隐藏响应的server,X-Powered-By
    多维数组自定义排序
    Docker:Windows7下使用docker toolbox(1)
    FluentScheduler:开源轻量级定时任务调度架构
    IdentityServer3:.NET开源OpenID和OAuth2架构
    .NET拾忆:FormData文件上传
    正则表达式:各类数值
  • 原文地址:https://www.cnblogs.com/JDomain/p/6555806.html
Copyright © 2020-2023  润新知