画图 利用gdi怎么画夹角

c# 利用GDI+,动态给出这三个点,顶点o,上边坐标点a,下边坐标点b,,怎么画出带角度的夹角呢,如下图的样式,请帮忙给出Demo谢谢

img

要画带角度的夹角,需要使用GDI+中的绘图类Graphics和Pen来绘制直线和角度标识。

以下是C#代码示例,其中oPoint,aPoint和bPoint分别代表顶点、上边坐标点和下边坐标点:

private void DrawAngle(Point oPoint, Point aPoint, Point bPoint, Graphics graphics, Pen pen)
{
    // 计算角度
    double angle = Math.Atan2(aPoint.Y - oPoint.Y, aPoint.X - oPoint.X) - Math.Atan2(bPoint.Y - oPoint.Y, bPoint.X - oPoint.X);
    angle = angle * 180 / Math.PI;
    if (angle < 0) angle += 360;
    
    // 绘制直线
    graphics.DrawLine(pen, oPoint, aPoint);
    graphics.DrawLine(pen, oPoint, bPoint);
    
    // 绘制角度标识
    string angleText = angle.ToString("0.0") + "°";
    Font font = new Font("Arial", 10);
    SizeF textSize = graphics.MeasureString(angleText, font);
    PointF textPoint = new PointF(oPoint.X + 20, oPoint.Y - textSize.Height);
    graphics.DrawString(angleText, font, Brushes.Black, textPoint);
    
    // 绘制角度弧线
    RectangleF rect = new RectangleF(oPoint.X - 50, oPoint.Y - 50, 100, 100);
    float startAngle = (float)Math.Atan2(bPoint.Y - oPoint.Y, bPoint.X - oPoint.X) * 180 / (float)Math.PI;
    float sweepAngle = (float)angle;
    graphics.DrawArc(pen, rect, startAngle, sweepAngle);
}

在使用此方法时,需要在Paint事件中调用它,并传递Graphics对象和Pen对象,例如:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Pen pen = new Pen(Color.Black, 2);
    Point oPoint = new Point(100, 100);
    Point aPoint = new Point(200, 50);
    Point bPoint = new Point(200, 150);
    DrawAngle(oPoint, aPoint, bPoint, e.Graphics, pen);
}

这将在Form1窗体中绘制带角度标识的夹角。

DrawArc绘制弧度
DrawString绘制文字
MoveTo LineTo绘制线段
坐标你就自己算算了。

引用chatgpt内容作答:
当使用C#的GDI+库来画夹角时,你可以通过以下步骤来实现:

