C# 贝塞尔曲线逆
我是C#和一般编码的初学者。我写了三次贝塞尔曲线的算法,但现在我的下一个任务是对三次贝塞尔曲线求逆,这对我来说很难。它应该是这样的,在画了4个控制点之后,第三个控制点的直线应该继续,当我们在这条线上放置新的控制点时(连接控制点的直线),我们应该能够继续绘制贝塞尔曲线C# 贝塞尔曲线逆,c#,bezier,C#,Bezier,我是C#和一般编码的初学者。我写了三次贝塞尔曲线的算法,但现在我的下一个任务是对三次贝塞尔曲线求逆,这对我来说很难。它应该是这样的,在画了4个控制点之后,第三个控制点的直线应该继续,当我们在这条线上放置新的控制点时(连接控制点的直线),我们应该能够继续绘制贝塞尔曲线 using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System
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;i if(Math.Abs(P[i].X-e.X)你的问题是什么?这回答了你的问题吗?让我进一步解释,我已经创建了具有4个控制点的贝塞尔曲线。现在的任务是再次创建具有4个控制点的另一条贝塞尔曲线,但这次是反向形状,并将当前贝塞尔曲线的最后一个控制点作为第一个控制点,并自行绘制意思是我不需要在picturebox上设置控制点。希望这很清楚,让我进一步解释一下,也许一张图片有助于理解“曲线反转”可能意味着什么。另外,千万不要在评论中给出你的解释:人们不是在问自己,而是在问每个可能回答你问题的人,所以更新你的pos然后回复说“我更新了帖子,提供了更多信息”或类似的信息。更重要的是:你有没有研究过“反转”在这种情况下的含义?听起来你只是在交换点,在这种情况下:这是一条完全相同的贝塞尔曲线。它们在坐标反转下是不变的。