Chủ đề: Tìm hiểu đường Bézier, ứng dụng của đường Bézier, Vẽ đồ thị nhiệt độ thời gian ứng dụng đường Bézier trên C#
I. Đường cong Bézier là gì?Ứng dụng của đường cong Bézier.
II. Các đường cong Bézier.
Một đường cong Bézier được xác định bằng một tập hợp các điểm kiểm soát P0 đến Pn với n được gọi là bậc của nó. Điểm kiểm soát đầu và cuối là các điểm mút (điểm kết thúc) của đường cong, trong khi các điểm nằm giữa thường không nằm trên đường cong.
Vẽ đồ thị trực tiếp trên Form.
- Đường cong Bézier là một đường cong tham số thường được sử dụng trong đồ họa máy tính và một số lĩnh vực khác. Dạng tổng quát hóa của đường cong Bézier trong không gian nhiều chiều được gọi là mặt phẳng Bézier, trong đó tam giác Bézier là một trường hợp đặc biệt.
- Đường cong Bézier được công bố vào năm 1962 bởi kỹ sư người Pháp Pierre Bézier, người sử dụng nó để thiết kế thân ôtô. Nhưng việc nghiên cứu đường cong này thực tế đã được bắt đầu năm 1959 bởi nhà toán học Paul de Casteljau, ông sử dụng giải thuật De Casteljau để đánh giá các đường cong đó.
- Về mặt ứng dụng, đường cong Bézier thường được sử dụng trong đồ họa vector để mô hình hóa các đường cong mượt và những đường cong đó có thể phóng to hoặc thu nhỏ theo tỉ lệ không gian giới hạn. "Đường dẫn", một khái niệm sử dụng trong các chương trình xử lý ảnh, được tạo bằng cách liên kết các đường cong Bézier với nhau. Đường cong Bézier còn được sử dụng như là một công cụ để điều khiển sự chuyển động.
II. Các đường cong Bézier.
Một đường cong Bézier được xác định bằng một tập hợp các điểm kiểm soát P0 đến Pn với n được gọi là bậc của nó. Điểm kiểm soát đầu và cuối là các điểm mút (điểm kết thúc) của đường cong, trong khi các điểm nằm giữa thường không nằm trên đường cong.
- Đường cong Bézier tuyến tính bậc 1 (linear)
B(t) = P0 + t(P1 - P0) = (1 - t)P0 + tP1 t∈[0,1]
- Đường cong Bézier toàn phương hay bậc 2 (quadratic)
B(t) = (1 - t)[(1 - t)P0 + tP1] + t[(1 - t)P1 + tP2] t∈[0,1]
và có thể biếu diễn thành tập hợp các điểm tương ứng trong đường Bézier tuyến tính được tạo bởi 2 đường Bézier tuyến tính từ P0, P1 và P1, P2. Nói 1 cách khác ta có thể viết lại rằng:
B(t) = (1 - t2)P0 + 2(1 - t)tP1 + t2P2 t∈[0,1]
Đường cong này xuất phát từ P0, tiến đến P1 rồi chuyển hướng dần đến P2. Hay tiếp tuyến tại P0 và P2 cắt nhau tại P1. Điều này cũng dễ rút ra từ đạo hàm của đường cong Bézier:
B'(t) = 2(1 - t)(P1 - P0) + 2t(P2 - P1) t∈[0,1]
- Đường cong Bézier lập phương hay bậc 3 (cubic)
Phương trình đường cong Bézier bậc 3 có thể định nghĩa bằng cách kết hợp 2 đường cong Bézier bậc 2 với nhau, với phương trình đường cong Bézier bậc 2 là Bpi,pj,pk, trong đó pi,pj,pk là các điểm của đường cong đó.
B(t) = (1 - t)Bp0,p1,p2(t) + tBp1,p2,p3 t∈[0,1]
- Đường cong Bézier bậc cao.
III. Vẽ đồ thị nhiệt độ thời gian trên C#.
1. Công cụ lập trình.
- Ngôn ngữ C#.
- Công cụ Visual Studio 2015.
Vẽ đồ thị trực tiếp trên Form.
Tạo giao diện nhập trực tiếp trên Form.
3.Full Code.
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;
using System.Windows.Forms.DataVisualization.Charting;
namespace DrawChart1_Application_Bezier
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Cài đặt dữ liệu mẫu cho dataGridView1
dataGridView1.Rows.Add();
dataGridView1.Rows[0].HeaderCell.Value = "Năm 1";
dataGridView1.Rows[0].Cells[0].Value = 16;
dataGridView1.Rows[0].Cells[1].Value = 18;
dataGridView1.Rows[0].Cells[2].Value = 20;
dataGridView1.Rows[0].Cells[3].Value = 26;
dataGridView1.Rows[0].Cells[4].Value = 30;
dataGridView1.Rows[0].Cells[5].Value = 35;
dataGridView1.Rows[0].Cells[6].Value = 40;
dataGridView1.Rows[0].Cells[7].Value = 42;
dataGridView1.Rows[0].Cells[8].Value = 37;
dataGridView1.Rows[0].Cells[9].Value = 30;
dataGridView1.Rows[0].Cells[10].Value = 23;
dataGridView1.Rows[0].Cells[11].Value = 17;
dataGridView1.Rows.Add();
dataGridView1.Rows[1].HeaderCell.Value = "Năm 2";
dataGridView1.Rows[1].Cells[0].Value = null;
dataGridView1.Rows[1].Cells[1].Value = null;
dataGridView1.Rows[1].Cells[2].Value = null;
dataGridView1.Rows[1].Cells[3].Value = null;
dataGridView1.Rows[1].Cells[4].Value = null;
dataGridView1.Rows[1].Cells[5].Value = null;
dataGridView1.Rows[1].Cells[6].Value = null;
dataGridView1.Rows[1].Cells[7].Value = null;
dataGridView1.Rows[1].Cells[8].Value = null;
dataGridView1.Rows[1].Cells[9].Value = null;
dataGridView1.Rows[1].Cells[10].Value = null;
dataGridView1.Rows[1].Cells[11].Value = null;
}
private void Form1_Shown(object sender, EventArgs e)
{
dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[0];
dataGridView1_MouseClick(null, null);
chart1.Titles.Add("1234567890");
chart1.Titles[0].Text = "BIỂU ĐỒ THEO DÕI NHIỆT ĐỘ TRONG NĂM";
}
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
//Tìm và đặt giá trị MAX cho trục Y
int max = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].Value);
for (int i = 0; i < 12; i++)
if (max < Convert.ToInt32(dataGridView1.CurrentRow.Cells[i].Value))
max = Convert.ToInt32(dataGridView1.CurrentRow.Cells[i].Value);
if (chart1.ChartAreas[0].AxisY.Maximum < max) chart1.ChartAreas[0].AxisY.Maximum = max;
chart1.Series.Clear();
for (int n = 0; n < dataGridView1.Rows.Count; n++) //Duyệt từ dòng đầu tiên đến dòng cuối cùng của dataGridView1
{
if (dataGridView1.Rows[n].Selected) //Nếu dòng thứ n được chọn thì thêm series cho dòng đó
{
Series s = new Series();
for (int i = 0; i < 12; i++)
{
DataPoint p = new DataPoint();
p.XValue = i;
p.SetValueY(Convert.ToDouble(dataGridView1.Rows[n].Cells[i].Value));
p.AxisLabel = "Tháng " + (i + 1).ToString();
s.Points.Add(p);
}
chart1.Series.Add(s);
}
}
foreach (Control a in Form1.ActiveForm.Controls)
if (a.GetType().Name == "RadioButton")
if (((RadioButton)a).Checked)
{
rbSpline_Click(a, null);
}
foreach (Control b in Form1.ActiveForm.Controls)
if(b.GetType().Name == "RadioButton")
if(((RadioButton)b).Checked)
{
rbSplineArea_Click(b, null);
}
foreach (Control c in Form1.ActiveForm.Controls)
if (c.GetType().Name == "RadioButton")
if (((RadioButton)c).Checked)
{
rbLine_Click(c, null);
}
}
private void rbSpline_Click(object sender, EventArgs e)
{
chart1.Series[0].ChartType = SeriesChartType.Spline;
}
private void rbSplineArea_Click(object sender, EventArgs e)
{
chart1.Series[0].ChartType = SeriesChartType.SplineArea;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if(checkBox1.Checked)
{
chart1.ChartAreas[0].Area3DStyle.Enable3D = true;
}
else
{
chart1.ChartAreas[0].Area3DStyle.Enable3D = false;
}
}
private void rbLine_Click(object sender, EventArgs e)
{
chart1.Series[0].ChartType = SeriesChartType.Line;
}
}
}
IV. Hoàn thành.
- Chọn chế độ Line: chỉ nối các điểm với nhau bằng các đoạn thẳng.
- Chọn chế độ Spline: nối các điểm với nhau ứng dụng đường Bézier.
- Chọn chế độ SplineArea: để vẽ hình khối.
- Convert to 3D thì sẽ chuyển sang hình 3D (nhìn đẹp hơn nhưng có vẻ không hợp lý cho lắm, nếu xét nhiệt độ sôi của chất lỏng phụ thuộc vào các yếu tố sau: nhiệt độ, độ cao thì sẽ hợp lý hơn).
Cảm ơn các bạn đã theo dõi. Nếu có bất kỳ ý kiến gì xin hãy để lại bình luận bên dưới.
Không có nhận xét nào:
Đăng nhận xét