C# ARC, 호 그리기

Eden·2022년 12월 20일
0

속도 계기판을 그리고 싶은데 기존 제공하는 기능들로 깔끔한 호를 그리기 어려워 이방법 저방법 찾아보다가 직접 그리는 방법을 선택했다.

public double Line_Thickness = 0.7; 
public double ThicknessDiff= 1.7;
public double StartLine = 20;
public double PointerLineLength = 5;
public double PointerLineThickness = 4;
public int L_unit = 10;
public int S_unit  = 1;
public double S_Length = 2;
public double L_Length = 7;
public int AngleRange ; 
public int InitAngle;
public int ZeroPoint = 0;
public int CenterX;
public int CenterY;
public double Fontsize = 10;
public int FontMove = 0;
public int PointerAngle = 0;
public bool NumAbs = true;
public int InitAngleNumber = 0;
public void DrawARCPanel_Center(Canvas Canvas)
{
	DrawARCGraduation_Center(Canvas); // 호영역
    DrawARCNumber_Center(Canvas); // 숫자 부분
    DrawARCPointer_Center(Canvas); // 포인터 부분
}

public void DrawARCGraduation_Center(Canvas Canvas)
{ 
	int InitAngle_ = InitAngle;

	Line[] Lines = new Line[AngleRange + 1];
    for (int i = 0; i <= AngleRange; i++)
    {
    	if (i < 360)
        { 
        	Lines[i] = new Line
            {
            	X1 = CenterX,
                Y1 = 40 - StartLine,
                X2 = CenterX,
                Stroke = MainLineColor
            };

			if (i % L_unit == 0)
            {
            	Lines[i].StrokeThickness = Line_Thickness + ThicknessDiff;
                Lines[i].Y2 = 40 - StartLine - L_Length;
                if (InitAngle_ == ZeroPoint)
                {
                	Lines[i].Stroke = ZeroPointColor;
                    Lines[i].StrokeThickness = Line_Thickness + ThicknessDiff;
                }
                Lines[i].RenderTransform = new RotateTransform(InitAngle_, CenterX, CenterY);

				Canvas.Children.Add(Lines[i]);
                Canvas.SetLeft(Lines[i], 10);
                Canvas.SetTop(Lines[i], 10);
            }
            else if(i % S_unit == 0)
            {
            	Lines[i].StrokeThickness = Line_Thickness;
                Lines[i].Y2 = 40 - StartLine - S_Length;
                Lines[i].Stroke = SubLineColor;
                Lines[i].RenderTransform = new RotateTransform(InitAngle_, CenterX, CenterY);

				Canvas.Children.Add(Lines[i]);
                Canvas.SetLeft(Lines[i], 10);
                Canvas.SetTop(Lines[i], 10);
            }
            InitAngle_++;
        } 
	}
} 
public void DrawARCNumber_Center(Canvas Canvas)
{
	int InitAngle_ = InitAngle ;
    // 호 영역



	Line[] Lines = new Line[AngleRange + 1];
    for (int i = 0; i <= AngleRange; i += L_unit)
    {
    	if (i <360)
        {
        
        	textBlock = new TextBlock();
            textBlock.FontSize = Fontsize;
            textBlock.TextAlignment = TextAlignment.Center;
            if (NumAbs == true)
            {
            	textBlock.Text = ((Math.Abs(InitAngleNumber + i) % 360).ToString());
            }
            else
            {
            	textBlock.Text = ((InitAngleNumber + i )% 360).ToString();
            }
            Size size = MeasureString(textBlock.Text);
            double TextWidth = size.Width;
            textBlock.Foreground = TextColor;
            textBlock.Margin = new Thickness(0, 0, 0, 0);
            textBlock.RenderTransform = new RotateTransform(InitAngle_, TextWidth / 2, CenterY + StartLine -20 + textBlock.FontSize * 0.5 + FontMove);
            Canvas.Children.Add(textBlock);
            Canvas.SetLeft(textBlock, 10  + CenterX - TextWidth / 2);
            Canvas.SetTop(textBlock, -StartLine + 30 - textBlock.FontSize * 0.5 - FontMove);
            
            InitAngle_ += L_unit;
        }
	}
}
public void DrawARCPointer_Center(Canvas Canvas)
{
    // 바늘영역
    Line line = new Line();
    line.Stroke = PointerColor;
    line.StrokeThickness = PointerLineThickness;
    line.X1 = CenterX;
    line.Y1 = - StartLine + 40;
    line.X2 = CenterX;
    line.Y2 = - StartLine + 40 + PointerLineLength;
    line.RenderTransform = new RotateTransform(PointerAngle, CenterX, CenterY);
    Canvas.Children.Add(line);
    Canvas.SetLeft(line, 10);
    Canvas.SetTop(line, 10);

}

쉽게 적용해서 원하는 패널을 만들도록하는 하는 간단한 프로그램을 만들어 보았다

profile
주섬주섬..

0개의 댓글