2011-11-16 1 views
0

그래서 몇 가지 객체, 원형 사각형 또는 선을 그렸습니다. - 예를 들어 - 색상을 변경하거나 회전 내가 이미지를 그려 후그려진 객체를 회전합니다

Graphics surface = this.splitContainer1.Panel2.CreateGraphics(); 
Pen pen1 = new Pen(ColorR.BackColor, float.Parse(boxWidth.Text)); 

switch (currentObject) 
{ 
case "line": 
    if (step == 1) 
    { 
     splitContainer1.Panel2.Focus(); 
     one.X = e.X; 
     one.Y = e.Y; 
     boxX.Text = one.X.ToString(); 
     boxY.Text = one.Y.ToString(); 
     step = 2; 
    } 
    else 
    { 
     two.X = e.X; 
     two.Y = e.Y; 
     boxX2.Text = two.X.ToString(); 
     boxY2.Text = two.Y.ToString(); 
     surface.DrawLine(pen1, one, two); 
     step = 1; 
    } 
    break; 

case "circle": 
    if (step == 1) 
    { 
     boxX.Text = e.X.ToString(); 
     boxY.Text = e.Y.ToString(); 
     step = 2; 
    } 
    else 
    { 
     int tempX = int.Parse(boxX.Text); 
     int tempY = int.Parse(boxY.Text); 
     int tempX2 = e.X; 
     int tempY2 = e.Y; 
     int sideX, sideY; 
     if (tempX > tempX2) 
     { 
      sideX = tempX - tempX2; 
     } 
     else 
     { 
      sideX = tempX2 - tempX; 
     } 

     if (tempY > tempY2) 
     { 
      sideY = tempY - tempY2; 
     } 
     else 
     { 
      sideY = tempY2 - tempY; 
     } 

     double tempRadius; 
     tempRadius = Math.Sqrt(sideX * sideX + sideY * sideY); 
     tempRadius *= 2; 

     bWidth.Text = bHeight.Text = Convert.ToInt32(tempRadius).ToString(); 

     surface.DrawEllipse(
      pen1, 
      int.Parse(boxX.Text) - int.Parse(bWidth.Text)/2, 
      int.Parse(boxY.Text) - int.Parse(bHeight.Text)/2, 
      float.Parse(bWidth.Text), float.Parse(bHeight.Text)); 
     step = 1; 
    } 
    break; 

case "square": 
    if (step == 1) 
    { 
     boxX.Text = e.X.ToString(); 
     boxY.Text = e.Y.ToString(); 
     step = 2; 
    } 
    else if (step == 2) 
    { 
     int tempX = e.X; 
     if (tempX > int.Parse(boxX.Text)) 
     { 
      bWidth.Text = (tempX - int.Parse(boxX.Text)).ToString(); 
     } 
     else 
     { 
      bWidth.Text = (int.Parse(boxX.Text) - tempX).ToString(); 
     } 

     step = 3; 
    } 
    else 
    { 
     int tempY = e.Y; 
     if (tempY > int.Parse(boxY.Text)) 
     { 
      bHeight.Text = (tempY - int.Parse(boxY.Text)).ToString(); 
     } 
     else 
     { 
      bHeight.Text = (int.Parse(boxY.Text) - tempY).ToString(); 
     } 

     surface.DrawRectangle(
      pen1, 
      int.Parse(boxX.Text), 
      int.Parse(boxY.Text), 
      int.Parse(bWidth.Text), 
      int.Parse(bHeight.Text)); 
     step = 1; 
    } 

    break; 
} 

그래서, 나는 그림을 선택하고 할 수 있도록하려면이 내가 이미지를 그리는 데 사용하는 코드입니다. 그러나 나는 그것을하는 방법을 이해하는 것 같습니다.

+0

이 질문 함께 할 수 없다,하지만 당신은 당신의 코드를 개선에 관심이 있다면, 여기 좀 걸릴 : [http://stackoverflow.com/questions/126409/ways-to를 -eliminate-switch-in-code] (http://stackoverflow.com/questions/126409/ways-to-eliminate-switch-in-code) –

답변

1

그래픽 객체에 그 자체를 그리는 방법, 점이 안에 있는지/선택할 수 있어야하는지 여부를 나타내는 방법 등 모든 모양에서 제공해야하는 메서드를 가진 기본 추상 모양 클래스를 정의하는 것이 좋습니다. 주어진 양만큼 회전하는 방법과 색상을 변경하는 방법.

일단 모양 클래스를 얻으면 각 파생 모양의 메서드를 채우는 방법을 알아야합니다. 드로잉에 이미 코드가 있습니다. 그것을 선택하기 위해서는 모양에 따라 달라질 것입니다. 원과 같이 무언가를 원할 경우 원의 중심과 클릭 한 점 사이의 거리를 계산하면됩니다. 사용자가 정확하게 클릭하지 않아도되도록 선이 더 힘들어집니다.

색상이 변하고 회전합니다. 색상을 변경하는 것은 쉽습니다. Shape 클래스에 Color 속성 만 있으면 모양을 그릴 때 해당 색상을 사용하여 브러시 또는 펜을 만듭니다.

로테이션은 Graphics.RotateTransform입니다.


public abstract class Shape 
{ 
    public Color Color { get; set; } 
    public float Rotation { get; set; } 
    public Point Position { get; set; } 

    public Shape(Color color, float rotation, Point position) 
    { 
     Color = color; 
     Rotation = rotation; 
     Position = position; 
    } 

    public void ChangeRotation(float amount) 
    { 
     Rotation += amount; 
    } 

    public abstract void Draw(Graphics graphics); 
    public abstract bool WithinBounds(Point point); 
} 

public class Circle : Shape 
{ 
    public float Radius { get; set; } 

    public Circle(Color color, float rotation, Point position) 
     :base(color, rotation, position) 
    { 

    } 

    public override void Draw(Graphics graphics) 
    { 

    } 

    public override bool WithinBounds(Point point) 
    { 
     if (Math.Sqrt(Math.Pow(point.X - Position.X, 2) + Math.Pow(point.Y - Position.Y, 2)) <= Radius) 
      return true; 
     else 
      return false; 

     // Note, if statement could be removed to become the below: 
     //return Math.Sqrt(Math.Pow(point.X - Position.X, 2) + Math.Pow(point.Y - Position.Y, 2)) <= Radius; 
    } 
} 
0

Graphics 객체의 RotateTransform 메소드를 살펴보십시오. TranslateTransform 메소드도 있습니다.