IT/C#

[C#] Mouse Event를 통해서 Picturebox 포인트 사이 거리 구하기

Ella.J 2019. 5. 31. 17:55
728x90
반응형

PictureBox Mouse Drag로 사각형 그리기

PictureBox 클릭 시 마우스 포지션 가져오기

두 포인트 사이에 거리 계산하기

MouseDown, MouseMove, MouseUp Event


 

마우스 다운 이벤트(picturebox1_MouseDown)에서의 시작 포인트( X1, Y1 ) 값과

마우스 업 이벤트(picturebox1_MouseUp)에서의 마지막 포인트( X2, Y2 ) 값을 통해

각 포인트 사이의 거리, 즉, 표시된 사각형의 대각선 길이를 구하는 코드이다.

 

두 포인트 사이의 거리는 우리가 잘 알고 있는 수학공식을 이용하여 계산하였다.

이를 코드로 나타내면 아래와 같다.

double distance = Math.Sqrt(Math.Pow((e.X - clickPoint.X), 2) + Math.Pow((e.Y - clickPoint.Y), 2));

 

그리고, 사각형을 그리기 위한 코드에서

시작 포인트와 마지막 포인트를 비교하여 X, Y 값이 작은 것을 기준으로 그려야 한다.

g.DrawRectangle(pn, e.X(두 포인트 중 작은 X), e.Y(두 포인트 중 작은 Y)wh);

 

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
private float zoomRatio = 1.0f;
private double recRatio = 3.6875;
private Point clickPoint;
 
private void picturebox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
         //마우스 버튼 다운 시 처음 시작 포인트 저장하기
        clickPoint = new Point(e.X, e.Y);
    }
    picturebox1.Invalidate(); //다음 사각형 그리기 위해 Invalidate() 호출
}
 
private void picturebox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
         //움직일 때마다 포지션 값 라벨에 표시하기
        lblPosition.Text = $"X : {e.X}, Y : {e.Y}";
 
        Pen pn = new Pen(Color.Black); //라인을 그릴 펜
        Graphics g = picturebox1.CreateGraphics(); //picturebox1에 대한 Graphics 생성
 
         //사각형 그리기 (시작 포인트와 마지막 포인트에 따라 사각형 그리는게 달라짐)
        float w = Math.Abs(clickPoint.X - e.X);
        float h = Math.Abs(clickPoint.Y - e.Y);
        if (e.X > clickPoint.X)
        {
            if (e.Y > clickPoint.Y) g.DrawRectangle(pn, clickPoint.X, clickPoint.Y, w, h);
            else g.DrawRectangle(pn, clickPoint.X, e.Y, w, h);
        }
        else
        {
            if (e.Y > clickPoint.Y) g.DrawRectangle(pn, e.X, clickPoint.Y, w, h);
            else g.DrawRectangle(pn, e.X, e.Y, w, h);
        }
        
        picturebox1.Invalidate(); //움직일때마다 사각형 새로 그려야 하므로 Invalidate() 호출
    }
}
 
private void picturebox1_MouseUp(object sender, MouseEventArgs e)
{
        Pen pn = new Pen(Color.Black); //라인을 그릴 펜
        Graphics g = picturebox1.CreateGraphics(); //picturebox1에 대한 Graphics 생성
 
         //사각형 그리기 (시작 포인트와 마지막 포인트에 따라 사각형 그리는게 달라짐)
        float w = Math.Abs(clickPoint.X - e.X);
        float h = Math.Abs(clickPoint.Y - e.Y);
        if (e.X > clickPoint.X)
        {
            if (e.Y > clickPoint.Y) g.DrawRectangle(pn, clickPoint.X, clickPoint.Y, w, h);
            else g.DrawRectangle(pn, clickPoint.X, e.Y, w, h);
        }
        else
        {
            if (e.Y > clickPoint.Y) g.DrawRectangle(pn, e.X, clickPoint.Y, w, h);
            else g.DrawRectangle(pn, e.X, e.Y, w, h);
        }
 
        //대각선 거리 구하기
        double distance = Math.Sqrt(Math.Pow((e.X - clickPoint.X), 2+ Math.Pow((e.Y - clickPoint.Y), 2));
        distance = distance / recRatio; //실제 비율 맞추기
        lblPosition.Text = $"DISTANCE={distance.ToString(".####")}mm";
}
 
cs

 

 

728x90
반응형