C# 贝塞尔曲线逆

C# 贝塞尔曲线逆,c#,bezier,C#,Bezier,我是C#和一般编码的初学者。我写了三次贝塞尔曲线的算法,但现在我的下一个任务是对三次贝塞尔曲线求逆,这对我来说很难。它应该是这样的,在画了4个控制点之后,第三个控制点的直线应该继续,当我们在这条线上放置新的控制点时(连接控制点的直线),我们应该能够继续绘制贝塞尔曲线 using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System

我是C#和一般编码的初学者。我写了三次贝塞尔曲线的算法,但现在我的下一个任务是对三次贝塞尔曲线求逆,这对我来说很难。它应该是这样的,在画了4个控制点之后,第三个控制点的直线应该继续,当我们在这条线上放置新的控制点时(连接控制点的直线),我们应该能够继续绘制贝塞尔曲线

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _12_CubicBezier
{
    public partial class Form1 : Form
    {
        Graphics g;
        int s = 6;
        int gotcha = -1;
        List<PointF> P = new List<PointF>();


        Pen pPoint = Pens.Black;
        Pen pTangent = Pens.Black;
        Pen pCurve = new Pen(Color.Blue, 3.0f);

        Brush bPoint;

        public Form1()
        {
            InitializeComponent();
            bPoint = new SolidBrush(Canvas.BackColor);
        }

        private void Canvas_Paint(object sender, PaintEventArgs e)
        {
            g = e.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            for (int i = 0; i < P.Count - 1; i++)
                g.DrawLine(pTangent, P[i], P[i + 1]);

            if (P.Count == 4)
                DrawBezier();

            for (int i = 0; i < P.Count; i++)
            {
                g.FillEllipse(bPoint, P[i].X - s, P[i].Y - s, 2 * s, 2 * s);
                g.DrawEllipse(pPoint, P[i].X - s, P[i].Y - s, 2 * s, 2 * s);
            }
        }
        private void Canvas_MouseDown(object sender, MouseEventArgs e)
        {
            for (int i = 0; i < P.Count; i++)
            {
                if (Math.Abs(P[i].X - e.X) <= s && Math.Abs(P[i].Y - e.Y) <= s)
                    gotcha = i;
            }          

            if (gotcha == -1 && P.Count < 4)
            {
                P.Add(e.Location);
                gotcha = P.Count - 1;
                Canvas.Invalidate();
            }
        }
        private void Canvas_MouseMove(object sender, MouseEventArgs e)
        {
            if (gotcha != -1)
            {
                P[gotcha] = e.Location;
                Canvas.Invalidate();
            }
        }
        private void Canvas_MouseUp(object sender, MouseEventArgs e)
        {
            gotcha = -1;
        }

        private double B0(double t) { return (1 - t) * (1 - t) * (1 - t); }
        private double B1(double t) { return 3 * t * (1 - t) * (1 - t); }
        private double B2(double t) { return 3 * t * t * (1 - t); }
        private double B3(double t) { return t * t * t; }

        private void DrawBezier()
        {
            PointF t0, t1;
            double t = 0.0;
            double h = 1.0 / 500.0;
            t0 = new PointF((float)(B0(t) * P[0].X + B1(t) * P[1].X + B2(t) * P[2].X + B3(t) * P[3].X),
                            (float)(B0(t) * P[0].Y + B1(t) * P[1].Y + B2(t) * P[2].Y + B3(t) * P[3].Y));
            while (t < 1.0)
            {
                t += h;
                t1 = new PointF((float)(B0(t) * P[0].X + B1(t) * P[1].X + B2(t) * P[2].X + B3(t) * P[3].X),
                                (float)(B0(t) * P[0].Y + B1(t) * P[1].Y + B2(t) * P[2].Y + B3(t) * P[3].Y));
                g.DrawLine(pCurve, t0, t1);
                t0 = t1;
            }
        }
    }
}```

使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
名称空间12_CubicBezier
{
公共部分类Form1:Form
{
图形g;
int s=6;
int-gotcha=-1;
列表P=新列表();
钢笔点=钢笔。黑色;
Pen pTangent=Pens.黑色;
Pen pCurve=新笔(颜色:蓝色,3.0f);
刷点;
公共表格1()
{
初始化组件();
b点=新的SolidBrush(Canvas.BackColor);
}
私有void Canvas_Paint(对象发送器,PaintEventArgs e)
{
g=e.图形;
g、 SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
对于(int i=0;iif(Math.Abs(P[i].X-e.X)你的问题是什么?这回答了你的问题吗?让我进一步解释,我已经创建了具有4个控制点的贝塞尔曲线。现在的任务是再次创建具有4个控制点的另一条贝塞尔曲线,但这次是反向形状,并将当前贝塞尔曲线的最后一个控制点作为第一个控制点,并自行绘制意思是我不需要在picturebox上设置控制点。希望这很清楚,让我进一步解释一下,也许一张图片有助于理解“曲线反转”可能意味着什么。另外,千万不要在评论中给出你的解释:人们不是在问自己,而是在问每个可能回答你问题的人,所以更新你的pos然后回复说“我更新了帖子,提供了更多信息”或类似的信息。更重要的是:你有没有研究过“反转”在这种情况下的含义?听起来你只是在交换点,在这种情况下:这是一条完全相同的贝塞尔曲线。它们在坐标反转下是不变的。