1、创建一个PictureBox控件,用于显示绘制的图形。
2、在绘制事件处理程序中,使用GDI+绘制夹角的线和标记。
3、根据给定的顶点和边的坐标,计算夹角的大小,并将角度值显示在标记上。
下面是一个简单的示例代码,演示如何使用GDI+在C#中绘制带角度的夹角:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace AngleDrawingDemo
{
    public partial class MainForm : Form
    {
        private Point o, a, b;

        public MainForm()
        {
            InitializeComponent();

            o = new Point(150, 200);
            a = new Point(100, 100);
            b = new Point(200, 150);

            pictureBox.Paint += PictureBox_Paint;
        }

        private void PictureBox_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            // Draw lines
            g.DrawLine(Pens.Black, o, a);
            g.DrawLine(Pens.Black, o, b);

            // Calculate angle
            double angleRad = Math.Atan2(b.Y - o.Y, b.X - o.X) - Math.Atan2(a.Y - o.Y, a.X - o.X);
            double angleDeg = angleRad * (180 / Math.PI);
            if (angleDeg < 0) angleDeg += 360;

            // Draw angle label
            string angleText = angleDeg.ToString("F2") + "°";
            PointF labelPosition = new PointF(o.X + 10, o.Y - 20);
            g.DrawString(angleText, Font, Brushes.Black, labelPosition);
        }

        private void MainForm_Paint(object sender, PaintEventArgs e)
        {
            pictureBox.Invalidate();
        }

        private void MainForm_Resize(object sender, EventArgs e)
        {
            pictureBox.Invalidate();
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

在这个示例中,我们在PictureBox的绘制事件中使用GDI+绘制夹角的两条线和角度标记。夹角的计算使用了反正切函数。在窗体中,你可以通过拖拽顶点和边的坐标来改变夹角,绘制会根据新的坐标和角度自动更新。

这只是一个简单的示例,你可以根据自己的需求进行进一步的美化和优化。

【以下回答由 GPT 生成】

对于这个问题,我们可以按照以下步骤来实现:

  1. 创建一个Windows窗体应用程序或者控制台应用程序。

  2. 添加GDI命名空间至代码文件的顶部:

using System.Drawing;
using System.Windows.Forms;
  1. 创建一个继承自Form类的自定义窗体(如果是控制台应用程序则跳过此步骤):
public class AngleForm : Form
{
    // 在这里定义你的应用程序逻辑和绘图代码
}
  1. 在自定义窗体的构造方法中初始化窗体,并添加一个Paint事件处理程序:
public AngleForm()
{
    // 窗体的初始化设置
    this.Width = 500;
    this.Height = 500;

    // 添加Paint事件处理程序
    this.Paint += AngleForm_Paint;
}

// Paint事件处理程序,用于绘制夹角
private void AngleForm_Paint(object sender, PaintEventArgs e)
{
    // 获取绘图对象
    Graphics g = e.Graphics;

    // 根据顶点O、上边坐标点A和下边坐标点B计算夹角的坐标
    Point O = new Point(250, 250);
    Point A = new Point(250, 200);
    Point B = new Point(200, 250);
    Point C = new Point(A.X + (B.X - A.X) / 2, A.Y + (B.Y - A.Y) / 2);

    // 绘制顶点O、上边坐标点A和下边坐标点B
    g.FillEllipse(Brushes.Red, O.X - 5, O.Y - 5, 10, 10);
    g.FillEllipse(Brushes.Blue, A.X - 5, A.Y - 5, 10, 10);
    g.FillEllipse(Brushes.Green, B.X - 5, B.Y - 5, 10, 10);

    // 使用线段连接顶点O、上边坐标点A和顶点O、下边坐标点B
    g.DrawLine(Pens.Black, O, A);
    g.DrawLine(Pens.Black, O, B);

    // 计算射线AO和射线BO的方向向量
    float angleA = (float)Math.Atan2(A.Y - O.Y, A.X - O.X);
    float angleB = (float)Math.Atan2(B.Y - O.Y, B.X - O.X);

    // 计算夹角角度
    float angle = angleB - angleA;

    // 根据计算得到的夹角角度绘制夹角线段
    g.DrawLine(Pens.Red, O, C);
    g.DrawString(angle.ToString("0.00"), this.Font, Brushes.Black, C);
}
  1. 在程序的入口点(Main方法)创建并运行这个窗体(或者直接显示控制台应用程序的结果):
static void Main()
{
    Application.Run(new AngleForm());
}

通过进行上述步骤,我们就可以创建出一个简单的C#应用程序,绘制给定的三个点,并根据计算得到的夹角角度绘制夹角线段。请根据您的需求进行必要的修改和完善。

请注意,以上代码是一个示例Demo,仅提供了如何使用GDI在C#中绘制带有角度的夹角的基本思路,具体的实现细节可能因个人需求和环境而有所变化。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

DrawArc绘制弧度
DrawString绘制文字
MoveTo LineTo绘制线段
坐标你就自己算算了。

C#中基于GDI+(Graphics)图像处理系列之任意角度旋转图像_c# graphics 旋转_米儿不可爱的博客-CSDN博客 C#中基于GDI+(Graphics)图像处理系列之任意角度旋转图像简介图像旋转功能在实际使用中出现得不多,Image自带RotateFlip方法可以简单的实现90、180等角度的旋转或者翻转,但是如果要实现任意角度的旋转该怎么做?对于一个有经验的同学估计不到半天时间就可以完成,如果让新手遇到,估计就傻了,毕竟里面涉及了三角函数、空间坐标等方面的知识,比较蛋疼的是,Graphics(或者矩形)的旋转变换都是以左上角为原点,如果要以其中心进行旋转该怎么做?想知道的话就继续往后看吧。本文将重点向大家介绍怎_c# graphics 旋转 https://blog.csdn.net/weixin_41203450/article/details/118101503?ops_request_misc=&request_id=&biz_id=102&utm_term=gdi%E6%80%8E%E4%B9%88%E7%94%BB%E5%A4%B9%E8%A7%92&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-118101503.142^v92^controlT0_1&spm=1018.2226.3001.4187