zoukankan      html  css  js  c++  java
  • 中点画线算法

    中点画线算法(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 }

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

  • 相关阅读:
    316 Remove Duplicate Letters 去除重复字母
    315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
    313 Super Ugly Number 超级丑数
    312 Burst Balloons 戳气球
    309 Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
    Java 类成员的初始化顺序
    JavaScript 全局
    HTML字符实体
    Java中的toString()方法
    JavaScript 弹窗
  • 原文地址:https://www.cnblogs.com/JDomain/p/6555806.html
Copyright © 2011-2022 走看看