1

我必须这样做:在画布上的两个图像之间绘制一个箭头,因此当我单击带有箭头的按钮并单击一个图像以将箭头粘贴在其上然后绘制箭头时我需要并将其粘贴到第二个图像。

4

3 回答 3

1

你有两个点,所以你可以画一条线。尝试这个:

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);
    }
}
于 2010-12-06T04:27:35.887 回答
1

要绘制带有两点的圆弧,您需要一个预定义的角度。我假设你已经弄清楚了那部分。

为此,您需要绘制两条弧线,每张图像中都有一条。弧线将比每个图像都大,但在第一张图像中,您可以将其剪辑在弧线离开图像朝向第二点的位置。

在第二个图像中,您需要将弧偏移两个图像原点之间的 x 和 y 距离。然后在第二个图像中从第一个点到第二个点绘制弧线,并剪切图像外部的那部分。

如果您需要橡皮筋弧线,则必须在鼠标移动时擦除并重新绘制它。如果您想在图像之间的表格上绘制空间,您可以使用适当的偏移量来做到这一点。

于 2010-12-06T01:20:27.233 回答
0
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)));

    }
}
于 2010-12-07T23:53:55.023 回答