Trong ứng dụng C# WinForms của tôi, tôi có một hình ảnh có 2 đường cong (Kết quả từ một phép đo điện áp/dòng). Trục X là điện áp và trục Y là dòng điện. Trục điện áp dao động từ -5 đến 5 nhưng trục hiện tại là một phạm vi nhỏ hơn nhiều dao động từ -10 uA đến 10 uA. Nhiệm vụ là để xem nếu đường cong thứ hai là trong vòng 10% của đường cong đầu tiên.Vẽ một phong bì xung quanh một đường cong
Để kiểm tra trực quan Tôi đang cố gắng vẽ một phong bì xung quanh đường cong đầu tiên (màu xanh lam). Đường cong chỉ là một mảng PointF
. Tại thời điểm này vì tôi không có ý tưởng làm thế nào để vẽ một phong bì chính xác xung quanh đường cong màu xanh, tôi chỉ vẽ hai đường cong khác là kết quả của điểm X của đường cong thực tế được cộng và trừ đi 10% của đường cong ban đầu. Tất nhiên đây là một cách tiếp cận xấu, nhưng ít nhất cho phần của đường cong mà là đáng chú ý theo chiều dọc, nó hoạt động. Nhưng ngay sau khi các đường cong trên mặt đứng của nó không, thủ thuật này không làm việc nữa, như bạn có thể nhìn thấy trong hình dưới đây:
Đây là mã mà tôi đang sử dụng để vẽ phong bì :
public Bitmap DrawEnvelope(double[,] pinData, float vLimit, float iLimit)
{
g = Graphics.FromImage(box);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
PointF[] u = new PointF[pinData.GetLength(0)]; //Up line
PointF[] d = new PointF[pinData.GetLength(0)]; //Down Line
List<PointF> joinedCurves = new List<PointF>();
float posX = xMaxValue * (vLimit/100);
float minX = posX * -1;
for (int i = 0; i < pinData.GetLength(0); i++)
{
u[i] = new PointF(400 * (1 + (((float)pinData[i, 0]) + minX)/(xMaxValue + vExpand)), 400 * (1 - ((float)pinData[i, 1] * GetInvers((yMaxValue + iExpand)))));
}
for (int i = 0; i < pinData.GetLength(0); i++)
{
d[i] = new PointF(400 * (1 + (((float)pinData[i, 0]) + posX)/(xMaxValue + vExpand)), 400 * (1 - ((float)pinData[i, 1] * GetInvers((yMaxValue + iExpand)))));
}
Pen pengraph = new Pen(Color.FromArgb(50, 0 ,0 ,200), 1F);
pengraph.Alignment = PenAlignment.Center;
joinedCurves.AddRange(u);
joinedCurves.AddRange(d.Reverse());
PointF[] fillPoints = joinedCurves.ToArray();
SolidBrush fillBrush = new SolidBrush(Color.FromArgb(40, 0, 0, 250));
FillMode newFillMode = FillMode.Alternate;
g.FillClosedCurve(fillBrush, fillPoints, newFillMode, 0);
g.Dispose();
return box;
}
các vòng tròn màu xanh lá cây được bổ sung bởi bản thân mình, và họ chỉ ra khu vực mà đường cong thứ hai (Red một) là có khả năng có một sự khác biệt lớn hơn 10% so với đường cong ban đầu.
Sẽ rất tuyệt nếu ai đó đưa tôi đi đúng hướng, tôi nên xem xét điều gì để đạt được phong bì đẹp quanh đường cong ban đầu?
CẬP NHẬT Bởi vì tôi đang rất Noob tôi không thể tìm thấy một cách để thực hiện các câu trả lời cho câu hỏi này cho đến bây giờ, Vì vậy, đặt một bounty để xem nếu somone vui lòng có thể cho tôi ít nhất một phương pháp mã hóa cho vấn đề này.
Phong bì có nghĩa là vùng + - 10% không? Nếu có, thì tôi nghĩ điều đầu tiên bạn cần là rõ ràng hơn về những gì thực sự có nghĩa là "trong vòng 10%". Hiện tại trong vòng 10% ở mỗi điện áp? Điện áp trong vòng 10% ở mỗi dòng? Một số điều khác? Nếu điều này xuất phát từ một bài tập ở trường/đại học, thì từ ngữ thực sự là gì? Nếu đó là điều bạn đang làm vì lý do kinh doanh, các yêu cầu cơ bản là gì? Một khi điều đó rõ ràng, nó có thể sẽ rõ ràng hơn những gì "phong bì" của bạn nên trông như thế nào. –
Bạn có thể không chỉ vẽ đường cong ban đầu của bạn một lần nữa, làm cho độ dày dòng rất lớn và độ mờ đục thấp? – Dan
@Tôi đã cố gắng tạo ra đường cong ban đầu với một chiếc bút lớn hơn về kích thước, nhưng đó là một ý tưởng tồi vì kết quả sẽ tồi tệ hơn những gì tôi đang làm bây giờ. –