1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
typedef struct Point {    //좌표 하나를 나타내는 구조체
    int x;
    int y;
} Point;
 
//현재 커서를 x,y 좌표로 옮기는 함수.
//만일 x나 y중 하나의 값이라도 현재 콘솔의 화면 버퍼 크기를 넘어서면 작동을 안함.
//"mode con: 을 소스에서 검색해보면 버퍼 최대크기를 알 수 있음. 최대크기 -1 까지가 한계다.
void gotoXY(int x, int y)
{
    COORD coordinates = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coordinates);
}
 
//두 Point변수의 주소를 입력하면 (두 좌표가 형성하는) 선분 위의 모든 좌표들에 입력한 문자변수ch를 출력한다.
//이 때 두 좌표 그 자체에도 ch가 출력된다.(선분을 이루는 점까지 출력)
void drawLine(const Point *p1,const Point *p2, char ch)
{    
    
    int x1 = (p1->x), y1 = (p1->y);    //p1
    int x2 = (p2->x), y2 = (p2->y);    //p2
    //일차함수 y = a*x + b
    float a;//기울기
    float b;//y절편
    
    int length, i;//length는 선분의 길이. 선분을 이루는 점까지 포함한다.
    
    if(x1 == x2  &&  y1 == y2){
        gotoXY(x1, y1);
        _putch(ch);
        return;
    }
    
    if(x2 - x1){
        a = (float)(y2 - y1) / (float)(x2 - x1);
        b = (float)y1 - a*(float)x1;
    }else{//기울기가 무한일 때의 예외처리.( /0 처리) 
        
        length = y2 - y1;//x값 차이는 0이기에 y기준으로 출력된다.
        
        if(length > 0){
            for(i =    0; i <= abs(length); i++){//두 점까지 포함시키기 위해 0~length까지다.
                gotoXY( x1, y1+i );//x값은 y=ax+b에서 x를 묶어내어 x=(y-b)/a이다.
                _putch(ch);
            }
        }else{
            for(i =    0; i <= abs(length); i++){
                gotoXY( x1, y2+i );
                _putch(ch);
            }
        }
 
        return;
    }
 
    //좌표간의 차이가 큰 놈으로 출력한다. 그래야 점선이 출력되지 않는다.
    if( abs(x2 - x1) > abs(y2 - y1) ){                                        //x기준 출력
        length = x2 - x1;    //'선분+두 점'의 길이보다 1이 작다.
        
        if(length > 0){
            for(i =    0; i <= abs(length); i++){//두 점까지 포함시키기 위해 0~length까지다.
                gotoXY(x1+i, round( a*(x1+i) + b ) );//y값은 일차식 y=ax+b를 내린 값이다.
                
                _putch(ch);
            }
        }else{
            for(i =    0; i <= abs(length); i++){
                gotoXY(x2+i, round( a*(x2+i) + b ) );
                _putch(ch);
            }
        }
    }else{                                                                    //y기준 출력
        length = y2 - y1;
        
        if(length > 0){
            for(i =    0; i <= abs(length); i++){//두 점까지 포함시키기 위해 0~length까지다.
                gotoXY(  round( (y1+- b)/a ), y1+i  );//x값은 y=ax+b에서 x를 묶어내어 x=(y-b)/a이다.
                _putch(ch);
            }
        }else{
            for(i =    0; i <= abs(length); i++){
                gotoXY(  round( (y2+- b)/a ), y2+i  );
                _putch(ch);
            }
        }
        // a==0일때의 예외처리가 필요 없는 이유가, a==0일 때는 y가 같을 때인데 이때는 x를 기준으로 출력하기 때문이다. 이쪽 블럭으로는 오지도 않는다는 말.
    }
    
}
 
//반올림 함수. 입력한 값을 소수 첫째자리에서 반올림하여 정수값으로 만든다.
int round(double num)
{
    double decimal = num - (int)num;
 
    if(decimal >= 0.5)    return (int)num+1;
    else    return (int)num;
}
cs


성공적.

문제가 되는 부분이나 거슬리는 부분은 지적 부탁드립니다!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int main(){
    Point pointArr_1[10]=
    {
        {0,80},
        {10,70},
        {20,60},
        {40,50},
        {60,40},
        {70,30},
        {60,20},
        {50,10},
        {30,0},
        {10,10},
    };
    Point p2 = {30,30};
 
    int i;
    
    //drawLine함수 실험, 성공적!!
 
    for(i = 0; i < 10; i++){
        drawLine(pointArr_1 + i, &p2, '#');
    }
    
    _getch();//계속하려면 아무키나.. 지워두림
 
    
 
 
    return 0;
}
cs

성게 소환