Как нарисовать стрелку между двумя изображениями в WinForms? - PullRequest
1 голос
/ 05 декабря 2010

Я должен сделать это: нарисовать стрелку между двумя изображениями из моего холста, поэтому, когда я нажимаю кнопку со стрелкой на ней и нажимаю на одно изображение, чтобы вставить стрелку на нем, а затем нарисовать стрелкустолько, сколько мне нужно, и приклеить его ко второму изображению.

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

У вас есть две точки, поэтому вы можете нарисовать линию. Попробуйте это:

public class Shape
{
    public float X { get; set; }
    public float Y { get; set; }
    public Image Image { get; set; }
}

public class Line
{
    public Shape A { get; set; }
    public Shape B { get; set; }
}

и код:

private string _currentTool;
private readonly List<Shape> _shapes;
private readonly List<Line> _lines;
private Line _currentLine;

private void Button1Click(object sender, EventArgs e)
{
    _currentTool = "img";
}

private void Button2Click(object sender, EventArgs e)
{
    _currentTool = "line";
}

private void PictureBox1MouseDown(object sender, MouseEventArgs e)
{
    switch (_currentTool)
    {
        case "img":
            _shapes.Add(new Shape { Image = button1.Image, X = e.X, Y = e.Y });
            pictureBox1.Invalidate();
            break;
        case "line":
                var selectedShapes = _shapes.Where(shape => (shape.X - 10 < e.X) && (e.X < shape.X + 10) &&
                                                           (shape.Y - 10 < e.Y) && (e.Y < shape.Y + 10));
                if (selectedShapes.Count() > 0)
                {
                    var selectedShape = selectedShapes.First();
                    _currentLine = new Line {A = selectedShape};
                    pictureBox1.Invalidate();
                }
            break;
    }
}

private void PictureBox1MouseUp(object sender, MouseEventArgs e)
{
    switch (_currentTool)
    {
        case "line":
                var selectedShapes = _shapes.Where(shape => (shape.X - 10 < e.X) && (e.X < shape.X + 10) &&
                                                           (shape.Y - 10 < e.Y) && (e.Y < shape.Y + 10));
                if (selectedShapes.Count() > 0)
                {
                    var selectedShape = selectedShapes.First();
                    _currentLine.B = selectedShape;
                    _lines.Add(_currentTool);
                    pictureBox1.Invalidate();
                }
            break;
    }
}

private void PictureBox1Paint(object sender, PaintEventArgs e)
{
    foreach (var shape in _shapes)
    {
        e.Graphics.DrawImage(shape.Image, shape.X, shape.Y);
    }
    foreach (var line in _lines)
    {
        e.Graphics.DrawLine(new Pen(Color.Black), line.A.X, line.A.Y, line.B.X, line.B.Y);
    }
}
1 голос
/ 06 декабря 2010

Чтобы нарисовать дугу с двумя точками, вам понадобится предопределенный угол.Я предполагаю, что у вас есть эта часть выяснена.

Для этого вам нужно нарисовать две дуги, по одной на каждом изображении.Дуга будет больше, чем каждое изображение, но на первом изображении вы можете просто обрезать его там, где дуга выходит из изображения, идущего ко второй точке.

Во втором изображении необходимо сместить дугу нах и у расстояние между источниками двух изображений.Затем нарисуйте дугу во втором изображении от первой точки ко второй точке и обрежьте ту часть, которая находится за пределами изображения.

Если вам нужна дуга с резинкой, вам придется стирать и перерисовывать ее всякий раз, когдамышь движется.Если вы хотите нарисовать пространство в форме между изображениями, вы можете сделать это, используя правильное смещение.

0 голосов
/ 08 декабря 2010
public class Shape
{
public float X { get; set; }
public float Y { get; set; }
public Image Image { get; set; }

public bool Test_int(int x, int y)
    {
        if (((x <= this.x + (float)image.Width) && (x >= this.x)) && ((y <= this.y + (float)image.Height) && (y >= this.y)))
            return true;
        else
            return false;
    }
}



public class Line
{
    public Shape A { get; set; }
    public Shape B { get; set; }
}

и код

private string currentTool;
private readonly List<Shape> shapes;
private readonly List<Line> lines;
private Line currentLine;

private void Button1Click(object sender, EventArgs e)
{
    currentTool = "img";
}

private void Button2Click(object sender, EventArgs e)
{
    currentTool = "line";
}


private void PictureBox1MouseDown(object sender, MouseEventArgs e)
{

    switch (currentTool)
    {
        case "img":
            shapes.Add(new Shape { Image = button1.Image, X = e.X, Y = e.Y });
            pictureBox1.Invalidate();
            break;
        case "line":
            foreach (Shape shape1 in shapes)
                {

                    if (shape1.Test_int(e.X, e.Y))
                    {

                        currentLine = new Line { A = shape1 };

                    }

                }
                drawArea1.Invalidate();
        break;
    }
}

private void PictureBox1MouseUp(object sender, MouseEventArgs e)
{

    switch (currentTool)
    {
        case "line":
            foreach (Shape shape1 in shapes)
            {

                if (shape1.Test_int(e.X, e.Y))
                {


                    currentLine.B = shape1;

                    }

                }
                lines.Add(currentLine);
                drawArea1.Invalidate();

            break;
    }
}

private void PictureBox1Paint(object sender, PaintEventArgs e)
{

    foreach (var shape in shapes)
    {
        e.Graphics.DrawImage(shape.Image, shape.X, shape.Y);
    }
    foreach (var line in lines)
    {
        Pen p = new Pen(Color.Gray, 1);
        Pen p2 = new Pen(Color.Black, 5);

        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

        p2.StartCap = System.Drawing.Drawing2D.LineCap.Round;
        p2.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;

        float x1 = line.A.X+line.A.Image.Width ;
        float y1 = line.A.Y+line.A.Image.Height/2;
        float x2 = line.B.X;
        float y2 = line.B.Y+line.B.Image.Height/2;
        double angle = Math.Atan2(y2 - y1, x2 - x1);

        e.Graphics.DrawLine(p, x1, y1, x2, y2);
        e.Graphics.DrawLine(p2, x2, y2, x2 + (float)(Math.Cos(angle)), y2 + (float)(Math.Sin(angle)));

    }
}
...