En mi aplicación C# WinForms tengo un cuadro de imagen que aloja 2 curvas (resultado de una medición de voltaje/corriente). El eje X es voltaje y el eje Y es actual. El eje de voltaje varía de -5 a 5, pero el eje actual es una escala mucho más pequeña que va de -10 uA a 10 uA. La tarea es ver si la segunda curva está dentro del 10% de la primera curva.Dibujar un sobre alrededor de una curva
Para la inspección visual, estoy tratando de dibujar un sobre alrededor de la primera curva (Azul uno). La curva es solo una matriz PointF
. Por el momento, dado que no tengo idea de cómo dibujar una envolvente correcta alrededor de la curva azul, simplemente dibujo otras dos curvas que son el resultado de X puntos de la curva real añadida y restados en un 10% de la curva original. Por supuesto, este es un mal enfoque, pero al menos para la sección de la curva que es notoriamente vertical, funciona. Pero tan pronto como la curva está en su sección no vertical, este truco ya no funciona, como se puede ver en la imagen siguiente:
Aquí está el código que estoy usando para sacar el sobre :
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;
}
los círculos verdes se añaden por mí mismo, y que indican la región que la segunda curva (una roja) es potencialmente tiene una diferencia más grande que 10% a partir de la curva original.
Sería bueno si alguien me pusiera en el camino correcto, ¿qué debo buscar para lograr un bonito sobre la curva original?
ACTUALIZACIÓN porque soy muy Noob no puedo encontrar una manera de poner en práctica las respuestas dadas a esta pregunta hasta ahora, para poner una recompensa para ver si somone amablemente me puede mostrar al menos un método de codificación para este problema.
es la envolvente destinado a ser el + - región de 10%? Si es así, entonces creo que lo primero que necesita es más precisión sobre lo que realmente significa "dentro del 10%". Corriente dentro de 10% en cada voltaje? Voltaje dentro del 10% en cada corriente? ¿Alguna otra cosa? Si esto proviene de una asignación de escuela/universidad, ¿cuál fue la redacción actual? Si es algo que está haciendo por razones comerciales, ¿cuáles son los requisitos subyacentes? Una vez que está claro, probablemente será mucho más claro cómo debería ser su "sobre". –
¿No puede trazar su curva original otra vez, hacer que el grosor de línea sea muy grande y la opacidad baja? – Dan
@Dan Ya he intentado hacer la curva original con un bolígrafo más grande, pero es una mala idea que el resultado sea peor que lo que estoy haciendo ahora. –