private void UpdateFuzzyMF(double notFuz) { //currentComplaint.MFnotFuzzy = new List<double>(); foreach (var fuz in currentComplaint.Fuzzy) { double res = 0; switch (fuz.Type) { case TypeMFuncEnum.GAUSS: fuz.GaussParam = DatabaseManager.Instance.GetGaussMFuncParams(fuz.GaussParam.ID); res = MFunc.GaussMF(notFuz, fuz.GaussParam.C, fuz.GaussParam.Sigma, fuz.Bound); break; case TypeMFuncEnum.TRIANGULARE: fuz.TrianglParam = DatabaseManager.Instance.GetTriangulareMFuncParams(fuz.TrianglParam.ID); res = MFunc.TriangularMF(notFuz, fuz.TrianglParam.A, fuz.TrianglParam.B, fuz.TrianglParam.C, fuz.Bound); break; case TypeMFuncEnum.TRAPEZOIDAL: fuz.TrapezParam = DatabaseManager.Instance.GetTrapezoidalMFuncParams(fuz.TrapezParam.ID); res = MFunc.TrapezoidalMF(notFuz, fuz.TrapezParam.A, fuz.TrapezParam.B, fuz.TrapezParam.C, fuz.TrapezParam.D, fuz.Bound); break; default: res = 0; break; } currentComplaint.MFnotFuzzy.Add(res); } }
public static void DrawTrianglPoints(Graphics area, int w, int h, string nameFuzzy, Color colorLine, double a, double b, double c, double Xbottom, double Xtop, BoundaryTypeEnum bound, bool trapez = false, int i = 0) { var yA = MFunc.TriangularMF(a, a, b, c, bound); var yB = MFunc.TriangularMF(b, a, b, c, bound); double yC; if (!trapez) { yC = MFunc.TriangularMF(c, a, b, c, bound); } else { yC = MFunc.TrapezoidalMF(c, a, b, c, c + 1, bound); } var pointA = ConvertToScreen(a, yA, w, h, Xbottom, Xtop); var pointB = ConvertToScreen(b, yB, w, h, Xbottom, Xtop); var pointC = ConvertToScreen(c, yC, w, h, Xbottom, Xtop); Pen pen = new Pen(Color.Black, 2); if (bound != BoundaryTypeEnum.LEFT) { area.DrawLine(pen, (float)(pointA.X - 2), (float)pointA.Y, (float)(pointA.X + 2), (float)pointA.Y); area.DrawLine(pen, (float)pointA.X, (float)pointA.Y - 2, (float)pointA.X, (float)(pointA.Y + 2)); } if ((!trapez) || (bound != BoundaryTypeEnum.LEFT)) { area.DrawLine(pen, (float)(pointB.X - 2), (float)pointB.Y, (float)(pointB.X + 2), (float)pointB.Y); area.DrawLine(pen, (float)pointB.X, (float)pointB.Y - 2, (float)pointB.X, (float)(pointB.Y + 2)); } if (bound != BoundaryTypeEnum.RIGHT) { area.DrawLine(pen, (float)(pointC.X - 2), (float)pointC.Y, (float)(pointC.X + 2), (float)pointC.Y); area.DrawLine(pen, (float)pointC.X, (float)pointC.Y - 2, (float)pointC.X, (float)(pointC.Y + 2)); } Pen pen_gray = new Pen(Color.Gray); pen_gray.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; var PointNullA = ConvertToScreen(a, -0.05, w, h, Xbottom, Xtop); if (bound != BoundaryTypeEnum.LEFT) { area.DrawLine(pen_gray, pointA.X, pointA.Y, PointNullA.X, PointNullA.Y); } var PointNullB = ConvertToScreen(b, -0.05, w, h, Xbottom, Xtop); if ((!trapez) || (bound != BoundaryTypeEnum.LEFT)) { area.DrawLine(pen_gray, pointB.X, pointB.Y, PointNullB.X, PointNullB.Y); } var PointNullC = ConvertToScreen(c, -0.05, w, h, Xbottom, Xtop); if (bound != BoundaryTypeEnum.RIGHT) { area.DrawLine(pen_gray, pointC.X, pointC.Y, PointNullC.X, PointNullC.Y); } // Create font and brush. Font drawFont = new Font("Arial", 10); SolidBrush drawBrush = new SolidBrush(Color.Blue); // Set format of string. StringFormat drawFormat = new StringFormat(); drawFormat.Alignment = StringAlignment.Center; drawFormat.LineAlignment = StringAlignment.Near; String txt = (a).ToString(); PointF drawPoint = new PointF(PointNullA.X, PointNullA.Y); if (bound != BoundaryTypeEnum.LEFT) { area.DrawString(txt, drawFont, drawBrush, drawPoint, drawFormat); } txt = (b).ToString(); drawPoint = new PointF(PointNullB.X, PointNullB.Y); if ((!trapez) || (bound != BoundaryTypeEnum.LEFT)) { area.DrawString(txt, drawFont, drawBrush, drawPoint, drawFormat); } txt = (c).ToString(); drawPoint = new PointF(PointNullC.X, PointNullC.Y); if (bound != BoundaryTypeEnum.RIGHT) { area.DrawString(txt, drawFont, drawBrush, drawPoint, drawFormat); } SolidBrush drawBrushName = new SolidBrush(colorLine); drawFormat.Alignment = StringAlignment.Center; drawFormat.LineAlignment = StringAlignment.Far; txt = nameFuzzy; Point PointNull; if (i % 2 == 0) { if (!trapez) { PointNull = ConvertToScreen(b, yB + 0.01, w, h, Xbottom, Xtop); } else { PointNull = ConvertToScreen((c - b) / 2 + b, yB + 0.01, w, h, Xbottom, Xtop); } } else { if (!trapez) { PointNull = ConvertToScreen(b, yB + 0.06, w, h, Xbottom, Xtop); } else { PointNull = ConvertToScreen((c - b) / 2 + b, yB + 0.06, w, h, Xbottom, Xtop); } } drawPoint = new PointF(PointNull.X, PointNull.Y); area.DrawString(txt, drawFont, drawBrushName, drawPoint, drawFormat); }
public static void DrawTrianglMF(Graphics area, int w, int h, Color color, double a, double b, double c, double Xbottom, double Xtop, BoundaryTypeEnum bound, QuantifierEnum quantEnum = QuantifierEnum.EMPTY) { Pen pen = new Pen(color, 2); //var w = panel.Width; //var h = panel.Height; var gx = 0.1f * w; var gw = 0.8f * w; var gy = 0.1f * h; var gh = 0.7f * h; var k = (Xtop - Xbottom) / gw; var nul = (float)(Xbottom / k); //float yBottom = (float)MFunc.TriangularMF(Xbottom, a, b, c, bound); //float yA = (float)MFunc.TriangularMF(a, a, b, c, bound); //float yB = (float)MFunc.TriangularMF(b, a, b, c, bound); //float yC = (float)MFunc.TriangularMF(c, a, b, c, bound); //float yTop = (float)MFunc.TriangularMF(Xtop, a, b, c, bound); float yBottom, yTop, yA, yB, yC; switch (quantEnum) { case QuantifierEnum.NOT: yBottom = 1.0f - (float)MFunc.TriangularMF(Xbottom, a, b, c, bound); yA = 1.0f - (float)MFunc.TriangularMF(a, a, b, c, bound); yB = 1.0f - (float)MFunc.TriangularMF(b, a, b, c, bound); yC = 1.0f - (float)MFunc.TriangularMF(c, a, b, c, bound); yTop = 1.0f - (float)MFunc.TriangularMF(Xtop, a, b, c, bound); break; case QuantifierEnum.VERY: yBottom = (float)Math.Pow(MFunc.TriangularMF(Xbottom, a, b, c, bound), 2); yA = (float)Math.Pow(MFunc.TriangularMF(a, a, b, c, bound), 2); yB = (float)Math.Pow(MFunc.TriangularMF(b, a, b, c, bound), 2); yC = (float)Math.Pow(MFunc.TriangularMF(c, a, b, c, bound), 2); yTop = (float)Math.Pow(MFunc.TriangularMF(Xtop, a, b, c, bound), 2); break; case QuantifierEnum.MORE_OR_LESS: yBottom = (float)Math.Sqrt(MFunc.TriangularMF(Xbottom, a, b, c, bound)); yA = (float)Math.Sqrt(MFunc.TriangularMF(a, a, b, c, bound)); yB = (float)Math.Sqrt(MFunc.TriangularMF(b, a, b, c, bound)); yC = (float)Math.Sqrt(MFunc.TriangularMF(c, a, b, c, bound)); yTop = (float)Math.Sqrt(MFunc.TriangularMF(Xtop, a, b, c, bound)); break; default: yBottom = (float)MFunc.TriangularMF(Xbottom, a, b, c, bound); yA = (float)MFunc.TriangularMF(a, a, b, c, bound); yB = (float)MFunc.TriangularMF(b, a, b, c, bound); yC = (float)MFunc.TriangularMF(c, a, b, c, bound); yTop = (float)MFunc.TriangularMF(Xtop, a, b, c, bound); break; } if (a >= Xbottom) { var bottom = (float)(Xbottom / k - nul + gx); var top = (float)(a / k - nul + gx); area.DrawLine(pen, bottom, gy + (1 - yBottom) * gh, top, gy + (1 - yA) * gh); } if (c <= Xtop) { var bottom = (float)(c / k - nul + gx); var top = (float)(Xtop / k - nul + gx); area.DrawLine(pen, bottom, gy + (1 - yC) * gh, top, gy + (1 - yTop) * gh); } area.DrawLine(pen, (float)(a / k - nul + gx), gy + (1 - yA) * gh, (float)(b / k - nul + gx), gy + (1 - yB) * gh); area.DrawLine(pen, (float)(b / k - nul + gx), gy + (1 - yB) * gh, (float)(c / k - nul + gx), gy + (1 - yC) * gh); }