這取決於你的鼠標移動的速度,有時MouseMove事件會更頻繁地觸發,有時不會。我認爲這也取決於你的機器在這個特定的系統中加載了多少。如果你在兩點之間畫線,它們不會彎曲,而是筆直。相反,你應該看看Beziers和Splines。這樣你就可以基於幾點得到曲線。
但是你可以用你的代碼做些什麼。每當最後一次mousedown和當前mousedown事件之間的距離大於一個閾值(您可以憑經驗獲得),可以在曲線上添加新的點。下面 是被加入一個點的例子的代碼:
public bool isMouseDown { get; set; }
Point lastPoint = Point.Empty;
public double treshold { get; set; }
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
pictureBox1.Capture = true; // I try to capture mouse here
Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle);
if (Math.Sqrt(Math.Pow(e.X - lastPoint.X, 2) + Math.Pow(e.Y - lastPoint.Y, 2)) > treshold)
{
g.FillRectangle(new SolidBrush(Color.Black), (e.X + lastPoint.X)/2, (e.Y + lastPoint.Y)/2, 1, 1);
}
g.FillRectangle(new SolidBrush(Color.Black), e.X, e.Y, 1, 1);
lastPoint = new Point(e.X, e.Y);
}
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
isMouseDown = true;
lastPoint = new Point(e.X, e.Y);
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
isMouseDown = false;
}
我知道我可以使用Bezier等多項式算法來做到這一點,但我不能說明這一點嗎?這不可能嗎? – abilash
@Vsevywniy根據我的經驗,你不能影響多少鼠標移動事件將被提出的速度。也沒有最小的距離,將觸發mousemove。因此你會得到中斷曲線。 –
當我在標準窗口中繪畫使用鉛筆工具繪製圖形編輯器時,我獲得了不間斷的曲線。這是否意味着它使用Bezier等多項式算法形成? – abilash